Unit testing 真正的单元测试总是可以并行运行吗? 背景:

Unit testing 真正的单元测试总是可以并行运行吗? 背景:,unit-testing,go,tdd,Unit Testing,Go,Tdd,我正在使用go-test工具和提供的“testing”测试包编写大量go代码。我所做的大多数测试都是单元测试,在TDD规程中。这些被测试的“单元”永远不允许依赖于有状态外部性,如持久存储、网络跃点等,但通常在“构造函数/生成器”函数中接收这些外部性的伪内存实现(是的,我知道它们不是传统意义上的构造函数) 问题是: 长期以来,一直困扰我的是go-test工具总是以相同的确定顺序运行测试函数。在少数情况下,这允许在代码中隐藏竞争条件。找到这些bug的一种方法是设置-race标志。另一种可能是始终并行

我正在使用
go-test
工具和提供的
“testing”
测试包编写大量go代码。我所做的大多数测试都是单元测试,在TDD规程中。这些被测试的“单元”永远不允许依赖于有状态外部性,如持久存储、网络跃点等,但通常在“构造函数/生成器”函数中接收这些外部性的伪内存实现(是的,我知道它们不是传统意义上的构造函数)

问题是: 长期以来,一直困扰我的是
go-test
工具总是以相同的确定顺序运行测试函数。在少数情况下,这允许在代码中隐藏竞争条件。找到这些bug的一种方法是设置
-race
标志。另一种可能是始终并行运行单元测试

问题是:
是否曾经出现过这样的情况:独立单元测试不能或不应该总是并行运行(使用
-parallel
标志)?

并行
标志实际上是测试本身的一种方式(除了加速测试之外)。当以不确定的顺序运行时,如果发现一个测试随机中断,则表明一个错误的测试和它执行错误代码的频率一样高


Ruby的测试运行程序做了一些有趣的事情(Rspec和Minitest)——它们在每次运行时随机化测试顺序,但打印一个用于运行的整数种子。这允许在仍然确保没有测试依赖于隐式排序的情况下再现错误。我不知道有哪位Go测试运行人员会这样做,但那会非常有用。

单元测试应该是确定性的,这就是为什么
-parallel
是一个在需要时可以明确使用的选项。如果单元测试要失败,它应该每次都失败。在并行或以任何顺序运行部分代码时,您肯定应该测试错误行为,就像您测试任何其他错误情况一样,但这不属于大多数人对单元测试的定义。我同意,我希望我没有忽略任何明显的冲突情况。明显的冲突情况到底是什么?您可以编写可以并行运行的单元测试,也可以不编写。如果你想并行运行你的测试,这完全取决于你,但是大多数人不希望这成为默认情况,因为单元测试每次都应该执行完全相同的测试。银杏允许随机化。GoTransfer几乎也有这个特性。随机执行仍然不同于并行执行。