本文中译于官方FAQ
Go 项目打包可测试
如何创建多个包?
将软件包的所有源文件单独放在一个目录中。源文件可以随意引用来自不同文件的项目,不需要前向声明或头文件。
除了分成多个文件之外,该程序包还将像单文件程序包一样进行编译和测试。
如何编写单元测试?
在与包源相同的目录中创建一个以_test.go结尾的新文件。然后导入testing包,就可以开始写单元测试代码了
func TestFoo(t *testing.T) {
...
}
在该目录中运行 go test。该脚本找到Test函数,构建一个测试二进制文件并运行它。
有关更多详细信息,请参见如何编写Go代码文档,测试包和go test子命令。
我最喜欢的测试助手功能在哪里?
Go的标准测试包使编写单元测试变得容易,但是缺少其他语言的测试框架提供的功能,例如断言功能。本文档前面的部分解释了为什么Go没有断言,并且相同的参数适用于测试中断言的使用。正确的错误处理意味着在一个测试失败后再运行其他测试,以便调试该故障的人可以全面了解问题所在。对于测试来说,报告isPrime对2、3、5和7(或对2、4、8和16)给出错误的答案比报告isPrime对2给出错误的答案更有用,因此没有运行了更多测试。触发测试失败的程序员可能不熟悉失败的代码。现在,在测试中断后,花费大量时间编写一条良好的错误消息即可获得回报。
与此相关的一点是,测试框架趋向于发展成具有条件,控件和打印机制的自己的微型语言,但是Go已经具备了所有这些功能。为什么要重新创建它们?我们宁愿用Go编写测试;它是一种要学习的语言,而且这种方法可以使测试简单明了且易于理解。
如果编写良好错误所需的额外代码量似乎是重复性的和压倒性的,则在表驱动,遍历数据结构中定义的输入和输出列表的情况下,该测试可能会更好地工作(Go对关键字 struct 提供了出色的支持)。编写好的测试和好的错误消息的工作将在许多测试用例中分摊。标准的Go库充满了说明性示例,例如在fmt软件包的格式测试中。
为什么X在标准库中不存在?
标准库的目的是支持运行时,连接到操作系统并提供许多 Go 程序所需的关键功能,例如格式化的I/O和联网。它还包含对 Web 编程很重要的元素,包括加密和对 HTTP,JSON 和 XML 等标准的支持。
没有明确的标准来定义要包含的内容,因为很长一段时间以来,这是唯一的 Go 库。但是,有一些标准定义了今天要添加的内容。
标准库中很少有新的内容,包含的标准也很高。标准库中包含的代码承担大量持续的维护成本(通常由原作者以外的人承担),并受Go 1兼容性承诺的约束 (阻止对 API 中任何缺陷的修复),并受Go发布的约束 计划,防止用户快速获得错误修复。
大多数新代码应驻留在标准库之外,并可以通过该go工具的 go get命令进行访问。这样的代码可以有自己的维护者,发布周期和兼容性保证。用户可以在godoc.org上找到软件包并阅读其文档 。
尽管标准库中有一些不属于您的部分,例如log/syslog,由于Go 1兼容性的承诺,我们仍将继续维护库中的所有内容。但是,我们鼓励将大多数新代码放在其他地方。