TDD 测试周期区分测试类型的技术?

Technique for TDD testing cycles differentiating types of test?

这门技术的新手...但到目前为止,根据我的阅读,我了解到大致分为 3 类:单元测试、acceptance/integration 测试(不相同)和端到端测试。

事实是,在这 3 个中,似乎只有单元测试旨在 运行 快如闪电。在开发过程中一直 运行 对整个项目进行所有单元测试似乎是完全合理的。但是,其他类型似乎不能这样说。

因此,在我看来,您希望在每个测试 运行 中进行一次验收测试(或者可能是一组相关的测试),而 运行对整个项目进行所有单元测试。

至于处于 "red" 状态的最新端到端测试,考虑到这些测试可能比验收测试还要慢,您可能不想 运行间歇性地?整个端到端的收集可能只有当你在做其他事情时,或者在晚上或什么时候?

我正在使用 Gradle,并且我知道您可以创建一个特殊的测试任务来仅 运行,例如,tests\unittests 目录下的所有单元测试...但是,如果我的想法是正确的,是否有跳过或选择特定验收测试的习惯方法,而不是不断编辑代码 - 这会变得非常烦人?

例如,通过某种方式将特定验收或端到端测试标记为某个 "category",或者可能通过将这些测试安排在分层文件夹结构中?

我没有使用过 gradle,但在 python 我经常使用你描述的两种方式:

  • 标记特定 类 功能测试(一个子集通常标记为 "smoke" 测试,每次部署时 运行)
  • 表示层次结构中的测试
    • small/unit
    • 整合
    • function(smoke一般都是标记功能测试)
    • ui
    • e2e

似乎只有单元测试才能运行快如闪电。 运行对整个项目进行所有单元测试似乎是完全合理的,

这是目标,鼓励所有单元测试都是无 IO 的,运行 每次提交都快如闪电。这个过程通常与 CI build 作业一起编码,以在每次提交到 repo 时触发。

不过其他类型好像也一样。 这实际上取决于可接受的 build 时间是多少,以及项目的大小。我发现大多数项目实际上并没有那么多的集成,如果它们确实有过多的集成,这通常是一个很好的迹象,表明应该重新考虑服务。对于永远的集成,需要多少测试来防止难以重现的错误情况,并确保它们的检查会在接口更改时中断?根据我的经验,不是很多。我最近开始使用 docker-compose 进行集成测试,这使得许多测试 20-30 可以在每次提交时非常快速地执行 ui。

docker-compose 还允许建立一个干净的 e2e 环境以对其执行 acceptance/functional 测试。

根据我的经验,较高级别的测试执行频率较低,但应尽可能频繁地执行。例如,我使用一个 API,有 300 个功能测试涵盖每个端点上的每个方法。因为它们不与 UI 交互并且只使用 HTTP,所以它们需要大约一分钟的时间来执行。它们在每次部署到环境时定期执行。