26

我已经为 Web API 实现了几个包,每个包都有自己的测试用例。当使用测试通过测试每个包时go test ./api/pkgname。如果我想一次运行所有测试,go test ./api/...测试用例总是失败。

在每个测试用例中,我使用DROP SCHEMA public CASCADE后跟重新创建整个架构CREATE SCHEMA public并应用所有迁移。测试套件随机报告错误,说关系/表不存在,所以我猜每个测试套件(每个包)都以某种方式并行运行,从而弄乱了数据库状态。

我试图传递一些测试标志go test -cpu 1 -parallel 0 ./src/api/...,比如没有成功。

这里的问题可能是并行运行的测试,如果是,我该如何强制串行执行?

更新:

目前我使用这种解决方法来运行测试,但我仍然想知道是否有更好的解决方案

find <dir> -type d -exec go test {} \;
4

3 回答 3

38

正如其他人指出的那样, -parallel 不能完成这项工作(它只适用于包中)。但是,您可以使用标志 -p=1 来连续运行包测试。这记录在这里:

http://golang.org/src/cmd/go/testflag.go

但是(afaict)不在命令行上,去帮助等等。我不确定它是否会留下来(尽管我认为如果它被删除,-parallel 应该被修复。)

于 2013-10-03T18:40:57.203 回答
9

提供 go 工具是为了使用 *_test.go 文件中包含单元测试的约定来更轻松地运行单元测试。因为它假设它们是单元测试,所以它也假设它们是密封的。听起来您的测试要么不是单元测试,要么它们违反了单元测试应该满足的假设。

如果您的意思是这些测试是单元测试,那么您可能需要一个模拟数据库来进行单元测试。您的数据库的模拟(最好在内存中)将确保单元测试是封闭的,并且不会受到其他单元测试的干扰。

如果您的意思是这些测试是集成测试,您最好不要使用 go 工具进行这些测试。您可能想要的是创建一个单独的测试二进制文件,您可以控制其运行并在其中编写集成测试脚本。

好消息是在 Go 中创建一个 mock 非常容易。更改您的代码以使用您关心的数据库方法的接口,然后为测试目的编写该接口的内存实现并将其传递到您要测试的应用程序代码中。

于 2013-03-31T20:22:24.793 回答
3

澄清一下,@Jeremy 的回答仍然是公认的:

由于我的集成测试只在一个包api

  • 单元测试使用正常TestX名称
  • 集成测试使用Test_X

我创建了 shell 脚本 ( utest.sh/ itest.sh) 来运行其中的任何一个。

  • 对于单元测试go test -run="^(Test|Benchmark)[^_](.*)"
  • 用于集成测试go test -run"^(Test|Benchmark)_(.*)"
  • 使用正常运行两者go test
于 2013-10-02T10:05:57.637 回答