Покрытие и доступный код

Q: как определить реальный охват тестирования?

Я заметил одну проблему с метрикой покрытия кода и качеством теста: 100% охват кода не означает, что код действительно протестирован.

Иногда тест дает 100% -ый охват, даже если он не охватывает все. Проблема лежит в определении покрытия, мы предполагаем охват == доступный код.

Но это не так, код может быть на 100% доступным, но не на 100% покрытым тестом.

Взгляните на пример, этот тест дает 100% охват (EMMA), но на самом деле он не охватывает значения, которые будут переданы в сервисный макет. Таким образом, если значение будет изменено, тест не будет терпеть неудачу.

Пример:

public class User {
  public static final int INT_VALUE = 1;
  public static final boolean BOOLEAN_VALUE = false;
  public static final String STRING_VALUE = "";
  private Service service;

  public void setService(Service service) {
      this.service = service;
  }

  public String userMethod() {
      return service.doSomething(INT_VALUE, BOOLEAN_VALUE, STRING_VALUE);
  }
}

И протестируйте его:

public class UserTest {

  private User user;
  private Service easyMockNiceMock;

  @Before
  public void setUp() throws Exception {
      user = new User();
      easyMockNiceMock = EasyMock.createNiceMock(Service.class);
  }

  @Test
  public void nonCoverage() throws Exception {
      // given
      user.setService(easyMockNiceMock);
      expect(easyMockNiceMock.doSomething(anyInt(), anyBoolean(), (String) anyObject())).andReturn("");
      replay(easyMockNiceMock);
      // when
      user.userMethod();
      // then
      verify(easyMockNiceMock);
  }
}

Ответ 1

Посмотрите Jester, в котором выполняется тестирование на мутацию. На сайте:

Шут находит код, который не покрывается испытаниями. Шут делает некоторые изменить ваш код, запустить ваши тесты, и если тесты пройдут мимо Шут отображает сообщение о том, что он изменил. Шут включает scriptдля создания веб-страниц, которые показывают внесенные изменения, которые не вызывали тесты терпят неудачу.

Шут отличается от инструментов покрытия кода, потому что он может найти код который выполняется при запуске тестов, но фактически не протестирован. Шутский подход называется испытанием на мутацию или автоматической ошибкой Посев. Тем не менее, "Шут" не означает замену кода инструментов покрытия, просто как дополнительный подход.

Ответ 2

100% охват никогда не означал 100% опробованных, и любой, кто утверждал, что это сделал, либо не понимает, либо лжет вам. Измерение охвата просто измеряет, какой код продукта был выполнен во время тестирования. Существует множество способов написания тестов, которые обеспечивают 100% -ный охват, а затем не полностью проверяют ваш код.

Самый простой способ - написать тест, который вызывает функцию продукта, а затем никогда не делает никаких утверждений о возвращаемом значении!

Вот сообщение в блоге, которое я написал об этой самой теме: Недостатки в измерении охвата, он ориентирован на Python, но понятия все одинаковы.