【问题标题】:How to define dependency between tests in MStest如何在 MStest 中定义测试之间的依赖关系
【发布时间】:2011-03-02 12:28:02
【问题描述】:

我有一些测试取决于某些测试的成功和失败。在使用 VS2010 Mstest 和 selenium 时如何定义依赖关系。 例如

如果 test1 失败,那么不要运行 test5,test 6。这可能吗?

【问题讨论】:

  • 我喜欢 MbUnit/Gallio 允许我编写一个依赖于另一个测试的测试。我也喜欢我可以写 Assert.IsGreaterThan(1, 2) 而不仅仅是 IsTrue(1 > 2)。只是感觉好多了。

标签: visual-studio-2010 testing automation selenium mstest


【解决方案1】:

单元测试应该始终是独立的,完全不依赖于其他东西来运行,而不是变得不脆弱。

您可以使用 MSTest 设置类别,将它们分成不同的逻辑结构。

这本http://artofunittesting.com是一本可以找到更多细节的好书

Roy 还做了很多公开演讲,这些演讲都是在线录制的

干杯

【讨论】:

  • 我有一个在后台运行的处理器,它通常每 3 分钟检查一次......并在注册表格后更改状态。我必须先检查 status = abc 然后运行 ​​3,4,5 测试否则不要。
  • @Sam - 你想在测试中断言什么?处理器工作正常吗?如果是这样,那么您的测试应该(1)创建测试数据; (2) 初始化处理器; (3)在测试数据上同步调用处理器代码; (4) 断言数据具有正确的状态。如果您的测试需要注册表单,而处理器位只是为了让表单进入正确的状态以开始测试,那么您可以 (1) 创建一个处于正确状态的模拟表单 - 并消除对完全处理器; (2) 履行职能; (3) 断言成功/失败。
【解决方案2】:

测试之间不应有依赖关系。

如果您有依赖项,那么以不同的顺序运行它们或单独运行它们会导致它们偶尔失败 - 这对于运行测试的其他任何人来说可能会非常混乱。

最好定义测试来设置自己的数据并断言特定的东西。您可以使用类似Rhino Mocks 的模拟框架通过伪造(模拟)与您的测试无关的区域来减少代码模块之间的依赖关系。如果您还使用像 Microsoft Unity 这样的 dependency injection 框架,这会变得更容易,因为您的代码将有更多可以应用模拟的接缝。

【讨论】:

  • VS 单元测试基础架构可用于创建自动化集成测试。如果能够将测试之间的依赖关系定义为方法属性并让 VS 找出正确的执行顺序,那就太好了。创建有序测试就像在 C++ 中创建有序构建。它们需要额外的维护,而且很容易损坏。
  • 这对于单元测试是正确的,但与集成测试无关单元测试应该测试独立的功能。如果测试执行相同的代码,我们说测试具有依赖关系。因此,如果一个通用代码被破坏,它将破坏许多测试而不是一个测试。这通常表明被测功能没有正确解耦,或者单元测试没有使用模拟进行适当的隔离。
  • 集成测试为每个测试运行相同基础架构的大部分。根据定义,它们不能是独立的。假设您有三层架构:数据访问、配置和业务逻辑。如果数据访问层被破坏,它将破坏配置和业务逻辑层中的大部分测试。在这种情况下执行它们是没有意义的。
  • 告诉配置层中的测试依赖于数据访问层中的特定测试非常有用。如果数据访问层测试失败,它不应该执行依赖测试,因为这会浪费机器时间(集成测试很慢),无论如何它们都会失败。它还将简化诊断。您将能够查看由于该错误而真正损坏的测试,而无需滚动数百页并列出所有受影响的测试。
  • @Dennis - 啊哈,我同意你的观点。如果堆栈中较低的测试失败,我没有从不需要运行的集成测试的角度考虑它。这很有意义。您所说的指的是“逻辑”依赖项。我曾假设(可能是错误地)OP 引用了“有状态”依赖项 - test1 成功完成并让数据库处于正确的状态以便 test2 开始,但是如果 test1 失败,那么数据库将处于奇怪的状态,所以 test2会失败...有状态的依赖会导致糟糕的测试代码——不可读、不可信、不可维护。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 2017-10-26
相关资源
最近更新 更多