Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing 测试后清理数据_Testing_Go - Fatal编程技术网

Testing 测试后清理数据

Testing 测试后清理数据,testing,go,Testing,Go,我编写测试,在这个测试中,我使用一些保存的数据文件、数据库记录等 我应该在测试结束前删除这些数据吗 例如,我检查userfinder func (ID int) User (*User) { // my finder here } 在测试之前,我必须创建用户到数据库。那么,我应该做类似的事情吗 defer db.Clean() 与files*os.File相同如果您谈论的是对代码进行单元测试,那么不应该调用数据库。您应该使用一个可以存根或模拟的接口。因此,我们都在同一个页面上,有许多不

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

我应该在测试结束前删除这些数据吗

例如,我检查
user
finder

func (ID int) User (*User) {
  // my finder here
}
在测试之前,我必须创建
用户
到数据库。那么,我应该做类似的事情吗

defer db.Clean()


与files
*os.File相同

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

因此,我们都在同一个页面上,有许多不同形式的测试。这里我们将考虑单元测试和集成测试。 如果您是单元测试,我希望只使用mock,而不与文件交互。所以我假设这是为了某种集成测试

从hashicorp的创始人兼首席技术官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
),以及一个知道该文件存在的位置并可以稍后删除该文件的函数。

这取决于您。如果测试数据是无用的,为什么不删除它们?在测试结束后使用DEBER进行测试是一个好主意。使用一组测试数据对数据库进行Dockerize。测试完成后,您可以删除容器。文件呢?例如,我创建一个文件,将数据写入该文件,然后压缩它。我要对文件做什么?我要创建一个接口,将数据写入文件。因此,我也可以将其存根,并确保我的整体功能正常工作。然后,我将编写一个单元测试来测试文件是否正在编写和压缩。