PEXのテスト対象コードを単一のメソッドに制限できますか?アセンブリとクラスに制限できることは承知していますが、メンバーについてはどうでしょうか。
私は基本的に、次の方法で100%のコードカバレッジを達成しようとしています。
public virtual bool GetLastSymbol(string symbolHint, out string symbol)
{
if (symbolHint == null)
{
throw new ArgumentNullException("symbolHint");
}
IEnumerable<string> symbols;
symbol = this.VariableHints.TryGetValue(symbolHint, out symbols) ? symbols.Last() : null;
return symbol != null;
}
次のPUTは、12/15のコードカバレッジを達成します。これは、返される可能性のある2つの値のうちの1つのみをテストしているためです。
found = symbolManager.GetLastSymbol(symbolHint, out symbol);
PexAssert.IsFalse(found);
このPUTを完全にカバーするには、メソッドが両方のブランチにヒットするようにオブジェクトの状態を変更する必要があります。ファクトリメソッドを使用して個別のPUTを使用してさまざまな状態を設定することでこれを満たすことができますが、これにより、完全なカバレッジの1つのPUTではなく、不完全なコードカバレッジの2つのPUTが残ります。理論的には、2つのPUTの合計カバレッジは100%になると思いますが、 CIを適切に設定できるように、実際にはその100%の数値が必要です。
したがって、同じPUT内の他のブランチに到達するには、上記の2行に次のコードを追加する必要があります。
symbolManager.CreateSymbol(symbolHint); // Ensure next call returns true.
found = symbolManager.GetLastSymbol(symbolHint, out symbol);
PexAssert.IsTrue(found);
おそらく、GetLastSymbol
メソッドのコードカバレッジは100%になりましたが、テスト対象の型に別のメソッド呼び出しを導入したため、コードカバレッジは20/29に低下します。
単一のメソッドのコードカバレッジのみを測定するようにPUTを制約するにはどうすればよいですか?私はこの測定基準を完全に誤解している可能性があることを認識しているので、これが当てはまる場合はその理由を説明してください:)