哪个设计更糟糕:在测试之间共享数据,还是每个测试有多个断言?

Which is worse design: sharing data between tests, or multiple asserts per test?

假设我正在测试我的代码,并且我设计了 5 个函数来处理 5 个不同的事情。数据 function_a() returns 被传递到 function_b()... 一直到 function_e()。见下文。

var1 = function_a()
var2 = function_b(var1)
...
var5 = function_e(var4)

因此,所有这些功能都相当相互依赖并依赖于前一个功能的数据。

如何正确测试它?单个测试中的五个断言对我来说似乎有点代码味道,但根据公认的答案 here 在单独的测试之间传递数据(我认为这在这里是必要的)有点代码味道。

One assertion per test 只是一个 推荐 (虽然相当合理)并且与在每个单元测试中一次测试一件事有关。在这里,您有多个功能 - 更大 "system" 的多个组件。

理想情况下,您需要单独测试这些功能中的每一个,并进行一组集成测试检查它是如何工作的如果您遍历完整的函数链。

从测试的角度来看,数据从一个函数传递到下一个函数这一事实是无关紧要的。在测试 function_a 时,您只是断言它 return 是预期值(大概基于某些状态)。因此,您将知道预期的 return 值是多少。

单独测试 function_b 时,您可以将您期望从 function_a 编辑的值传递给它,并验证它 return 的期望值.您还可以测试当您传递无效值时会发生什么(这在使用 function_a.

的实际 return 值进行测试时会很困难

其他功能也一样。您应该将测试拆分并单独测试。按顺序调用的事实对每个函数单独没有影响。他们不知道他们的输入来自哪里