在Go中测试lifecyle。是否可以在不重复代码的情况下添加拆解方法?

时间:2018-11-10 11:13:40

标签: go testing

我开始与Go合作一个月了。我来自java / kotlin背景,我想了解即使在Go语言中也可以实现与那些语言相同的东西。

我当前的问题是这个。

我有一组集成测试用例,我需要初始化一些东西然后清理资源:我相信是一个常见的用例。

如果可能的话,这是我想要实现的一些伪代码:

for each test {
  init resources
  run test {
     init test resources
     execute method under test
     assert
  }
  clean resources
}

此刻,我可以尝试的是这种方法:

func TestMain(m *testing.M) {
    setup()
    code := m.Run() 
    shutdown()
    os.Exit(code)
}

一般来说,如果不是在包级别运行,那还可以。目前,这并没有给我太多控制权,因为我想在每个测试文件中运行其中一个。 (至少我是注意到的,如果我错了,请告诉我)

目前,我正在做的基本上是为每个测试运行初始化,但这实际上是很多重复的代码:

address, tearDownTestCase := testutils.SetupTestCase(emptyContext, postRouter(login.LoginUser), "/login")
defer tearDownTestCase()
// init test use case data
// run test
// clean use case data

您认为有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

Go不具有支持拆卸和拆卸方法的内置功能。但是,有多个第三方软件包可以启用此功能。在所有这些中,我最喜欢ginkgo软件包。它非常具有表现力,并且避免了代码重复。

样本测试看起来像

var _ = Describe("Book", func() {
    var (
        longBook  Book
        shortBook Book
    )

    BeforeEach(func() {
        longBook = Book{
            Title:  "Les Miserables",
            Author: "Victor Hugo",
            Pages:  1488,
        }

        shortBook = Book{
            Title:  "Fox In Socks",
            Author: "Dr. Seuss",
            Pages:  24,
        }
    })

    Describe("Categorizing book length", func() {
        Context("With more than 300 pages", func() {
            It("should be a novel", func() {
                Expect(longBook.CategoryByLength()).To(Equal("NOVEL"))
            })
        })

        Context("With fewer than 300 pages", func() {
            It("should be a short story", func() {
                Expect(shortBook.CategoryByLength()).To(Equal("SHORT STORY"))
            })
        })
    })
})

相似性还有其他生命周期方法,例如afterEachjustBeforeEach等。