猿问

在 Go 中测试生命周期。是否可以在不重复代码的情况下添加拆卸方法?

我一个月前开始使用 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

你认为有更好的方法吗?


斯蒂芬大帝
浏览 108回答 1
1回答

繁星点点滴滴

Go 没有支持拆解方法的内置功能。但是,有多个第三方包可以实现这一点。其中,我最喜欢银杏包。它非常有表现力并且避免了代码重复。样本测试看起来像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"))            })        })    })})相似之处还有其他生命周期方法afterEach,如justBeforeEach等。
随时随地看视频慕课网APP

相关分类

Go
我要回答