测试后清除数据

时间:2018-07-09 06:30:08

标签: testing go

我编写测试,在此测试中,我使用一些保存的数据文件,数据库记录等。

我应该在测试结束之前删除此数据吗?

例如,我检查了user查找程序

func (ID int) User (*User) {
  // my finder here
}

在测试之前,我必须为数据库创建User。所以,我应该做类似的事情

defer db.Clean()

???

与文件*os.File

相同

2 个答案:

答案 0 :(得分:0)

如果您正在谈论对代码进行单元测试,则不应调用该数据库。您应该使用可以存根或模拟的接口。

答案 1 :(得分:0)

为了使我们都在同一页上,有许多不同形式的测试。在这里,我们将考虑单元测试和集成测试。

如果您正在进行单元测试,我希望仅使用模拟,而不会与文件进行交互。因此,我认为这是用于某种集成测试。

This is a link和一堆幻灯片,从hashicorp的创始人兼CTO米切尔(Mitchellh)在测试中的演讲

本次演讲中描述的方法之一是返回一个func()闭包,该闭包随后将负责清理。

您可以将所有设置逻辑封装到一个返回清除闭包的函数中。

func SetupIntegrationDB(t *testing.T, addr string) (*sql.DB, func()) {
    // setup the connection, use t.Fatal for all errors.

    cleanup := func() {
        // here you have access to both t, and *sql.DB
        // you can do all the clean up required, 
        // and return this anonymous function to be called later
    }

    return db, cleanup
}


// inside your test
db, cleanup := SetupIntegrationDB(t, addr)
defer cleanup()

这与您在问题中建议的内容非常相似,但允许略微改善清理逻辑的封装。您所有的测试仅需要执行它们提供的清理功能,而无需关心它的完成方式。

相同的模式可用于文件,返回文件(或io.Writer),以及一个知道该文件存在位置并可以稍后删除该文件的函数。