如何测试特定方法是否在main()函数中被调用?

huangapple go评论165阅读模式
英文:

How do I test that specific methods are being called in the main() function

问题

我想测试main()函数中是否调用了newrelic.NewConfignewrelic.NewApplication

import (
    "github.com/newrelic/go-agent"    
)

func main() {
    /* NewRelic配置 */
    newRelicConfig := newrelic.NewConfig("my-app-name", 
    os.Getenv("NEW_RELIC_LICENSE_KEY"))
    app, err := newrelic.NewApplication(newRelicConfig)

    // 其他代码

}

我应该将该代码移动到main包中的一个单独函数中吗,像这样:

func SetupNewRelicConfig() Application {
    newRelicConfig := newrelic.NewConfig("my-app-name", 
    os.Getenv("NEW_RELIC_LICENSE_KEY"))
    app, err := newrelic.NewApplication(newRelicConfig)

    if err != nil {
      log.Fatal(err)
    }

    return app
}

这样我就可以检查SetupNewRelicConfig是否被调用了。

测试这个的正确方法是什么?

英文:

I want to test whether newrelic.NewConfig and newrelic.NewApplication are being called in the main() function.

import (
	"github.com/newrelic/go-agent"	
)

func main() {
    /* NewRelic configuration */
    newRelicConfig := newrelic.NewConfig("my-app-name", 
    os.Getenv("NEW_RELIC_LICENSE_KEY"))
    app, err := newrelic.NewApplication(newRelicConfig)

    // followed by other code
}

Should I move that code into a separate function within the main package, like:

func SetupNewRelicConfig() Application {
    newRelicConfig := newrelic.NewConfig("my-app-name", 
    os.Getenv("NEW_RELIC_LICENSE_KEY"))
    app, err := newrelic.NewApplication(newRelicConfig)

    if err != nil {
      log.Fatal(err)
    }

    return app
}

This way I can just check if the SetupNewRelicConfig is called or not.

What is the right way to test this?

答案1

得分: 2

你希望通过自动化测试还是作为某种类型的运行时断言来测试这个功能?

假设你想将自动化测试添加到你的测试套件中:

你需要找到一种方法来模拟NewRelic包导出的函数。

一种非常简单的方法在这里描述了("Monkey Patching in Golang"):

https://husobee.github.io/golang/testing/unit-test/2015/06/08/golang-unit-testing.html

一种更全面的方法是将这些函数调用添加到一个可以被你的测试套件替换的结构体中。可以参考依赖注入的方式,如下所述:

https://medium.com/@zach_4342/dependency-injection-in-golang-e587c69478a8

最后,可以考虑使用一个模拟框架。我在stretchr的testify项目中使用过模拟功能,效果非常好。

英文:

Are you hoping to test this from an automated test, or as a runtime assertion of some type?

Assuming you're looking to add an automated test to your suite:

You need to find a way to mock the functions exported by the NewRelic package.

A very cheap way to do this is described here ("Monkey Patching in Golang"):

https://husobee.github.io/golang/testing/unit-test/2015/06/08/golang-unit-testing.html

A more comprehensive approach requires you to add these function calls to a struct that can be swapped by your test suite. See dependency injection, as described here:

https://medium.com/@zach_4342/dependency-injection-in-golang-e587c69478a8

Finally, look into using a mocking framework. I've had great luck with the mocking in stretchr's testify project.

huangapple
  • 本文由 发表于 2017年7月11日 23:22:06
  • 转载请务必保留本文链接:https://go.coder-hub.com/45038621.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定