静态帮助程序类

IntelliTest 提供了一套静态帮助程序类,可供创作参数化单元测试时使用:

  • PexAssume:用于定义对输入的假设,并且对筛选不需要的输入非常有用
  • PexAssert:一个简单的断言类,可在测试框架未提供断言类时使用
  • PexChoose:IntelliTest 管理的一系列其他测试输入
  • PexObserve:记录具体值,并在生成的代码中对其进行验证(可选)

使用某些类可以与 IntelliTest 推理引擎进行低级别交互:

PexAssume

表示假设的静态类,例如参数化单元测试中的前置条件。 此类的方法可用于筛除不需要的测试输入。

如果假设的条件不适用于某些测试输入,则会引发 PexAssumeFailedException。 这将导致在无提示的情况下忽略该测试。

示例

以下参数化测试不会考虑 j = 0

public void TestSomething(int i, int j) {
     PexAssume.AreNotEqual(j, 0);
     int k = i/j;
     ...
}

备注

上述代码几乎等效于:

     if (j==0)
          return;

只是 PexAssume 失败时会导致无测试用例。 使用 if 语句时,IntelliTest 会生成一个单独的测试用例,使其包含 if 语句的 then 分支

PexAssume 还包含专用的嵌套类,用于对字符串、数组和集合进行假设。

PexAssert

表示断言的静态类,例如参数化单元测试中的后置条件

如果断言的条件不适用于某些测试输入,则会引发 PexAssertFailedException,这将导致测试失败

示例

以下断言中整数的绝对值为正:

public void TestSomething(int i) {
     int j = Maths.Abs(i);
     PexAssert.IsTrue(j >= 0);
     ...
}

PexChoose

向测试提供辅助输入值的静态类,可用于实现参数化模拟

PexChoose 类不可用于确定针对特定输入值的测试通过或失败。 PexChoose 只提供输入值,也称为“选择”。 仍由用户负责限制输入值,并写入定义测试何时通过或失败的断言。

操作模式

PexChoose 类可在两种模式下运行

  • IntelliTest 在输入生成期间对测试和经测试代码执行符号分析时,选择器会返回任意值,并且 IntelliTest 会跟踪每个值在测试和经测试代码中的使用方式。 IntelliTest 会生成相关值,以触发测试和经测试代码中的不同执行路径。

  • 针对特定测试用例生成的代码会通过某种方式设置选择提供程序,在重新执行此类测试用例时进行特定选择,以触发特定的执行路径。

使用情况

  • 简单调用 PexChoose.Value 生成新值
public int Foo() {
    return PexChoose.Value<int>("foo");
}

PexObserve

记录已命名值的静态类。

IntelliTest 浏览代码时,会通过 PexObserve 记录使用其格式化字符串表现形式的计算值。 该值与唯一名称相关联。

PexObserve.Value<string>("result", result);

示例

// product code
public static class MathEx {
     public static int Square(int value) { return value * value; }
}

// fixture
[TestClass]
public partial class MathExTests {
     [PexMethod]
     public int SquareTest(int a) {
        int result = MathEx.Square(a);
        // storing result
        return result;
     }
}

PexSymbolicValue

一个静态类,用于忽略对参数的约束,并打印与值关联的符号信息。

使用情况

通常情况下,IntelliTest 会在执行期间尝试涵盖代码的所有执行路径。 但是,它无法浏览所有可能的用例,尤其是在计算假设和断言条件时。

示例

此示例演示了如何实现 PexAssume.Arrays.ElementsAreNotNull 方法。 在方法中,忽略数组值长度的约束,以避免 IntelliTest 尝试生成不同的数组大小。 只在此处忽略该约束。 如果经测试代码对不同数组长度的处理方式不同,IntelliTest 无法根据对经测试代码的约束生成不同大小的数组。

public static void AreElementsNotNull<T>(T[] value)
    where T : class
{
    PexAssume.NotNull(value);
    // the followings prevents the exploration of all array lengths
    int len = PexSymbolicValue.Ignore<int>(value.Length);

    // building up a boolean value as follows prevents exploration
    // of all combinations of non-null (instead, there are just two cases)
    bool anyNull = false;
    for (int i = 0; i < len; ++i)
        anyNull |= value[i] == null;

    // was any element null?
    if (anyNull)
        PexAssume.Fail("some element of array is a null reference");
}

有反馈?

开发人员社区上发布想法和功能请求。