我目前遇到了构建应用程序结构及其测试基础架构的问题。
这里是布局的简要概述
<GOROOT>/src/myapp/controllers/
<GOROOT>/src/myapp/controllers/account.go
...
<GOROOT>/src/myapp/models/
<GOROOT>/src/myapp/models/account.go
<GOROOT>/src/myapp/models/account_test.go
...
<GOROOT>/src/myapp/components/
<GOROOT>/src/myapp/components/comp1/
<GOROOT>/src/myapp/components/comp1/impl.go
<GOROOT>/src/myapp/components/comp1/impl_test.go
<GOROOT>/src/myapp/components/
...
<GOROOT>/src/myapp/testutil/
<GOROOT>/src/myapp/testutil/database.go
<GOROOT>/src/myapp/testutil/models.go
...
问题一
文件 myapp/testutil/models.go
包含一些在 models/*_test.go
测试中使用的实用函数。
util 函数实际上确实使用包 myapp/models
数据结构和函数。因此我们有一个导入周期:account_test.go
导入 testutil
包,后者又导入 models
。
这里唯一明确的解决方案是将 testutil/models.go
保留在 models
包的同一包中,例如 test_utils.go
,这对我来说似乎有点笨拙。在这种情况下,最好的解决方法是什么?
问题2
testutil
包对 comp1
进行了一些初始化(假设它是第 3 方服务的客户端)。当我们运行测试 comp1/impl_test.go
时,testutil
包被导入,它导入 comp1
包,因为它负责组件的初始化.同样的循环导入 hell 。将初始化移动到测试用例中的每个单独位置似乎是代码的重复。仍在寻找一些优雅的解决方案...
最佳答案
问题1
如果 package testutils
只是提供在 package module
的测试 期间使用的实用函数,那么只需将这些函数放入 models/testutils_test。 go
:现在运行 models/*_test.go
测试时将包含这些实用函数。不再有导入周期。
这是您“唯一明确的解决方案”,我看不出有任何“笨拙”的地方。
问题2
导入周期:同上
初始化:您的comp1/impl_test.go
可以提供一个func init()
,所以不需要重复的代码。
(标准库是如何测试不同内容的良好来源。恕我直言,测试代码中的代码重复不是七大罪之一。)
关于testing - 在 golang 应用程序中组织测试并避免导入循环 hell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20069994/