在非主程序包中运行类似主程序的

时间:2018-09-13 19:21:32

标签: testing go main

我们提供了包含大量复杂测试的软件包。作为测试套件的一部分,它们可以在构建等上运行。

 func TestFunc(t *testing.T) {
    //lots of setup stuff and defining success conditions
    result := SystemModel.Run()
 }

现在,对于这些测试之一,我想介绍一些前端,这使我可以调试一些东西。它实际上不是测试,而是调试工具。为此,我只想运行相同的测试,但要使用Builder模式:

 func TestFuncWithFrontend(t *testing.T) {
    //lots of setup stuff and defining success conditions
    result := SystemModel.Run().WithHTTPFrontend(":9999")
 }

然后,只有当我从前端通过HTTP发送信号时,测试才会开始。基本上WithHTTPFrontend()只是在前端的HTTP调用中等待一个通道。

这当然会使自动化测试失败,因为将不会发送任何此类信号并且执行将挂起。

我不能仅将软件包重命名为main,因为该软件包有15个文件,它们在系统的其他位置使用。

同样,我还没有找到一种仅按需运行测试的方法,同时又将其从测试套件中排除,因此TestFuncWithFrontend仅从命令行运行-我不在乎是否使用{{1 }}或go run等。

我也想到过go test,但是测试产生了太多的输出,它是无用的,而且如果没有定义ExampleTestFunc(),示例将无法运行。

不幸的是,测试需要在(私有,即小写)程序包级别上有很多初始化代码。因此,我不能只创建一个子包Output: ...,因为很多东西将无法访问。

看来我有三个选择:

  1. 使用大写字母导出所有这些初始化变量和代码,以便可以从子主程序包中使用它

  2. 复制整个代码。

  3. 将测试移至子包main中,然后使用main进行Frontend测试,使用func main()进行常规测试,这必须导入父包中的一些内容。

我想避免第二个选择……第一个选择更好,但是恕我直言也不好。我想我会第三名,但是...

我还缺少其他选择吗?

1 个答案:

答案 0 :(得分:1)

我终于找到了可以接受的选择。答案

Skip some tests with go test

带我走了正确的路。

本质上使用正常构建中不存在的构建标记,但是我可以在手动执行时提供这些构建标记。