Покрытие и достижимый код

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);
  }
}
5
задан Rrr 16 April 2012 в 21:13
поделиться