3

基本上,我在一个特定的包中创建了一个新的测试文件,其中包含一些基本的测试结构 - 没有实际的测试......只是一个嵌入 suite.Suite 的空结构类型,以及一个接收 *testing.T 对象并调用套件的函数.Run() 在所述结构上。这立即导致我们所有其他测试开始不确定地失败。

故障的性质与在单个 Postgres 数据库中插入和删除时的数据库唯一密钥完整性违规有关。这让我相信测试是同时运行的,而没有调用我们的设置方法来在测试之间正确准备环境。

不用说,当我将这个测试文件移动到另一个包时,一切都神奇地起作用了!

以前有没有其他人遇到过这个问题并且可以提供一些见解?

在此处输入图像描述

4

2 回答 2

3

事实证明,这是一个根植于go test工作原理的问题,与testify无关。我们的测试是在./...上运行的,正如justinas指出的那样,这导致下划线的 go 测试工具在每个包中并行运行测试。在深入了解 StackOverflow(此处此处)并阅读testify 关于此问题的活动问题后,似乎最好的直接解决方案是使用-p=1标志来限制要并行运行的包的数量。

但是,仍然无法解释为什么在添加这些新软件包之前测试始终通过。预感可能是包/测试文件被排序并以这样一种方式运行,即在添加新包/文件之前并发不是问题。

于 2014-11-04T00:28:08.840 回答
3

我从使用中发现,“go test”顺序运行单个包的测试用例(除非t.Parallel()被调用),但如果您提供多个包(go test ./foo ./bar ./baz),每个包的测试都与其他包并行运行。对我来说,数据库测试肯定会引起类似的头痛。

于 2014-11-01T11:23:39.863 回答