【问题标题】:What's the life cycle of Unit Tests in C#C#中单元测试的生命周期是什么
【发布时间】:2014-08-20 13:42:42
【问题描述】:

在 Visual Studio (Ctrl+R, A) 中,在 C# 中完整的 MSTest 单元测试运行中的事件顺序是什么?

这是我目前的想法:

  • 1 - 运行[AssemblyInitialize]
  • 2 - 随机运行[ClassInitialize]
  • 3 - 运行课程[TestInitialize]
  • 4 - 从该类中随机运行 [TestMethod]
  • 5 - 运行课程[TestCleanup]
  • 对类中的每个 TestMethod 重复 3 到 5
  • 对每个测试类重复 2 到 5
  • 6 - 运行所有类 [ClassCleanup] 方法
  • 7 - 运行[AssemblyCleanup]

但我认为VS可能会一次初始化多个类,然后随机运行TestMethods。测试应该是跨类还是跨整个测试项目,甚至是整个解决方案?了解事件的确切顺序应该可以回答这些问题。

更新:

我做了一些测试,发现它确实是事件发生的顺序,除了#3 到 5,任何类的任何测试都可以运行。 Visual Studio 似乎一次按顺序运行一个测试。但是,由于接受的答案中解释的原因,不应依赖这一点。

【问题讨论】:

  • 是的,它绝对是 MSTest 框架,你读过ict.ken.be/unit-testing-with-mstest 吗?
  • 如果我没记错的话,你可以有测试用例排序属性,如果你想确保顺序是正确的。
  • 认真的吗?你能提供这个属性的名称吗?我只知道测试“Ordered Test”,file.orderedtest 你指定的顺序(msdn.microsoft.com/en-us/library/ms182630(v=vs.90).aspx
  • 是的,这是为 MSUnit 准备的,我已经更新了问题。
  • @DejanBogatinovski,可能不为人所知的是,为每个 TestMethod (related answer) 创建了一个新的类实例,因此构造函数将在每次测试之前运行。

标签: c# .net visual-studio unit-testing mstest


【解决方案1】:

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

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

【讨论】:

  • 这意味着如果我在测试中需要一个数据库,我不能在两个测试中使用同一个表,因为它们可以同时运行?假设我在表中添加一行然后计算它们,另一种测试方法可以修改同一个表并导致我的第一个测试失败!
  • 只有在您的测试设计不当时才会发生这种情况。首先,单元测试应该孤立地测试对象。使用真实的数据库作为后端使这成为一个集成测试。从 MSTest 的角度来看,这些测试应该保存在测试用例中,以确保它们的运行顺序。其次,MSTest 只能并行运行测试类。不是特定类别中的单独测试。如果两个类使用相同的特性,也许你应该考虑进一步解耦你的代码。
  • 所以两个测试类可以同时运行,对吧?
  • 可以,不会。只是不能保证它们不会,并且一些测试运行器(如 dotCover)会根据您的配置同时运行多个测试。
  • 哦,这让事情变得复杂了……我知道测试必须是自主的,但我不知道它们可以同时运行。这回答了我的问题,谢谢!
【解决方案2】:

要为您的测试定义特定顺序,请创建有序测试 (http://msdn.microsoft.com/en-us/library/ms182631.aspx) 或创建匹配文件并按照您希望的指定顺序为每个测试用例调用 mstest.exe (http://msdn.microsoft.com/en-us/library/ms182489(VS.80).aspx)

【讨论】:

    猜你喜欢
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多