2017-07-05 28 views
0

我有一个测试软件包,用于测试一些依赖于读取配置的东西。我想运行的所有测试之前曾经读到过这样的配置,所以我试图用TestMain(m *testing.M)TestMain not run

main.go:

package tests 

import (
    ... 
) 

var logger = logging.MustGetLogger("tests") 

func TestMain(m *testing.M) { 
    logger.Info("Initializing test suite") 

    viper.SetConfigName("config") 
    viper.AddConfigPath("..\\..\\") 
    err := viper.ReadInConfig() 
    if err == nil { 
     os.Exit(m.Run()) 
    } else { 
     logger.Fatal("Could not read configuration") 
    } 
} 

和我在同一个目录(包),另一个文件用测试。

repository_test.go:

package tests 

import (
    ... 
) 

func TestCreation(t *testing.T) { 
    aa := myModule.CreateRepository() 
    assert.NotNil(t, aa) 
} 

我的问题是,由于配置不从文件中读取测试失败。当我尝试调试Gogland中的测试时,TestMain内部的断点未被命中。当我从命令行运行测试时,我看不到TestMain的任何打印输出。

有什么特别的我应该做,使其工作?从我在线阅读的内容中了解到,如果我定义了TestMain(m *testing.M),那么它将只运行一次包,这就是我应该编写任何安装或拆卸代码的地方。

+1

测试套件中的所有文件(包括定义'TestMain'的文件)必须以'* _test.go'结尾。重命名为例如'main_test.go' – putu

+0

@putu omg!那一定是吧。我现在觉得自己像个白痴。一旦我靠近我的电脑,就会检查! – Dina

+0

是的,事实确实如此。那么,至少现在我确信这永远不会再发生在我身上。 – Dina

回答

3

TestMain仅在测试文件中执行(后缀_test.go)。

将函数移到repository_test.go文件来解决这个问题。

0

确保运行配置设置为“运行时不打包文件”编辑配置... |去测试|你的配置名称,这应该工作。如果没有,请发布IDE运行的命令来执行测试。

+1

谢谢。我现在不在我的电脑旁边。我稍后再试。但是从命令行运行怎么样?我也需要这个在TeamCity上工作。在TeamCity上,我们使用'go test -v path/tests' – Dina

+0

这就是运行特定文件和Package(或Directory)之间的区别。在TeamCity中,除非手动指定所有文件,否则该路径看起来像一个目录/包。如果您指定该文件,Go将只在单个文件中运行测试功能。请让我知道配置更改是否有帮助。 – dlsniper

相关问题