0

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を制約するにはどうすればよいですか?私はこの測定基準を完全に誤解している可能性があることを認識しているので、これが当てはまる場合はその理由を説明してください:)

4

1 に答える 1

0

PEX と共にインストールされる「PEX API リファレンス」は、これを解決するのに役立ちました。

Microsoft.Pex.Framework.Coverage 名前空間には、さまざまなファセットを除外してコード カバレッジに影響を与えることができるいくつかのフィルター属性が含まれています。私が欲しかったのは:

PexCoverageFilterMethodAttribute

このメソッドを使用してCreateSymbol、カバレッジ レポートからメソッドを削除することができました。

[PexCoverageFilterMethod(PexCoverageDomain.UserOrTestCode, "CreateVariable")]

これにより、コード カバレッジが13/15に増加しました。以前よりは高くなりましたが、まだ期待していた 100% には達していません。簡単に言えば、PEXがカバレッジレポートにもコンストラクターを含めていることを発見しました...

[PexCoverageFilterMethod(PexCoverageDomain.UserOrTestCode, "ctor")]

現在、コード カバレッジで13/13を受け取っています。私はハッピーバニーです:)

于 2011-09-23T13:49:05.623 に答える