【问题标题】:Three Unit tests pass when run separately, only one passes when run together三个单元测试单独运行时通过,一起运行时只有一个通过
【发布时间】:2016-12-08 03:10:00
【问题描述】:

我有三个测试,FunnyCarSteps.csCarLotMaxSteps.csCarTypeSteps.cs。单独运行时,它们都通过,但一起运行时,只有 CarLotMaxSteps 通过。

CarTypeSteps.cs 在第 49 行失败,出现 lambda method no source available 错误。 FunnyCarSteps.cs 在第 19 行失败,出现索引超出范围错误。

我是单元测试的新手,不明白发生了什么。

非常感谢任何帮助。

【问题讨论】:

  • 不看你的 Program() 类实现是不可能的。看来,您的实例之间有静态共享数据
  • 在您调用carLotMaxProgram.CarList.Clear();CarLotMaxSteps 类的GivenIHaveAFullCarlot 方法中。有什么理由吗?在测试开始时进行一些清理的必要性是测试之间的依赖关系的指示。
  • 这就是Atari先生的问题!谢谢。
  • Sergey 这是我在试验 SessionContext 变量时的产物。

标签: unit-testing nunit specflow


【解决方案1】:

由于Program.Mainstatic,您的CarList 可能也是静态的。 NUnit 并行运行测试,因此每个测试几乎同时运行,并且每个测试都在同时清除和添加列表。

这就是为什么您的测试单独运行良好,但一起运行时会失败。一个启动并开始测试,然后第二个出现并更改第一个测试正在使用的数据。

您需要从 Program 中除 main 之外的所有内容中删除静态。理想情况下,您应该将所有汽车列表代码重构为一个新的非静态类。程序是用来运行你的程序的,它不应该与汽车有任何关系。您应该在 Main 中创建 CarLot(或其他)类并执行它,而不是向 Program 添加属性。

另一种选择是将属性[Parallelizable(ParallelScope.None)] 添加到每个测试类。这将导致他们一次运行一个。这将解决您的测试问题,但它并不能解决您的代码不正确的事实,而不仅仅是一个简单的练习。

【讨论】:

  • 哇!你完全正确。我的程序中有以下静态类。 pastebin.com/pquTVmu4 我将它们从静态变量更改为实例变量,它们都开始成功运行。非常感谢普劳斯先生!
  • 一个叫做 GlobalVariables 的东西应该立即引起怀疑 ;)
  • 当然,NUnit 默认不会并行运行测试——你必须告诉它这样做。但是在任何情况下,共享静态都可能导致问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多