繁体   English   中英

C# 测试 - [ClassInitialize] 是否保证仅在先前的测试完成后运行?

[英]C# Testing - Is [ClassInitialize] guaranteed to run only after previous tests are finished?

我正在使用来自Microsoft.VisualStudio.TestTools.UnitTesting. [ClassInitialize][ClassCleanup]标签。 MSTest 2.0

我有一个测试 class,测试要求我的应用程序处于与平常不同的模式。

我在 [ClassInitialize] 中打开模式,在[ClassInitialize] [ClassCleanup]关闭模式。

这是行不通的,因为我从对此答案的评论中了解到:不能保证[ClassCleanup]的执行发生在任何其他测试开始之前。 这很糟糕,因为在另一个 class 中,我进行了需要关闭该模式的测试。 该模式没有及时关闭并且它们失败了。

我可以单独为每个测试打开/关闭模式,但这是最后一个选项,因为它需要很多时间。

我可以将 class 移动到它自己的程序集,但我也不想这样做。

我通过在 class 的[ClassInitialize]中关闭需要它关闭的模式来修复它。

但我需要知道, [ClassInitialize] 是否与[ClassCleanup] [ClassInitialize]共享相同的不直观行为,或者它是否保证在任何先前的测试完成之前不运行? 这将使第一次测试失败。

最好的解决方案是以某种方式强制[ClassCleanup]在第一个测试 class 全部完成后立即运行,但这可能是不可能的。

据我目前所了解的,答案是肯定的。

您可以指望 [ClassInitialize] 不会在必要时运行得更快。 (与稍后运行的 [ClassCleanup] 相反)

但是,我的测试(当我运行所有测试时)不会在测试类之间来回跳转,我只能想象它会如何成功。 那么您真的不想以可能相互干扰的方式使用 [ClassCleanup] 和 [ClassInitialize](例如打开/关闭特殊模式)。

如果您的测试运行器确实在测试类之间跳跃,我会将敏感测试移动到不同的程序集并使用 [AssemblyCleanup] / [AssemblyInitialize]。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM