菜单

测试目录 (/test)

相关源文件

目的与范围

本文档描述了标准 Go 项目布局中 `/test` 目录的用途、组织和用法。`/test` 目录专门用于托管外部测试应用程序和测试数据,以补充 Go 的标准测试机制。它不适用于常规的包级测试,这些测试应与它们所测试的代码放在一起。

有关常规包测试的文档,请参阅 Go 项目布局概述

来源: README.md146-148

概述

`/test` 目录是 Go 项目标准包级测试范式的补充,它充当外部测试和测试数据的一个集中位置。虽然 Go 鼓励将包测试放在与它们所测试的代码相同的目录中的 `*_test.go` 文件中,但复杂的项目通常需要额外的测试工件,例如集成测试、性能测试和大量测试数据集。

来源: README.md146-148 test/README.md1-3

与项目结构的关系

`/test` 目录是 Go 项目支持基础设施的一部分,而不是核心应用程序代码。它位于与 `/cmd`、`/pkg` 和 `/internal` 等其他顶级目录相同的级别。

来源: README.md146-148

目的和用例

`/test` 目录专门用于:

  1. 外部测试应用程序 - 从外部测试应用程序的独立程序
  2. 集成测试 - 验证多个组件协同工作的测试
  3. 端到端测试 - 测试整个应用程序的测试
  4. 测试数据文件 - 测试所需的庞大或复杂的数据集
  5. 测试夹具 - 可重用的测试配置和设置

与专注于单元测试单个包的标准 Go 测试不同,`/test` 目录中的测试通常采用更广泛、更整体的方法来测试应用程序。

来源: README.md146-148 test/README.md1-3

组织架构

Go 项目布局指南并未规定 `/test` 目录的具体结构。这种灵活性允许开发人员以对其特定项目有意义的方式组织测试工件。

对于大型项目,一种常见模式是创建子目录来组织不同类型的测试或测试数据。

测试数据目录命名

Go 的工具将忽略名为 `testdata` 的目录,以及以 `.` 或 `_` 开头的目录。这为包含测试数据的目录命名提供了灵活性。

目录名称被 Go 工具忽略用例
/test/testdata测试数据的标准约定
/test/data当数据需要包含在构建中时
/test/_data替代命名约定
/test/.data替代命名约定

来源: README.md146-148 test/README.md1-5

与应用程序组件的交互

`/test` 目录中的测试通常跨越包边界来执行应用程序组件,验证它们在实际场景中如何协同工作。

来源: README.md146-148

来自真实项目示例

OpenShift Origin 项目提供了 `/test` 目录组织的一个示例

  • `/test` - 包含测试应用程序和集成测试
  • `/test/testdata` - 包含测试使用的数据文件

Go 项目中的其他常见模式包括:

  • `/test/integration` - 集成测试
  • `/test/e2e` - 端到端测试
  • `/test/performance` - 性能和负载测试
  • `/test/fixtures` - 可重用的测试设置和配置

来源: test/README.md7-8

与标准 Go 测试的区别

为了阐明包级测试与 `/test` 目录中测试的区别

方面包级测试`/test` 目录测试
位置在被测试代码相同目录下的 `*_test.go` 文件项目根目录下独立的 `/test` 目录
范围通常是单个包的单元测试集成、端到端和外部测试
命令使用 `go test ./...` 运行可能需要自定义测试运行器或脚本
访问可以访问未导出的包元素只能访问导出的 API
目的验证单个包的功能验证跨包交互和整体系统行为

来源: README.md146-148 test/README.md1-3

常见实现模式

`/test` 目录中的测试通常遵循以下模式:

来源: README.md146-148 test/README.md1-3

最佳实践

处理 `/test` 目录时

  1. 将单元测试保留在其包中 - 仅将 `/test` 目录用于不符合标准 Go 测试模型的测试
  2. 为组织创建子目录 - 对相关测试和测试数据进行分组
  3. 使用 `testdata` 进行测试数据 - 遵循 Go 对测试数据目录的约定
  4. 记录测试要求 - 包括 README 文件,解释如何运行测试
  5. 自动化测试执行 - 使用脚本或 Makefile 来简化测试运行
  6. 保持测试独立 - 设计可以独立运行且没有副作用的测试

来源: README.md146-148 test/README.md1-5

总结

`/test` 目录为补充 Go 的标准包级测试方法提供了专门的外部测试应用程序和测试数据空间。虽然组织此目录没有严格的规则,但对于构建测试应用程序、集成测试和测试数据,已经出现了常见的模式。通过遵循这些模式,开发人员可以创建全面的测试套件,以验证跨包边界的应用程序功能。