C#中单元测试的生命周期是什么?

8
在Visual Studio(Ctrl+R,A)中运行C#单元测试的完整运行事件序列是什么?
以下是我目前了解的:
1- 运行 2- 随机运行 3- 运行类 4- 从该类随机运行 5- 运行类的 6- 对于类中的每个TestMethod重复步骤3到5 7- 对于每个测试类重复步骤2至5 8- 运行所有类的方法 9- 运行 但是我认为VS可能会一次初始化多个类,然后随机运行TestMethods。测试应该是在其类或整个测试项目,甚至整个解决方案中自主进行的吗?了解事件序列的确切顺序应该回答这些问题。
更新:
我进行了一些测试,并发现它确实是事件发生的顺序,除了3至5,其中任何类中的任何测试都可以运行。 Visual Studio似乎一次逐个运行一个测试。但不应依赖此功能,原因在接受的答案中有解释。

是的,肯定是MSTest框架,你有读过https://ict.ken.be/unit-testing-with-mstest吗? - Dejan Dakić
是的,这是针对MSUnit的,我已经更新了问题。 - Jerther
Jerther,你在问题中编写的规则是正确的。但是这取决于测试运行程序,例如:vstest.console不能保证会调用TestCleanup,同样适用于AssemblyCleanup。nCrunch也有类似的规则。不过你可以编写自己的运行程序... :) - Dejan Dakić
我想知道Test类的构造函数何时运行?也就是说,Test类何时被实例化?每个单元测试之前是否创建该类的新实例,还是为该类的所有单元测试创建一个新实例? - Dejan Bogatinovski
1
@DejanBogatinovski,也许不是众所周知的是,每个TestMethod都创建了该类的新实例(相关答案),因此在每个测试运行之前都会运行构造函数。 - crokusek
显示剩余6条评论
2个回答

3

你说得对。这确实是代码运行的顺序。但是,由于测试应该是完全独立的,因此不能保证它们按顺序运行,并且不能保证它们在单个线程上运行。框架可以同时运行多个测试。

如果需要,您可以通过使用测试用例来强制执行特定的测试顺序,但是这被认为是不好的做法,因为测试用例应该用于将测试重新组合在一起(标记它们)。


这意味着如果我需要在我的测试中使用数据库,我不能在两个测试中使用相同的表,因为它们可能同时运行。比如说,我在一个表中添加了一行并对其进行计数,另一个测试方法可能会修改同一个表并导致我的第一个测试失败! - Jerther
只有当你的测试设计得很糟糕时才会发生这种情况。首先,单元测试应该独立地测试对象。使用真实数据库作为后端将使其成为集成测试。这些测试应该保持在MSTest的测试用例中,以确保它们的运行顺序。其次,MSTest只能并行运行测试类,而不能运行特定类中的单个测试。如果两个类使用相同的功能,也许你应该考虑进一步解耦你的代码。 - Etienne Maheu
那么两个测试类可以并且将会同时运行,对吗? - Jerther
1
可能会发生,而不是一定会发生。并不能保证它们不会同时运行多个测试,有些测试运行器(如dotCover)会根据您的配置同时运行多个测试。 - Etienne Maheu
1
哦,这让事情变得复杂了...我知道测试必须是自主的,但我不知道它们可以同时运行。这回答了我的问题,谢谢! - Jerther
就像我说的,如果你真的需要按特定顺序运行测试,你总是可以使用测试用例来实现。主要缺点是它们存储在单独的文件中,你只能在测试用例中添加测试,而不能添加整个类或程序集。因此,如果你添加了一个新的测试,你需要记得将其添加到测试用例中。所以...如果可能的话,最好通过架构来解决这些情况。 - Etienne Maheu

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接