使用 Go 语言进行测试的正确包命名

2024-01-08

我在 Go 中看到了几种不同的测试包命名策略,想知道每种策略的优缺点以及我应该使用哪一种。

策略一:

文件名:github.com/user/myfunc.go

package myfunc

测试文件名:github.com/user/myfunc_test.go

package myfunc

See bzip2 http://golang.org/src/pkg/compress/bzip2/bzip2_test.go举个例子。

策略2:

文件名:github.com/user/myfunc.go

package myfunc

测试文件名:github.com/user/myfunc_test.go

package myfunc_test

import (
    "github.com/user/myfunc"
)

See wire https://github.com/btcsuite/btcd/blob/master/wire/msgtx_test.go举个例子。

策略3:

文件名:github.com/user/myfunc.go

package myfunc

测试文件名:github.com/user/myfunc_test.go

package myfunc_test

import (
    . "myfunc"
)

See strings http://golang.org/src/pkg/strings/search_test.go举个例子。

Go 标准库似乎混合使用了策略 1 和 2。我应该使用这三种策略中的哪一种?这是一种痛苦的附加package *_test我的测试包,因为这意味着我无法测试我的包私有方法,但也许有一个我不知道的隐藏优势?


您列出的三种策略之间的根本区别在于测试代码是否与被测代码位于同一包中。决定使用package myfunc or package myfunc_test测试文件中取决于您是否要执行白盒 https://en.wikipedia.org/wiki/White-box_testing or 黑盒子 https://en.wikipedia.org/wiki/Black-box_testing测试。

在项目中使用这两种方法并没有什么问题。例如,你可以有myfunc_whitebox_test.go and myfunx_blackbox_test.go.

测试代码包对比

  • 黑盒测试: Use package myfunc_test,这将确保您只使用导出的标识符 https://golang.org/ref/spec#Exported_identifiers.
  • 白盒测试: Use package myfunc以便您可以访问非导出的标识符。适合需要访问非导出变量、函数和方法的单元测试。

