首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >包测试的串行执行

包测试的串行执行
EN

Stack Overflow用户
提问于 2013-03-30 17:15:26
回答 3查看 5.9K关注 0票数 26

我为一个web实现了几个包,每个包都有自己的测试用例。当使用go test ./api/pkgname测试每个包时,测试就会通过。如果我想使用go test ./api/...同时运行所有测试,那么测试用例总是失败的。

在每个测试用例中,我使用DROP SCHEMA public CASCADECREATE SCHEMA public重新创建整个模式,并应用所有迁移。测试套件随机地报告错误,表示不存在关系/表,因此我猜每个测试套件(每个包)都会以某种方式并行运行,从而扰乱DB状态。

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

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

更新:

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

代码语言:javascript
运行
复制
find <dir> -type d -exec go test {} \;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-03 18:40:57

正如其他人所指出的,-parallel不做这项工作(它只在包中工作)。但是,您可以使用标志-p=1以串联方式运行包测试。这里记录了这一点:

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

但是(afaict)没有在命令行,去帮助等。我不确定它是否意味着停留(虽然我认为如果它被删除,-parallel应该被修复)。

票数 38
EN

Stack Overflow用户

发布于 2013-03-31 20:22:24

提供go工具是为了使用*_test.go文件中包含单元测试的约定,使运行中的单元测试更容易。因为它假设它们是单位测试,所以它也假设它们是密封的。听起来你的测试不是单元测试,也不是单元测试,而是违反了单元测试应该实现的假设。

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

如果您想让这些测试成为集成测试,那么最好不要在这些测试中使用go工具。您可能想要的是创建一个独立的测试二进制文件,您可以在其中控制和编写集成测试脚本。

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

票数 9
EN

Stack Overflow用户

发布于 2013-10-02 10:05:57

为了澄清一下,杰里米的回答仍然是被接受的:

由于我的集成测试只在一个包(api)上运行,所以我最终删除了单独的测试二进制文件,并通过以下方法创建了一个模式来分离测试类型:

  • 单元测试使用普通的TestX名称。
  • 集成测试使用Test_X

我创建了shell脚本(utest.sh/itest.sh)来运行这两种脚本。

  • 用于单元测试go test -run="^(Test|Benchmark)[^_](.*)"
  • 用于集成测试go test -run"^(Test|Benchmark)_(.*)"
  • 使用普通go test运行这两种
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15721238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档