2011-09-22 54 views
0

PEX中的待測代碼是否可以限制爲單一方法?我知道你可以將它約束到程序集和類,但是成員呢?將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來設置不同的狀態來滿足這個要求,但是這會讓我得到2個PUT的代碼覆蓋不完整,而不是1個PUT,而且覆蓋範圍很廣。我理解在理論上 2 PUT將有100%的組合覆蓋率,但我需要100%的數字在練習,所以我可以正確設置CI。

因此,要在相同的PUT到達另一分支,我必須下面的代碼追加到2行以上:

symbolManager.CreateSymbol(symbolHint); // Ensure next call returns true. 
found = symbolManager.GetLastSymbol(symbolHint, out symbol); 
PexAssert.IsTrue(found); 

據推測爲GetLastSymbol方法的代碼覆蓋現在是100%,但是由於我已經介紹了另一種對待測類型的方法調用,代碼覆蓋率現在降至20/29

如何限制一個PUT來只測量單個方法的代碼覆蓋率?我意識到我可能完全誤解了這個指標,所以請解釋原因,如果是這樣的話:)

回答

0

其自帶安裝了PEX是有用的解決這個在「PEX API參考」:

的Microsoft.Pex .Framework.Coverage命名空間包含幾個過濾器屬性,可以排除影響代碼覆蓋率的各個方面。我愛的人是:

PexCoverageFilterMethodAttribute 

使用這種方法,我能夠從覆蓋報表中刪除CreateSymbol方法:

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

現在,這增加了我的代碼覆蓋13/15;比以前更高,但仍然不是我期待的100%。長話短說,我發現PEX被包括在覆蓋報告過於構造...

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

我現在接收13/13我的代碼覆蓋率。我是一個快樂的兔子:)