如何:为运行测试设置时间限制
更新:2007 年 11 月
可以设置执行某个测试或测试运行时将要遵守的时间限制。例如,如果您是在一个测试实验室里工作,并且需要在一天的某个时候完成测试运行,这种情况下就可能需要设置时间限制。
时间限制的另一应用场合是非响应性代码。如果某个测试遇到了一段不进行响应的代码,则测试超时和测试运行超时设置会让这个测试完成,以便测试运行可以继续执行后续的测试。
有两种方法设置时间限制:
在测试运行配置中设置各个测试和测试运行的超时值。有关测试运行配置的更多信息,请参见如何:指定测试运行配置和如何:应用测试运行配置。与所有运行配置设置一样,只要相应的运行配置处于活动状态,那么无论您何时运行测试,超时设置都会起作用。
可以通过对单个测试设置某个属性来重写每个测试的超时值。不能重写测试运行的超时值。
不能为特定的测试类型设置测试超时值。测试超时值不应用于手动测试,但测试运行超时设置始终会起作用,即使测试运行中包含手动测试也是如此。
为测试和测试运行设置时间限制具有以下这些效果:
当测试运行的持续时间达到其超时值时,即使测试运行中的某些测试还没有运行,也会中止测试运行。
当个别测试的持续时间达到其超时值时,将停止执行该测试,并将其标记为“超时”。测试运行将继续执行后续的测试。
初始化方法影响测试超时的方式
测试运行包括 AssemblyInitializeAttribute 方法和 ClassInitializeAttribute 方法。如果对这些方法进行了定义,则将用有限的时间去完成,然后启动测试运行中的第一个测试。
初始化方法所用的时间将计入第一个测试所用的时间。我们可以将它表达为一个使用以下这些术语的公式:
Dt = 总持续时间
Dr = 测试运行的时间
I = 程序集和类的初始化方法
Tn = 测试运行中在随意位置运行的测试
T1 = 测试运行中第一个运行的测试
下面的说明适用于第一个测试之后的所有测试:
Dt[Tn] = Dr[Tn]
但是,请注意以下情况:
Dt[T1] = Dr[T1] + D[I]
第一个运行的测试可能会分配有一个针对每个测试的超时值。在这种情况下,由于初始化时间会计入对第一个测试施加的时间限制,因此会导致测试失败。
说明: |
---|
此限制可能只会导致第一个测试失败,而不会影响测试运行中后续的测试。 |
如果您的测试运行包括初始化方法,则可以采用以下方法来避开此限制:对每个测试都应用一个大于测试方法和任意初始化方法的预计执行时间之和的超时值。必须为每个测试都执行此操作。因为单元测试不能保证测试运行的顺序,您无法预测哪个测试将第一个运行。
清理方法影响测试运行超时值的方式
测试运行包括 AssemblyCleanupAttribute 方法和 ClassCleanupAttribute 方法。这些方法完成之后,测试运行结束。
测试运行可能会分配有一个超时值。清理方法所用的时间将计入测试运行所用的总时间。换言之,清理时间将计入对整个测试运行施加的时间限制,因此可能导致测试运行超时。
设置测试运行超时值
打开“解决方案资源管理器”。
在解决方案的“解决方案项”文件夹中,双击测试运行配置文件。
将打开“测试运行配置”对话框。
单击“测试超时”。
选中“在总执行时间超过以下值时中止测试运行:”。
按照小时、分钟和秒的格式设置测试运行超时值。
单击“保存”,然后单击“关闭”。
若要使此设置生效,您所编辑的测试运行配置必须是活动的运行配置。有关更多信息,请参见如何:应用测试运行配置。
使用测试运行配置设置每个测试的超时值
打开“解决方案资源管理器”。
在解决方案的“解决方案项”文件夹中,双击测试运行配置文件。
将打开“测试运行配置”对话框。
单击“测试超时”。
选中“在单个测试的执行时间超过以下值时将该测试标记为失败:”。
按照小时、分钟和秒的格式设置每个测试的超时值。
单击“保存”,然后单击“关闭”。
若要使此设置生效,您所编辑的测试运行配置必须是活动的运行配置。有关更多信息,请参见如何:应用测试运行配置。
使用测试属性设置每个测试的超时值
打开“测试列表编辑器”或“测试视图”窗口。
单击相应的测试并按 F4。
将打开“属性”窗口,并在其中显示该测试的属性。
对于“超时”属性,按小时、分钟和秒的格式设置值。
说明: 手动测试的超时值为“无限”。此值无法更改。
仅就这个测试而言,您设置的值将重写在测试运行配置中设置的每个测试的超时值。测试运行超时值不受影响。
通过单元测试的属性设置每个测试的超时值
打开单元测试的源代码文件。
定位测试的 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
仅就这个测试而言,您设置的值将重写在测试运行配置中设置的每个测试的超时值。测试运行超时值不受影响。