2014-05-16 45 views
2

这个问题是关于去语言测试。你可能知道大多数主流语言都有自己的xUnit框架。这些框架中的大多数都能够监听测试运行事件(例如,测试用例已启动,测试用例已完成,测试失败等)。这通常称为测试事件监听器,主要用于编写框架的第三方扩展。Go lang测试事件监听器?

我的问题:是否有任何类似的方式附加到标准的Go语言测试框架事件(http://golang.org/pkg/testing/)?

回答

1

不是开箱即用,但它不应该很难自我钻研。任何名为init的函数都保证在其他任何函数之前运行,这对测试也是如此。

在您的测试文件:

var listener pkg.EventListener 
func init() { 
    pkg.SetupMyFramework() 
    listener = pkg.Listener() 
} 
在任何测试

然后

func TestXxx(t *testing.T) { 
    listener.Dispatch(pkg.MakeEvent("TestXxx", pkg.TestStarted)) 

    err := DoSomething() 
    if err != nil { 
     listener.Dispatch(pkg.MakeEvent("TestXxx", pkg.TestFailed)) 
     t.Fatal("Test failed") 
    } 

    listener.Dispatch(pkg.MakeEvent("TestXxx", pkg.TestPassed)) 
} 

你可以,当然,这不过你想要的(使用渠道延伸,使得各地Fatal包装的功能,使这个不那么冗长等),但这是你如何整合它的要点。


编辑:我写了一个非常简单的包装上*testing.T和事件分派框架这里:https://github.com/Jragonmiris/testevents

这是完全未经测试(嘿嘿),但它应该是比较接近你想要什么。它旨在每个测试只需要一个或两个额外的方法调用来连接调度代码。

+0

它不会在测试逻辑中创建大量的复制粘贴吗?我正在寻找一个入口点,如JUnit RunListener http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html。 –

+1

@ vania-pooh你不会得到一个简单的解决方案,因为这样的东西只是没有集成到'go test'框架中。任何解决方案都需要一点额外的钩住你自己。 – LinearZoetrope

+0

没问题,但就我们实施测试报告而言,主要想法是确保为了使用此报告,任何人都应该在他的测试中进行最小数量的更改。 –

1

不是我所知道的。这将有助于了解你正在努力完成什么,以便你需要这种能力?

+0

«...主要用于编写框架的第三方扩展。»?如果有人打算为类固醇编写Go的单元测试软件包,这将是一个直截了当的问题。另一方面,如果有人写这样的框架,他们完全可以控制他们的测试用例的生命周期...... – kostix

+0

我们正在制作一份测试报告,并且首次尝试为Go实现数据收集适配器。主要思想是能够收集以下事件:测试套件启动,测试用例方法启动,测试套件完成等。 –