5

Q: 実際のテスト カバレッジを検出するにはどうすればよいですか?

コード カバレッジの測定基準とテストの品質に関する 1 つの問題に気付きました。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);
  }
}
4

2 に答える 2

4

ミューテーションテストを実行するJesterを見てください。サイトから:

Jesterは、テストでカバーされていないコードを見つけました。Jesterはコードに変更を加え、テストを実行します。テストに合格すると、Jesterは変更内容を示すメッセージを表示します。Jesterには、テストの失敗を引き起こさなかった変更を表示するWebページを生成するためのスクリプトが含まれています。

Jesterは、テストの実行によって実行されたが実際にはテストされていないコードを見つけることができるため、コードカバレッジツールとは異なります。Jesterのアプローチは、ミューテーションテストまたは自動エラーシードと呼ばれます。ただし、Jesterは、コードカバレッジツールの代わりとしてではなく、単に補完的なアプローチとして意図されています。

于 2012-04-12T18:59:20.653 に答える
2

100% のカバレッジは 100% のテストを意味するものではありません。カバレッジ測定は、テスト中にどの製品コードが実行されたかを測定するだけです。100% のカバレッジを生成するテストを作成し、コードを完全にテストしない方法は多数あります。

最も簡単な方法は、product 関数を呼び出すテストを作成し、戻り値についてアサーションを行わないことです。

これはまさにこのトピックについて書いたブログ投稿です: Flaws in Coverage Measurement、Python 中心ですが、概念はすべて同じです。

于 2012-04-13T16:25:26.933 に答える