当前位置: 首页 > 面试题库 >

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

司徒茂实
2023-03-14
问题内容

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

策略一:

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

package myfunc

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

package myfunc

有关示例,请参见bzip2。

策略2:

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

package myfunc

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

package myfunc_test

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

有关示例,请参见wire。

策略3:

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

package myfunc

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

package myfunc_test

import (
    . "myfunc"
)

有关示例,请参见字符串。

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


问题答案:

您列出的三种策略之间的根本区别是测试代码是否与被测试代码位于同一程序包中。在使用的决定package myfuncpackage myfunc_test在测试文件取决于你是否要执行白盒或黑箱测试。

在项目中同时使用这两种方法都没有错。例如,您可以拥有myfunc_whitebox_test.gomyfunx_blackbox_test.go

测试代码包比较

  • 黑盒测试: 使用package myfunc_test,这将确保您仅使用导出的标识符。
  • 白盒测试: 请使用,package myfunc以便您可以访问未导出的标识符。适用于需要访问未导出的变量,函数和方法的单元测试。

问题中列出的策略比较

  • 策略1: 文件myfunc_test.go用途package myfunc-在这种情况下在测试的代码myfunc_test.go将在相同的封装中被测试的代码myfunc.go,这是myfunc在本例中。
  • 策略2: 文件myfunc_test.go使用package myfunc_test—在这种情况下,myfunc_test.go“中的测试代码将被编译为单独的程序包,然后与主测试二进制文件链接并运行”。[来源:test.go源代码中的58-59行]
  • 策略3: 文件myfunc_test.go使用package myfunc_testmyfunc使用点符号导入-这是策略2的变体,但使用点符号导入myfunc


 类似资料:
  • 本文向大家介绍Go语言中反射的正确使用,包括了Go语言中反射的正确使用的使用技巧和注意事项,需要的朋友参考一下 介绍 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力。不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型。 反射有两个问题,在使用前需要三思: 大量的使用反射会损失一定性能 Clear is better than clever. Reflectio

  • 问题内容: 例如,我想在一个源文件中同时使用text / template和html / template。但是下面的代码会引发错误。 问题答案: 在规范中阅读有关它的更多信息。

  • 主要内容:flag 包概述,flag 参数类型,flag 包基本使用在编写命令行程序(工具、server)时,我们有时需要对命令参数进行解析,各种编程语言一般都会提供解析命令行参数的方法或库,以方便程序员使用。在Go语言中的 flag 包中,提供了命令行参数解析的功能。 下面我们就来看一下 flag 包可以做什么,它具有什么样的能力。 这里介绍几个概念: 命令行参数(或参数):是指运行程序时提供的参数; 已定义命令行参数:是指程序中通过 flag.Type 这种形

  • 全部的 我有一个在go中编写的服务,它通过gRPC协议与其他几个服务进行通信。我想为我的服务编写集成测试,但是我不可能使用真正的依赖项。 所以,我需要以某种方式模拟依赖关系。 对我来说,一个完美的场景是这样的: 我可以运行模拟服务器,并将其地址而不是真正的依赖项传递给我的应用程序 我试着用https://github.com/jekiapp/gripmock但它并不支持所有protobuff语法。

  • 问题内容: 我的源文件树是这样的: 内部: 内部: 我的问题是: 软件包名称与目录名称,源文件名称相关吗? 如果软件包只有一个源文件,是否需要将其放在目录中? 我应该和放在同一包装中吗? 在中,因为它与相同,所以我没有导入。但是当我用6g 编译时,它说。我该怎么办? 问题答案: 1-语言规范指出: 共享相同PackageName的一组文件构成了一个包的实现。一个实现可能要求包的所有源文件都驻留在同

  • 实际开发中,对于超出 int64 或者 uint64 类型的大数进行计算时,如果对精度没有要求,使用 float32 或者 float64 就可以胜任,但如果对精度有严格要求的时候,我们就不能使用浮点数了,因为浮点数在内存中只能被近似的表示。 Go语言中 math/big 包实现了大数字的多精度计算,支持 Int(有符号整数)、Rat(有理数)和 Float(浮点数)等数字类型。 这些类型可以实现