如何:在指定的时段过后强制测试停止运行
可以设置执行某个测试或测试运行时将要遵守的时间限制。 例如,如果您是在一个测试实验室里工作,并且需要在一天的某个时候完成测试运行,这种情况下就可能需要设置时间限制。
时间限制的另一应用场合是非响应性代码。 如果某个测试遇到了一段不进行响应的代码,则测试超时和测试运行超时设置会让这个测试完成,以便测试运行可以继续执行后续的测试。
有两种方法设置时间限制:
Setting Time-Out period for All Tests: 设置超时值,用于测试和测试运行中测试设置。 有关测试设置的更多信息,请参见指定 Visual Studio 测试的测试设置。
Override the Per-Test Time-Out Value on Individual test: 可以覆盖每个测试的超时值设置单个测试的属性。 不能重写测试运行的超时值。
不能为特定的测试类型设置测试超时值。 测试超时值不应用于手动测试,但测试运行超时设置始终会起作用,即使测试运行中包含手动测试也是如此。
为测试和测试运行设置时间限制具有以下这些效果:
当测试运行的持续时间达到其超时值时,即使测试运行中的某些测试还没有运行,也会中止测试运行。
当个别测试的持续时间达到其超时值时,将停止执行该测试,并将其标记为**“超时”**。 测试运行将继续执行后续的测试。
初始化方法影响测试超时的方式
测试运行包括 AssemblyInitializeAttribute 方法和 ClassInitializeAttribute 方法。 如果对这些方法进行了定义,则将用有限的时间去完成,然后启动测试运行中的第一个测试。
初始化方法所用的时间将计入第一个测试所用的时间。 我们可以将它表达为一个使用以下这些术语的公式:
Dt = 总持续时间
Dr = 测试运行的时间
I = 程序集和类的初始化方法
Tn = 测试运行中在随意位置运行的测试
T1 = 测试运行中第一个运行的测试
下面的说明适用于第一个测试之后的所有测试:
Dt**[Tn] = Dr[Tn]**
但是,请注意以下情况:
Dt**[T1] = Dr[T1] + D[I]**
第一个运行的测试可能会分配有一个针对每个测试的超时值。 在这种情况下,由于初始化时间会计入对第一个测试施加的时间限制,因此会导致测试失败。
备注
此限制可能只会导致第一个测试失败,而不会影响测试运行中后续的测试。
如果您的测试运行包括初始化方法,则可以采用以下方法来避开此限制:对每个测试都应用一个大于测试方法和任意初始化方法的预计执行时间之和的超时值。 必须为每个测试都执行此操作。 因为单元测试不能保证测试运行的顺序,您无法预测哪个测试将第一个运行。
清理方法影响测试运行超时值的方式
测试运行包括 AssemblyCleanupAttribute 方法和 ClassCleanupAttribute 方法。 这些方法完成之后,测试运行结束。
测试运行可能会分配有一个超时值。 清理方法所用的时间将计入测试运行所用的总时间。 换言之,清理时间将计入对整个测试运行施加的时间限制,因此可能导致测试运行超时。
设置对所有测试的超时时间
若要设置测试运行超时使用测试设置文件的所有测试
打开“解决方案资源管理器”。
在解决方案的“解决方案项”文件夹中,双击测试设置文件。
将显示**“配置设置”**对话框。
选择测试超时。
选中**“在总执行时间超过以下值时中止测试运行:”**。
按照小时、分钟和秒的格式设置测试运行超时值。
选择保存 ,然后选择 关闭。
若要使此设置生效,您所编辑的测试设置必须是活动的测试设置。 有关更多信息,请参见如何:通过 Microsoft Visual Studio 选择活动测试设置。
重写上单独测试每测试超时值
通过单元测试的特性设置每个测试的超时值
打开单元测试的源代码文件。
定位测试的 TestMethod 特性。
添加 Timeout 特性和表示相应超时值的参数。
超时值以毫秒表示。
在 Visual C# 中的示例:
[TestMethod(), Timeout(80)] public void MyTestMethod() { // test code }
在 Microsoft Visual Basic 中的示例:
<TestMethod(), Timeout(80)> _ Public Sub MyTestMethod() ' test code End Sub
仅对于此测试而言,您设置的值将重写在测试设置中设置的每个测试的超时值。 测试运行超时值不受影响。