testing - 在 golang 应用程序中组织测试并避免导入循环 hell

标签 testing web architecture go

我目前遇到了构建应用程序结构及其测试基础架构的问题。

这里是布局的简要概述

<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/

相关文章:

ruby - "Is my site down?"方法

css - 当有人使用移动设备登录时,将桌面网页更改为移动网页

web - solid 和 ipfs 的区别

java - 注入(inject)设置还是加载一次全局查找?

java - 我应该为每种数据库查询创建新实体吗?

c# - 在 Visual Studio 中找不到数据生成计划

javascript - 如何在 intern js 中从 createpage 打印 HTML 源代码

gwt - 在 Play 应用程序中测试 GWT 模块

ajax - 在 Cakephp 2.0 中测试 Ajax 请求

ios - swift : Separate classes for network requests