将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一起安装的'PEX API Reference'对解决这个问题很有用:

Microsoft.Pex.Framework.Coverage命名空间包括几个过滤器属性,这些属性可以排除影响代码覆盖的各个方面。我想要的是:

PexCoverageFilterMethodAttribute

使用这种方法,我能够从覆盖率报告中删除CreateSymbol方法:

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

现在我的代码覆盖率增加到13/15;比以前高,但仍然没有达到我预期的100%。长话短说,我发现PEX也在覆盖报告中包含构造函数…

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

我现在收到13/13为我的代码覆盖率。我是一只快乐的兔子:)