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 来设置不同的状态来满足这一点,但这会给我留下 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 限制为仅测量单个方法的代码覆盖率?我意识到我可能完全误解了这个指标,所以请解释为什么会这样:)

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 回答