Unit testing 如何使用Go中的测试包进行测试设置

Unit testing 如何使用Go中的测试包进行测试设置,unit-testing,go,Unit Testing,Go,如何进行整体测试设置处理,在使用时为所有测试设置阶段 例如,Nunit中有一个[SetUp]属性 [TestFixture] public class SuccessTests { [SetUp] public void Init() { /* Load test data */ } } 这可以通过将init()函数放入myfile\u test.go文件中来实现。这将在init()函数之前运行 // myfile_test.go package main func init() {

如何进行整体测试设置处理,在使用时为所有测试设置阶段

例如,Nunit中有一个
[SetUp]
属性

[TestFixture]
public class SuccessTests
{
  [SetUp] public void Init()
  { /* Load test data */ }
}

这可以通过将
init()
函数放入
myfile\u test.go
文件中来实现。这将在
init()
函数之前运行

// myfile_test.go
package main

func init() {
     /* load test data */
}

myfile_test.init()将在包init()函数之前被调用。

Go测试框架没有任何与NUnit等效的东西(在套件中的每个测试之前标记要调用的函数)。不过有几个选择:

// myfile_test.go
package main

func init() {
     /* load test data */
}
  • 只需在需要的每个测试中调用
    设置
    函数即可

  • 使用一个扩展来实现xUnit范例和概念的Go测试框架。我想到了三个强有力的选择:


  • 每个库都鼓励您将测试组织到与其他xUnit框架类似的套件/装置中,并在每个
    Test*
    方法之前调用套件/装置类型上的setup方法。

    通常,go中的测试不是以与其他语言相同的样式编写的。通常,测试函数相对较少,但每个函数都包含一组表驱动的测试用例。看

    对于表驱动测试,您只需在执行表中指定的各个测试用例的循环之前放置任何设置代码,然后放置任何清理代码

    如果测试函数之间仍然有共享的设置代码,则可以将共享的设置代码提取到函数中,并使用
    sync.onect
    ,如果必须只执行一次(或者如另一个答案所示,使用
    init()
    ,但这有一个缺点,即即使测试用例没有运行,也会进行设置(可能是因为您通过使用
    go test-run
    限制了测试用例)


    我想说的是,如果你认为你需要在不同的测试之间共享设置,而这些测试只执行一次,那么你应该考虑一下你是否真的需要它,如果表驱动测试不会更好。

    从Go 1.4开始,你可以实现设置/拆卸(无需在每次测试之前/之后复制你的函数).主要部分概述了文件:

    TestMain在主goroutine中运行,可以执行任何设置和操作 在调用m.Run时需要进行拆卸。然后它应该调用 使用m.Run的结果退出操作系统

    我花了一些时间才明白,这意味着如果测试包含函数
    func TestMain(m*testing.m)
    ,则将调用此函数而不是运行测试。在该函数中,我可以定义测试的运行方式。例如,我可以实现全局设置和拆卸:

    还有几个其他的例子

    TestMain特性在最新版本中添加到Go的测试框架中 这个版本是几个测试用例的简单解决方案 提供一个全局钩子来执行设置和关闭,控制 测试环境,在子进程中运行不同的代码,或检查 用于测试代码泄漏的资源。大多数包不需要 TestMain,但在需要时,它是一个受欢迎的添加 需要


    给出一个简单的单元测试函数:

    package math
    
    func Sum(a, b int) int {
        return a + b
    }
    
    您可以使用返回teardown函数的setup函数对其进行测试。在调用setup()之后,您可以对teardown()进行延迟调用

    Go测试工具将在shell控制台中报告日志记录语句:

    % go test -v
    === RUN   TestAddition
    === RUN   TestAddition/add
    === RUN   TestAddition/minus
    === RUN   TestAddition/zero
    --- PASS: TestAddition (0.00s)
        math_test.go:6: setup test case
        --- PASS: TestAddition/add (0.00s)
            math_test.go:13: setup sub test
            math_test.go:15: teardown sub test
        --- PASS: TestAddition/minus (0.00s)
            math_test.go:13: setup sub test
            math_test.go:15: teardown sub test
        --- PASS: TestAddition/zero (0.00s)
            math_test.go:13: setup sub test
            math_test.go:15: teardown sub test
        math_test.go:8: teardown test case
    PASS
    ok      github.com/kare/go-unit-test-setup-teardown 0.010s
    % 
    
    通过这种方法,您可以将一些附加参数传递给setup/teardown。

    无耻插头,我创建它就是为了帮助解决这个问题

    下面是一个简单的例子:

    导入(
    “字符串”
    “测试”
    “github.com/houqp/gtest”
    )
    类型SampleTests结构{}
    //每次运行测试组时都会调用Setup和Teardown
    func(s*SampleTests)设置(t*testing.t){}
    func(s*SampleTests)拆卸(t*testing.t){
    //每次测试运行调用beforeach和AfterEach
    每个(t*testing.t){}之前的func(s*SampleTests)
    每次(t*testing.t){}
    func(s*SampleTests)子测试比较(t*testing.t){
    如果1!=1{
    t、 FailNow()
    }
    }
    func(s*SampleTests)子测试checkprefix(t*testing.t){
    if!strings.HasPrefix(“abc”、“ab”){
    t、 FailNow()
    }
    }
    func TestSampleTests(t*testing.t){
    gtest.RunSubTests(t,&SampleTests{})
    }
    

    您可以使用一组不同的设置/拆卸例程在包中创建任意测试组,每个测试组使用不同的设置/拆卸例程。

    如果有人正在寻找@beforeach(在测试文件中的每个测试之前运行)和@AfterEach(在测试文件中的每个测试之后运行)的替代方案,这里有一个帮助程序片段

    func CreateForEach(setUp func(),tearDown func())func(func()){
    return func(testFunc func()){
    设置()
    testFunc()
    拆卸
    }
    }
    
    在TestMain的帮助下,您可以像下面那样使用它

    var RunTest=CreateForEach(安装,拆卸)
    函数设置(){
    //为每个测试方法运行所需的设置方法
    //你的代码在这里
    }
    func拆卸(){
    //每种试验方法所需的拆卸方法
    //你的代码在这里
    }
    趣味测试示例(t*testing.t){
    运行测试(func(){
    //你的代码在这里
    })
    }
    

    您也可以检查:

    我知道您在回答自己的问题,因此这可能满足您自己的用例,但这并不等同于您在问题中包含的NUnit示例。好吧@james,我已经在回答问题的方法上展示了一个想法,其他人已经提供了一些很好的见解,包括您的见解。获得utside influences to tune one approach。谢谢。这很公平。您在回答中显示的内容与使用NUnit的
    [TestFixtureSetUp]
    属性更接近。它不包括分解部分。如果您的测试文件在同一个包中,这不是一个好的解决方案
    % go test -v
    === RUN   TestAddition
    === RUN   TestAddition/add
    === RUN   TestAddition/minus
    === RUN   TestAddition/zero
    --- PASS: TestAddition (0.00s)
        math_test.go:6: setup test case
        --- PASS: TestAddition/add (0.00s)
            math_test.go:13: setup sub test
            math_test.go:15: teardown sub test
        --- PASS: TestAddition/minus (0.00s)
            math_test.go:13: setup sub test
            math_test.go:15: teardown sub test
        --- PASS: TestAddition/zero (0.00s)
            math_test.go:13: setup sub test
            math_test.go:15: teardown sub test
        math_test.go:8: teardown test case
    PASS
    ok      github.com/kare/go-unit-test-setup-teardown 0.010s
    %