所列策略的比较

  • 策略一:文件myfunc_test.go uses package myfunc— 在本例中,测试代码在myfunc_test.go将与正在测试的代码位于同一包中myfunc.go,即myfunc在这个例子中。
  • 策略2:文件myfunc_test.go uses package myfunc_test— 在本例中,测试代码在myfunc_test.go“将被编译为单独的包,然后与主测试二进制文件链接并运行。” [来源:第 58-59 行test.go http://golang.org/src/cmd/go/test.go源代码]
  • 策略3:文件myfunc_test.go uses package myfunc_test但进口myfunc使用点表示法 — 这是策略 2 的变体,但使用点表示法导入myfunc.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Go 语言进行测试的正确包命名 的相关文章

  • 如何对我的自定义验证属性进行单元测试

    我有一个自定义的 asp net mvc 类验证属性 我的问题是如何对其进行单元测试 测试类是否具有该属性是一回事 但这实际上并不能测试其中的逻辑 这就是我想测试的 Serializable EligabilityStudentDebtsA
  • 茉莉花单元测试 - 测试对象的未定义属性

    我有以下声明 expect A BAR name toEqual foo 由于我的对象 A 具有顶级属性 BAR 并且 bar 具有值 foo 传递 我想测试我的结构以确认属性 NONEXISTINGPROP 尚未定义 例如 expect
  • 为什么我不能将左大括号放在下一行?

    当我尝试编译以下代码时遇到奇怪的错误 package main import fmt fmt func main var arr 3 int for i 0 i lt 3 i fmt Printf d arr i 错误如下 unexpect
  • FakeAsync/tick (Async/whenStable) 与 detectorChanges()

    您能帮我区分这两件事吗 根据我的理解 如果你只使用 observable 你可以使用 detectorChanges 因此 您可以直接更改组件属性或监视服务调用并返回可观察的值 然后调用 detectorChanges 更改将在 html
  • 如何将 Unicode 字符转换为简单形式? [复制]

    这个问题在这里已经有答案了 有没有一个Go库可以Sj str m作为输入和返回Sjostrom作为输出 您可以使用golang org x text unicode norm来处理这个问题 package main import fmt i
  • 复杂数据类型作为 Go 中映射的键

    我正在尝试在 Go 中创建一个由大整数作为键的映射 effective Go 明确指出 结构体 数组和切片不能用作映射键 因为这些类型上没有定义相等性 这是有道理的 我当然可以将大整数转换为字符串并使用字符串作为键 但我在这里寻找更通用的解
  • Python 是否有首选的 BDD 风格单元测试框架?

    我想知道是否有任何 BDD 风格的 描述它 Python 单元测试框架可以维护并准备好投入生产 我已经发现describe https pypi python org pypi describe 0 1 2 但似乎没有维护 也没有文档 我也
  • 在业力测试中按类名获取两个div(Angular 4.0)

    我有这样的看法 div div class header title Example title 1 div div div div class header title Example title 2 div div 在我的业力测试中 我
  • 如何在golang中解析JSON而不需要解组两次

    我有一个 Web 套接字连接 它在 JSON 对象中发送不同类型的消息 并且我想将内容解组到一些已知的结构中 为此 我认为我应该执行以下操作 步骤 1 将 JSON 解组为通用映射 字符串 接口 步骤 2 找到我要找的钥匙 步骤 3 尝试将
  • “go.tools”的权限被拒绝错误

    当我尝试安装 go 工具时 我的权限被拒绝 usr local go pkg tool linux amd64 cover 我可以接受 因为它是 usr local 目录及需求root使用权 但我的第一个疑问是为什么当我设置时它试图安装在这
  • Golang 正则表达式在字符串之间替换

    我有一些可能采用以下形式的字符串 MYSTRING MYSTRING n MYSTRING n MYSTRING randomstringwithvariablelength n 我希望能够将其正则表达式为MYSTRING foo 基本上替
  • 修补在另一个函数中导​​入的函数

    为了避免循环导入 我被迫定义一个如下所示的函数 do something py def do it from helpers import do it helper do stuff 现在我希望能够测试这个功能do it helper修补完
  • spring boot 使用哪个“切片”来测试服务组件

    我正在使用 spring boot 开发一个rest api 它由标准层组成 控制器 RestController 处理传入的http请求并公开api端点 然后是服务层 Service 最后是存储库层 Repository 我的问题是关于单
  • 如何同时使用 LoadHTMLGlob 和 LoadHTMLFiles

    我想要来自不同子目录的分隔符逻辑模板templates文件夹 下面是我的templates文件夹 templates authentication login gohtml logout gohtml index gohtml profil
  • 如何测试 JUnit 测试的 Comparator?

    我需要测试 Compare 方法 但我对如何测试感到困惑 我可以看看该怎么做吗 public class MemberComparator implements Comparator
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 如何在 React 中测试表单提交?

    我有以下 React 组件 export default class SignUpForm extends React Component doSignupForm event Some API call render return div
  • 将 Xcode 的测试类助理编辑器与 Swift 类结合使用

    在 Xcode 中工作时 在助理编辑器中提取单元测试用例通常会很好 目前 我一直在手动选择测试文件 但我看到助理编辑器有一个选项Test Classes 我试图让这个选项自动提取我的测试文件 但我似乎无法让它工作 是否需要某种配置 它不适用
  • 如何从 JWT 令牌中提取声明

    我正在使用 dgrijalva jwt go 包 我想从令牌中提取有效负载 但找不到方法 示例 取自 https jwt io https jwt io 对于编码 eyJhbGciOiJIUZI1NiIsInR5cCI6IkpXVCJ9 e
  • 如何使用 jest 模拟第三方库

    我正在开发一个node js应用程序使用nestjs我有一堂课叫LoggerService如下 export class LoggerService private logger Rollbar constructor this logge

随机推荐

  • 过滤 Pandas 数据帧而不删除行

    我正在尝试使用where在我的 Pandas DataFrame 上替换所有不符合我的标准的单元格NaN 但是 我希望以始终保留原始 DataFrame 的形状的方式进行操作 并且不会从生成的 DataFrame 中删除任何行 给定以下数据
  • 如何将qml文件重新加载到QQuickView

    将 qml 文件重新加载到 QQuickView 的正确方法是什么 我正在使用 Qt Quick 2 1 并尝试编写一个简单的程序来加载 qml 文件并显示它 目前 我正在通过创建 QQuickView 来完成此操作 当我想重新加载 qml
  • 读一剪!在序言中

    我正在阅读同时阅读 Bratko 的 人工智能 Prolog 编程 第 5 章 控制回溯 起初 剪切似乎是模仿其他编程语言中已知的 if else 子句的直接方法 例如 Find the largest number max X Y Y X
  • android:如何在我的应用程序中实现像 Go Launcher 这样的首次教程?

    Go Launcher 有一个很好的初次使用教程 它与 Stock ICS 首次运行非常相似 我想学习如何在第一次启动我的应用程序时显示类似的教程 如何在我的 Android 应用程序中实现这个透明视图 与屏幕对象交互 我试图做相似的东西
  • 如何创建根据另一列计算的列?

    我需要创建一个专栏age在 SQL Server 数据库中 该列的值应根据该列的值计算DOB 它的值也应该增加Age增加 您应该使用计算列来解决此问题 其定义与此类似 ALTER TABLE Customers ADD Age AS dat
  • 如何让div换行

    我是CSS初学者 我想像这样将新的 div 放入新行中 我尝试这样的代码 div div
  • css 内联块和引导网格系统输出

    我正在尝试有一个具体的HTML我的 div 的标记使用css and bootstrap 3 2 下图展示了我想要得到的结果 我使用了引导网格系统 以便我的页面能够响应并在小屏幕设备中正确显示 这是我尝试过的代码 我用过http www b
  • 与字符串数字匹配 - 无法访问的代码

    scala 新手 似乎无法让我的匹配表达式工作 我已经了解了语句评估方式之间的差异 例如 一个新变量与声明的变量相对 但似乎无法使反引号或大写起作用 declared inside of object val numberOne 17201
  • Jersey:将值从 ContainerRequestFilter 传递到端点

    我正在使用 Jersey 2 9 并且创建了一个过滤器 它将采用加密的标头值 对其进行解密 然后将其传递到被调用的端点 我不知道如何做到这一点 我一直在互联网上搜索 但没有真正找到我想做的事情的具体例子 过滤器被调用 我只是在将值从过滤器传
  • 有没有办法将正则表达式更改为 Ruby on Rails 中的数字范围?

    我经常需要在正则表达式中创建数字范围 所以例如 2 3 0 9 是 20 39 之间的数字范围 为了仔细检查我的范围 我通常使用 Linux 命令 对于 2 3 0 9 Linux 命令为 seq 1 40 egrep 2 3 0 9 它为
  • 绑定失败:地址已被使用

    我正在尝试将套接字绑定到以下端口 if bind socket desc struct sockaddr server sizeof server lt 0 perror bind failed Error return 1 puts bi
  • NSDateFormatter 区别

    这两种日期格式有什么区别 第一个给出实际时间 第二个给出时间购买添加时区偏移值 NSDateFormatter dateFormatter NSDateFormatter alloc init dateFormatter setTimeZo
  • 检查 boost::variant 是否为 null

    我的程序中有一个 boost variant 我想检查该变体本身是否已初始化 以及其类型之一中是否包含值 我已经尝试过对该变体使用empty 但这似乎不起作用 检查 NULL 也不行 有谁知道如何检查这个吗 编辑 好的 看起来它永远不会为空
  • 在 Firefox 中打开一个新选项卡并将 ff 保留在后台

    是否有一种方法可以在 Firefox 中以编程方式在新选项卡中打开 URL 而无需 Firefox 获得焦点 到目前为止我发现了什么 firefox new window
  • 如何使用Radio.Group Antd设置检查?

    我有无线电绘制的动态数据 有一个活动无线电的 ID 它也是动态生成的 如何比较 id 并安装与 Radio Group 的检查 最后我需要获取表单中的单选值 该代码无法正常工作 动态数据可能会更大 const dynamiclyData i
  • FontForge:将字体的单独字形批量导出到 svg 文件中?

    是否可以将单个字形从字体批量导出到 SVG 而无需手动将它们一一导出 相关 但相反 将一系列 svg 文件作为字形导入 FontForge 并输出字体文件 https stackoverflow com questions 22124130
  • Screen.AllScreens 错误并将 WM_DISPLAYCHANGE 发布到单个 WinForm 应用程序

    首先 对这么长的帖子表示抱歉 关于如何限制 WM DISPLAYCHANGE 消息的发布范围有什么建议吗 设想 Screen AllScreens返回在客户端上检测到的所有监视器的坐标和分辨率的数组 如果在工作站锁定时启动应用程序 在夜间应
  • 有没有办法部分解构结构?

    我有一个结构 struct ThreeDPoint x f32 y f32 z f32 我想要提取两个实例化后的三个属性 let point ThreeDPoint ThreeDPoint x 0 3 y 0 4 z 0 5 let Thr
  • jquery 在通过ajax提交表单之前通过ajax验证电子邮件

    我有一个个人资料创建表单 其中有一个电子邮件地址字段 我需要确保用户输入的电子邮件地址格式有效 并且尚未使用 对于格式检查 我有一个简单的客户端验证 由 isValidEmailAddress 函数执行 效果很好 对于我需要检查电子邮件地址
  • 使用 Go 语言进行测试的正确包命名

    我在 Go 中看到了几种不同的测试包命名策略 想知道每种策略的优缺点以及我应该使用哪一种 策略一 文件名 github com user myfunc go package myfunc 测试文件名 github com user myfu