Testing 将revel测试组织到子包中

Testing 将revel测试组织到子包中,testing,go,revel,Testing,Go,Revel,我们目前正在进行一个revel项目,测试的数量已经失控。我想在tests目录下创建几个包,将控制器测试与模型测试分开,等等(例如tests/controllers/,tests/models/,等等) 当我执行此操作时,revel test命令将停止查看这些文件 我在网上找到了一个建议,用..跟踪我的测试命令,但是当我这样做时,我得到一个错误,说它无法导入我的项目 这是可能的,还是所有测试文件都必须在tests目录中?如果可能,如何在子包中运行测试?您可以将测试本身移动到可导入的包中(即不在\u

我们目前正在进行一个revel项目,测试的数量已经失控。我想在
tests
目录下创建几个包,将控制器测试与模型测试分开,等等(例如
tests/controllers/
tests/models/
,等等)

当我执行此操作时,revel test命令将停止查看这些文件

我在网上找到了一个建议,用
..
跟踪我的测试命令,但是当我这样做时,我得到一个错误,说它无法导入我的项目


这是可能的,还是所有测试文件都必须在
tests
目录中?如果可能,如何在子包中运行测试?

您可以将测试本身移动到可导入的包中(即不在
\u test.go
文件中),然后使用它们两次。子目录中的
\u test.go
文件可能类似于:

package subdir_test

import "github.com/blah/project/parent/subdir/tests"

func TestPackage(t *testing.T) {
    tests.Run(t)
}
使用您可以使
go-test
命令行参数发挥作用:

package tests // subdir

import "testing"

func Run(t *testing.T) {
    for _, test := range testCases { // or whatever
        test.Run(t)
    }
}
当然,父目录可以调用其子目录的
Run
方法:

package parent_test

import (
    "testing"
    p "github.com/blah/project/parent/tests"
    s "github.com/blah/project/parent/subdir/tests"
)

func TestPackage(t *testing.T) {
    p.Run(t)
}

func TestSubPackages(t *testing.T) {
    s.Run(t)
}

我建议避免使用
go list./…
等的变体,因为很多工具并没有准备好优雅地处理它(例如,在覆盖范围内运行该工具不会生成单个组合报告,这会使大型项目的工作复杂化,而且它还列出了可能并不总是有意义的供应商代码)

您可以将测试本身移动到可导入的包中(即不在
\u test.go
文件中),然后使用它们两次。子目录中的
\u test.go
文件可能类似于:

package subdir_test

import "github.com/blah/project/parent/subdir/tests"

func TestPackage(t *testing.T) {
    tests.Run(t)
}
使用您可以使
go-test
命令行参数发挥作用:

package tests // subdir

import "testing"

func Run(t *testing.T) {
    for _, test := range testCases { // or whatever
        test.Run(t)
    }
}
当然,父目录可以调用其子目录的
Run
方法:

package parent_test

import (
    "testing"
    p "github.com/blah/project/parent/tests"
    s "github.com/blah/project/parent/subdir/tests"
)

func TestPackage(t *testing.T) {
    p.Run(t)
}

func TestSubPackages(t *testing.T) {
    s.Run(t)
}

我建议避免使用
go list./…
等的变体,因为很多工具并没有准备好优雅地处理它(例如,在覆盖范围内运行该工具不会生成单个组合报告,这会使大型项目的工作复杂化,而且它还列出了可能并不总是有意义的供应商代码)

单元测试必须在同一个包中,这意味着同一个目录。你只能从一个单独的目录进行黑盒测试。这就是我担心的,谢谢你提供的信息。单元测试必须在同一个包中,也就是说在同一个目录中。你只能从一个单独的目录进行黑盒测试。这就是我担心的,谢谢你提供的信息。这在revel中是如何工作的。现在所有的测试都附加到AppTest,例如
func(t*AppTest)TestMethodName(){}
。对不起,我以为你的意思是通过命令行上的
go test
运行(这就是
工作的地方,我想
revel
cli也支持它?)。如果你只使用revel风格的测试,它会以非标准的方式运行,因此你基本上必须实例化并调用它的方法,但同样的逻辑适用-测试只是函数,你可以让它们相互重用。请在
AppTest
中初始化嵌入的
TestSuite
,然后调用
AppTest
上的方法,很明显,如果您能调整上述代码以适应它,我运行它时会得到循环导入或未定义的“AppTest”。好的,我的示例只是想说明,即使代码不在测试文件中,您也可以调用表现为测试的代码,因此这取决于您如何构造代码。。。Revel本身使用名称来调用各个测试方法。您可以使用此方法从其他测试调用测试。但我的建议是更一般的:构造测试代码,以便您可以任意调用它,而不是试图通过某种机制调用它,这种机制是一个黑盒子(
GoTest
或revel)。revel内部如何工作。现在所有的测试都附加到AppTest,例如
func(t*AppTest)TestMethodName(){}
。对不起,我以为你的意思是通过命令行上的
go test
运行(这就是
工作的地方,我想
revel
cli也支持它?)。如果你只使用revel风格的测试,它会以非标准的方式运行,因此你基本上必须实例化并调用它的方法,但同样的逻辑适用-测试只是函数,你可以让它们相互重用。请在
AppTest
中初始化嵌入的
TestSuite
,然后调用
AppTest
上的方法,很明显,如果您能调整上述代码以适应它,我运行它时会得到循环导入或未定义的“AppTest”。好的,我的示例只是想说明,即使代码不在测试文件中,您也可以调用表现为测试的代码,因此这取决于您如何构造代码。。。Revel本身使用名称来调用各个测试方法。您可以使用此方法从其他测试调用测试。但我的建议是更一般的:构造测试代码,以便您可以任意调用它,而不是试图通过某种黑箱机制(
gotest
或revel)调用它