草庐IT

go - 如何编写干净的集成测试

我想使用Go和MySQL编写集成测试。但是我很困惑如何做到这一点。我有4个功能:创建、获取、更新和删除。如果我只有一个测试函数来测试我的所有代码,这是一种好习惯吗?例如:funcTestCRUD(t*testing.T){t.Run("successcase",func(t*testing.T){//callcreatefunc//callupdatefunc//callgetfunc//calldeletefunc})}如果我有上面的代码,我只有一个测试函数来测试我的所有代码。如果我想添加一个测试用例,我只需添加到TestCRUD()函数。这是一个好的做法吗?或者我应该为每个CRUD

进行基准测试不要只测量循环?

在我的Go基准测试中,我有一些设置测试数据的初始化代码,然后我有如下所示的基准测试循环。似乎输出衡量的是整个函数的运行时间,而不仅仅是循环中的内容。那对我来说不是有用的信息。有没有办法强制测量仅循环内容的运行时间,因为那是我所关心的?这不是很明显吗?funcBenchmarkXXX(b*testing.B){//Sometestdatainitcode..fori:=0;i 最佳答案 您可以通过在“测试数据初始化代码”之后调用b.ResetTimer()来完成此操作。funcBenchmarkXXX(b*testing.B){//S

go - 使用 Golang 进行功能测试

我有一个用Golang编写的网络服务。我需要重构它,因为它写得不好。我见过Golang使用格式TestMethodName(t*testing.T)。这非常适合单元测试,但就我而言,由于重构,方法会发生很大变化。这就是为什么我想编写功能测试,这样我就可以测试每个端点,并检查输出格式是否正确,而不依赖于功能我应该如何使用Golang来实现?是否有任何框架可以帮助我进行功能测试?在另一个堆栈中,例如PHP/Laravel,我可以将PostgreSQL与SQLite或内存测试交换,这对于此类测试非常实用。 最佳答案 您可以使用net/ht

正在测试 log.Fatalf?

我想在go代码中实现100%的测试覆盖率。我无法涵盖以下示例-任何人都可以帮助我吗?packageexampleimport("io/ioutil""log")funccheckIfReadable(filenamestring)(string,error){_,err:=ioutil.ReadFile(filename)iferr!=nil{log.Fatalf("Cannotreadthefile...howtoaddcoveragetestforthisline?!?")}return"",nil}funcmain(){checkIfReadable("dummy.txt")}一

unit-testing - 单元测试具有 ORM 交互的 Go 函数

我写了一个函数:funcAllItems(whttp.ResponseWriter,r*http.Request){db,err:=gorm.Open("sqlite3","test.db")iferr!=nil{panic("failedtoconnectdatabase")}deferdb.Close()varitems[]Itemdb.Find(&items)fmt.Println("{}",items)json.NewEncoder(w).Encode(items)}我想对此进行单元测试。理想情况下,单元测试意味着需要测试函数的每一行。我不确定我应该如何测试数据库连接是否打开以

unit-testing - 如何在不创建实际网络连接的情况下测试依赖于 net.Conn 的代码?

如果我有适用于net.Conn的代码,我如何在不实际创建与本地主机的网络连接的情况下为其编写测试?我在网上没有看到这个问题的解决方案;人们似乎要么忽略它(不进行测试),要么编写无法并行运行的测试(即使用实际的网络连接,这会耗尽端口),要么使用io.Pipe。不过,net.Conn定义了SetReadDeadline、SetWriteDeadline;而io.Pipe没有。net.Pipe也没有,尽管表面上声称要实现该接口(interface),但它只是通过以下方式实现:func(p*pipe)SetDeadline(ttime.Time)error{return&OpError{Op:

go - travis-ci在使用go test时需要root权限,如何设置?

我有Go测试文件,它需要root权限才能运行它(去测试)。Travisci中如何设置?这是yml:language:gosudo:requiredgo:-tipnotifications:email:on_success:changeon_failure:always在gitpush之后,travis-cibuild使用默认配置失败。 最佳答案 在travis中你可以使用sudo所以如果你想以root权限运行你的测试,改变脚本部分:script:sudo-Eenv"PATH=$PATH"gotest./...或者如果您使用的是Mak

unit-testing - 如何获得文件夹的全局测试覆盖率

显示代码覆盖率时,gotest显示每个包的代码覆盖率(百分比)。有没有办法显示一个考虑了所有子文件夹(子包)的文件夹的摘要?我想要的是整个项目的全局代码覆盖率,一个显示文件夹和所有子文件夹的代码覆盖率的数字。 最佳答案 运行后:gotest--coverprofile=coverage.out./...运行:gotoolcover-func=coverage.out您将在结果末尾看到总百分比 关于unit-testing-如何获得文件夹的全局测试覆盖率,我们在StackOverflow上

unit-testing - 我可以使用嵌套界面模拟库代码吗?

这个问题在这里已经有了答案:HowcanImockmultipletypeswhenthesignatureofaconcretemethodreferstoanotherconcretetype,notitsinterface?(1个回答)关闭3年前。我正在尝试在我的go代码中的测试中模拟第3方库。但是我无法编译我所采用的方法。如果我想模拟T2.M2的结果,有什么方法可以使它工作,或者我可以采用另一种方法吗?packagemainimport("fmt")//TwotypesinalibrarythatIdonthavecontrolovertypeT1struct{}func(T1

testing - 如何在测试中将模型与 Controller 分开?

所以我想在测试中将Controller与模型隔离开来,这样我就可以在出现问题时轻松解决问题。之前,我只是用模拟数据访问端点,但很难排除故障,因为测试从路由器一直运行到数据存储。所以我想也许我会为每个Controller(和模型)创建两个版本(MockController与Controller),并根据模式变量的值使用一个。简而言之,这就是我计划实现它的方式。constmodestring="test"//UserModelInterfaceistheInterfaceforUserModeltypeUserModelInterfaceinterface{Get()}//UserCont