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个值中的一个:
found = symbolManager.GetLastSymbol(symbolHint, out symbol);
PexAssert.IsFalse(found);
要实现此PUT的完全覆盖,我需要更改对象的状态,以便方法命中两个分支。我可以通过使用单独的PUT使用工厂方法来设置不同的状态来满足这一要求,但是这将使我有2个PUT具有不完整的代码覆盖,而不是1 PUT具有完全覆盖。我在理论上认识到 2个PUT的综合覆盖率为100%,但我需要在实践中100%计算 所以我可以正确设置CI。
因此,为了到达同一个PUT中的另一个分支,我必须将以下代码附加到上面两行:
symbolManager.CreateSymbol(symbolHint); // Ensure next call returns true.
found = symbolManager.GetLastSymbol(symbolHint, out symbol);
PexAssert.IsTrue(found);
大概GetLastSymbol
方法的代码覆盖率现在是100%,但因为我已经对被测试类型引入了另一个方法调用,所以代码覆盖率现在降至 20/29
如何限制PUT仅测量单个方法的代码覆盖率?我意识到我可能完全误解了这个指标,所以请解释为什么会出现这种情况:)
答案 0 :(得分:0)
随PEX一起安装的'PEX API Reference'对解决这个问题非常有用:
Microsoft.Pex.Framework.Coverage名称空间包含多个过滤器属性,这些属性可以排除影响代码覆盖率的各个方面。我想要的是:
PexCoverageFilterMethodAttribute
使用此方法,我可以从覆盖率报告中删除CreateSymbol
方法:
[PexCoverageFilterMethod(PexCoverageDomain.UserOrTestCode, "CreateVariable")]
现在我的代码覆盖率增加到 13/15 ;比以前更高,但仍然不是我期待的100%。长话短说,我发现PEX也在封面报告中包含了构造函数......
[PexCoverageFilterMethod(PexCoverageDomain.UserOrTestCode, "ctor")]
我正在接收 13/13 以获取我的代码覆盖率。我是一个快乐的兔子:)。