浏览边界

PexSettingsAttributeBase 是设置边界即特性的抽象基类。 请参阅设置瀑布图,大致了解 IntelliTest 中的设置。

使用该设置的命名属性及其派生特性可修改设置:

[PexClass(MaxRuns = 10)]
public partial class FooTest {...}

MaxConstraintSolverTime

约束求解器必须计算将导致使用一个新的其他执行路径的输入所需的秒数。 这是 PexSettingsAttributeBase 及其派生类型的一个选项。

IntelliTest 浏览程序的执行路径越深,IntelliTest 从程序的控制流和数据流生成的约束系统就会变得越复杂。 根据时间限制,可通过设置此值,让 IntelliTest 花费更多或更少的时间来发现新的执行路径。

通常情况下,超时的原因是 IntelliTest 尝试为不含解决方案的约束系统查找解决方案,但它并没有意识到没有解决方案这个事实。 由于这是最常见的超时情况,增加边界可能毫无意义。

MaxConstraintSolverMemory

约束求解器必须计算将导致使用一个新的其他执行路径的输入的大小 (MB)。 这是 PexSettingsAttributeBase* 及其派生类型的一个选项。

IntelliTest 浏览程序的执行路径越深,IntelliTest 从程序的控制流和数据流生成的约束系统就会变得越复杂。 根据计算机的可用内存,可通过设置此值,让 IntelliTest 处理更复杂的约束系统。

通常情况下,超时的原因是 IntelliTest 尝试为不含解决方案的约束系统查找解决方案,但它并没有意识到没有解决方案这个事实。 由于这是内存不足情况最常见的原因,增加边界可能毫无意义。

MaxBranches

可能沿单个执行路径使用的最大分支数。

此浏览边界背后的动机是限制输入生成期间 IntelliTest 浏览的任何执行路径的长度。 具体而言,如果程序进入无限循环,此功能可阻止 IntelliTest 变得无法响应。

执行和监视代码的每个条件和非条件分支均计入此限制,包括不依赖于参数化测试的输入的分支。

例如,以下代码按 0-100 使用分支:

for (int i=0; i<100; i++) { }

MaxCalls

可能在单个执行路径期间执行的最大调用数。

此浏览边界背后的动机是限制输入生成期间 IntelliTest 浏览的任何执行路径的长度。 具体而言,如果程序以递归方式调用某方法无限次,则会导致堆栈溢出并且 IntelliTest 无法恢复,此功能可防止 IntelliTest 变得无法响应。

执行和监视代码的每个调用(直接、间接、虚拟、跳转)均计入此限制。

MaxStack

单个执行路径期间任何时候的堆栈最大大小,以活动调用的帧数来衡量。

此浏览边界背后的动机是限制输入生成期间 IntelliTest 浏览的任何执行路径的堆栈大小。 具体而言,它会阻止 IntelliTest 使用所有可用的堆栈空间,否则会导致堆栈溢出并且 IntelliTest 无法恢复。

MaxConditions

单个执行路径期间可能检查输入的最大条件数。

此浏览边界背后的动机是限制输入生成期间 IntelliTest 浏览的任何执行路径的复杂性。 每个依赖于参数化测试的输入的条件分支均计入此限制。

例如,以下代码中的每个路径使用 n+1 个条件:

[PexMethod]
void ParameterizedTest(int n)
{
     for (int i=0; i<n; i++) { // conditions are "0<n", "1<n", ..., "!(n<n)"
          ...
     }
     for (int i=0; i<100; i++) { // irrelevant for MaxConditions, since conditions do not depend on input
          ...
     }
}

MaxRuns

IntelliTest 在探索测试期间将尝试的最大运行数。

此浏览边界背后的动机是包含循环或递归的任何代码可能具有无限数目的执行路径,因此需要在输入生成期间限制 IntelliTest。

MaxRuns 和 MaxRunsWithUniquePaths 这两个设置的关系如下所示:

  • IntelliTest 将使用不同的测试输入调用参数化测试方法最多 MaxRuns 次。
  • 如果执行代码是确定的,IntelliTest 每次将使用不同的执行路径。 但在某些情况下,执行代码可能会使用不同的输入沿用之前使用过的执行路径。
  • IntelliTest 计算找到的唯一执行路径数;此数目受 MaxRunsWithUniquePaths 选项限制。

MaxRunsWithoutNewTests

在不发出新测试的情况下连续运行的最大数目。

虽然 IntelliTest 通常可在短时间内找到许多有趣的测试输入,但一段时间后,它将找不到其他新的测试输入,并且不再发出单元测试。 此配置选项对在不发出新测试的情况下 IntelliTest 可能执行的连续尝试次数进行了限制。 达到限制即停止浏览。

MaxRunsWithUniquePaths

浏览期间,IntelliTest 将考虑使用的唯一路径最大数。

此浏览边界背后的动机是包含循环或递归的任何代码可能具有无限数目的执行路径,因此必须在输入生成期间限制 IntelliTest。

MaxRuns 和 MaxRunsWithUniquePaths 这两个设置的关系如下所示:

  • IntelliTest 将使用不同的测试输入调用参数化测试方法最多 MaxRuns 次。
  • 如果执行代码是确定的,IntelliTest 每次将使用不同的执行路径。 但在某些情况下,执行代码可能会使用不同的输入沿用之前使用过的执行路径。
  • IntelliTest 计算找到的唯一执行路径数;此数目受 MaxRunsWithUniquePaths 选项限制。

MaxExceptions

停止浏览前可能遇到的最大异常数。

此浏览边界背后的动机是停止浏览包含多个 bug 的代码。 如果 IntelliTest 在代码中找到太多错误,则停止浏览。

TestExcludePathBoundsExceeded

将忽略超过配置的路径边界 MaxCallsMaxBranchesMaxStackMaxConditions 的执行路径。

此浏览边界背后的动机是处理(大多数情况下)非终止测试。 IntelliTest 达到浏览边界(如MaxCallsMaxBranchesMaxStackMaxConditions)时,它会假定测试不是非终止进程,且之后不会导致堆栈溢出。 这种测试用例可能会给其他测试框架带来问题,但此特性会提供一种方法来阻止 IntelliTest 为可能的非终止进程发出测试用例或发出导致堆栈溢出的测试用例。

TestEmissionFilter

指示 IntelliTest 应发出的测试类型。 可能的值为:

  • 全部 - 对所有内容(包括假设冲突)发出测试。
  • FailuresAndIncreasedBranchHits(默认)- 对所有唯一故障发出测试,且每当测试用例按 TestEmissionBranchHits 的控制,增加覆盖率时发出测试。
  • FailuresAndUniquePaths - 对 IntelliTest 找到的所有故障以及导致唯一执行路径的每个测试输入发出测试。
  • 故障 - 仅对故障发出测试。

TestEmissionBranchHits

根据当前 TestEmissionFilter 设置,当 IntelliTest 涵盖之前程序中未涵盖的分支时发出新的测试用例。

TestEmissionBranchHits 设置确定 IntelliTest 是否应考虑完全涵盖某个分支,是测试涵盖一次,即 (TestEmissionBranchHits = 1),还是两次,即 (TestEmissionBranchHits = 2),依次类推。

TestEmissionBranchHits = 1 将产生非常小的测试套件,套件将涵盖 IntelliTest 可访问的所有分支。 具体而言,此测试套件还将涵盖它访问的所有基本块和语句。

此选项的默认值是 TestEmissionBranchHits = 2,这将生成更具表达意义的测试套件,也更适合检测将来的回归错误。

有反馈?

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