为了账号安全,请及时绑定邮箱和手机立即绑定

所有测试的TestMain?

所有测试的TestMain?

Go
慕慕森 2022-10-17 19:41:36
我有一个相当大的项目,其中有许多集成测试散布在不同的包中。我正在使用构建标签来分隔单元、集成和 e2e 测试。在运行我的集成和 e2e 测试之前,我需要做一些设置,所以我将一个TestMain函数放在main_test.go根目录的一个文件中。这很简单://go:build integration || e2e// +build integration e2epackage testimport (  ...)func TestMain(m *testing.M) {  if err := setup(); err != nil {    os.Exit(1)  }  exitCode := m.Run()  if err := tearDown(); err != nil {    os.Exit(1)  }  os.Exit(exitCode)}func setup() error {  // setup stuff here...  return nil}func tearDown() error {  // tear down stuff here...  return nil}但是,当我运行测试时:$ go test -v --tags=integration ./...testing: warning: no tests to runPASS# all of my subdirectory tests now run and fail...我真的不想TestMain在每个需要它的包中写一个,并希望我可以在根目录中使用一个。您有什么可以建议的解决方案吗?谢谢。我能想到的唯一选择是在代码之外设置所有内容,然后运行集成测试。也许一些shell脚本会设置然后调用$ go test?
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

go test ./...命令在后台为每个包编译一个测试二进制文件并一个接一个地运行它们。cannot use -o flag with multiple packages如果您尝试指定输出,这也是您收到错误的原因。这就是主包中的代码不会影响子包的原因。

因此,使其工作的唯一方法是将所有设置逻辑放入某种“设置”包中,并从所有子包中调用共享代码(我知道还有很多工作)。


查看完整回答
反对 回复 2022-10-17
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

为了避免代码重复,我使用了一个函数来进行设置/拆卸并评估一个函数作为测试。


该函数应如下所示


func WithTestSetup(t *testing.T, testFunction func()) {

    // setup code


    testFunction()


    // teardown code

}

我使用该t *testing.T参数来报告设置或拆卸中的错误,但可以省略。


然后在您的测试中,您可以:


func TestFoo(t *testing.T) {

    WithTestSetup(

        t, func() {

            if err := Foo(); err != nil {

                t.Fatal(err)

            }

        },

    )

}

如果需要,只需调用WithTestSetup,对我来说看起来比在项目中添加一堆TestMains 更容易。


查看完整回答
反对 回复 2022-10-17
  • 2 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号