Go:如何为多个包运行测试?

Gal*_*aim 13 unit-testing go mgo

我在src /下的子目录下有多个包,运行每个包的测试go test工作正常.

当尝试运行所有测试时go test ./...,测试正在运行,但它失败了..

测试针对本地数据库服务器运行,每个测试文件都有包含数据库指针的全局变量.

我试图运行测试-parallel 1以防止数据库中的争用,但测试仍然失败.

这可能是什么问题?

编辑:有些测试在缺少数据库条目时失败,我在每次测试之前和之后都完全清除了数据库.我能想到为什么会发生这种情况的唯一原因是因为测试之间存在一些争用.

编辑2:

我的每个测试文件都有2个全局变量(使用mgo):

var session *mgo.Session
var db *mgo.Database
Run Code Online (Sandbox Code Playgroud)

它还具有以下设置和拆卸功能:

func setUp() {
   s, err := cfg.GetDBSession()
   if err != nil {
       panic(err)
   }

   session = s

   db = cfg.GetDB(session)

   db.DropDatabase()
}

func tearDown() {
   db.DropDatabase()

   session.Close()
}
Run Code Online (Sandbox Code Playgroud)

每个测试用setUp()和启动defer tearDown()

cfg也是:

package cfg

import (
    "labix.org/v2/mgo"
)

func GetDBSession() (*mgo.Session, error) {
    session, err := mgo.Dial("localhost")

    return session, err
}

func GetDB(session *mgo.Session) *mgo.Database {
    return session.DB("test_db")
}
Run Code Online (Sandbox Code Playgroud)

编辑3:

我更改了cfg以使用随机数据库,测试通过了.似乎多个软件包的测试有点并行运行.

是否可以强制go test在包中顺序运行所有内容?

Her*_*aaf 19

更新:正如@Gal Ben-Haim所指出的那样,添加(未记录的)go test -p 1标志会构建并测试所有的串行包.正如Go源代码中的testflag用法消息所示:

-p = n:并行构建和测试最多n个包

老答案:

在运行时go test ./...,不同包的测试实际上是并行运行的,即使你设置了parallel=1(只保证在特定包中的测试一次运行一个).如果重要的是按顺序测试软件包,比如涉及数据库设置/拆卸时,似乎现在唯一的方法是使用shell模拟行为go test ./...,并强制测试软件包一.

例如,像这样的东西在Bash中起作用:

find . -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test
Run Code Online (Sandbox Code Playgroud)

该命令首先列出包含*.go文件的所有子目录.然后它用于sort -u仅列出每个子目录一次(删除重复项).最后,包含go文件的所有子目录都被送到go testvia xargs.在-P1表示至多一个命令是在一个时间运行.

不幸的是,这比运行更加丑陋go test ./...,但是如果将它放入shell脚本或别名为更令人难忘的函数,它可能是可以接受的:

function gotest(){   find $1 -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test; }
Run Code Online (Sandbox Code Playgroud)

现在可以通过调用以下命令在当前目录中运行所有测试:

gotest .
Run Code Online (Sandbox Code Playgroud)


Gal*_*aim 11

显然运行go test -p 1按顺序运行所有内容(包括构建),我没有在go help test或中看到这个参数go help testflag