将PEX测试代码约束为单个方法
本文关键字:单个 方法 约束 代码 PEX 测试 | 更新日期: 2023-09-27 18:09:17
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来满足这一点,但是这将使我得到2个代码覆盖不完整的PUT,而不是1个代码覆盖完整的PUT。我意识到理论上两个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只度量单个方法的代码覆盖率?我意识到我可能完全误解了这个指标,所以如果是这样的话,请解释一下原因:)
随PEX一起安装的'PEX API Reference'对解决这个问题很有用:
Microsoft.Pex.Framework.Coverage命名空间包括几个过滤器属性,这些属性可以排除影响代码覆盖的各个方面。我想要的是:
PexCoverageFilterMethodAttribute
使用这种方法,我能够从覆盖率报告中删除CreateSymbol
方法:
[PexCoverageFilterMethod(PexCoverageDomain.UserOrTestCode, "CreateVariable")]
现在我的代码覆盖率增加到13/15;比以前高,但仍然没有达到我预期的100%。长话短说,我发现PEX也在覆盖报告中包含构造函数…
[PexCoverageFilterMethod(PexCoverageDomain.UserOrTestCode, "ctor")]
我现在收到13/13为我的代码覆盖率。我是一只快乐的兔子:)