基本上我在特定包中创建了一个新的测试文件,其中包含一些准系统测试结构 - 没有实际测试...只是一个嵌入了suite.Suite的空结构类型,以及一个接受* testing.T对象的函数在所述结构上调用suite.Run()。这立即导致我们所有其他测试开始以不确定的方式失败。
故障的性质与插入和删除到单个Postgres DB中的数据库唯一密钥完整性违规有关。这让我相信测试是在没有调用我们的设置方法的情况下同时运行,以便在测试之间正确地准备环境。
毋庸置疑,当我将这个测试文件移动到另一个包时,一切都神奇地起作用了!
之前是否有其他人遇到此问题,可能会提供一些见解?
答案 0 :(得分:2)
我从使用中发现的是,“go test”按顺序运行单个包的测试用例(除非调用t.Parallel()
),但如果提供多个包(go test ./foo ./bar ./baz
),每个包的测试都与其他包并行运行。对我来说,绝对会引起类似的数据库测试。
答案 1 :(得分:0)
事实证明,这是一个根据 go test 工作原理的问题,与见证无关。我们的测试是在。/ ... 上运行的。这会导致下划线测试工具并行运行每个包中的测试,正如 justinas 指出的那样。在StackOverflow(here和here)上阅读更多内容并阅读testify's active issue on this problem之后,最好的直接解决方案似乎是使用 -p = 1 用于限制并行运行的包数的标志。
然而,在添加这些新包之前,为什么测试始终如一,仍然无法解释。预感可能是包/测试文件的排序和运行方式,以至于在添加新包/文件之前并发不是问题。