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。我从理论上意识到 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 限制为仅测量单个方法的代码覆盖率?我意识到我可能完全误解了这个指标,所以请解释为什么会这样:)