TDD 单元测试、集成测试、验收测试的顺序应该是怎样的?
TDD What should be the order of unit testing, integration testing and acceptance testing?
我正在为一个使用 PHP 的项目做 TDD。直到现在,我编写单元测试,让它们失败,然后编写最少的代码来完成测试。项目完成后,我使用CasperJS编写验收测试。
最近我一直在研究 Codeception 和 Behat 以及其他一些测试框架,并且一直在阅读不同类型的测试,例如单元测试、集成测试等。
我找不到正确的测试顺序。
我想知道的是,当我坐下来设计项目时,我做了:
- 需求分析
- 技术栈选择
- 枚举 Resources/Business 个实体
- 然后决定什么进入模型,什么保留为服务等。
- 数据库设计
- 列出必要的模型、控制器、服务
- 在使用 phpUnit
编写个人 类 之前先编写测试
- API 准备就绪后,编写 CasperJS 测试以验证行为。
虽然这不准确,但很好地说明了我 运行 我的店铺。那么,集成测试和行为测试在哪里适合?
这真的感觉像是一个基于意见的问题,所以如果它因为这样而被关闭,请不要感到惊讶。确实没有完美的答案,决定如何以及何时编写测试实际上取决于项目和您。
您可以在第 3 步之前尝试计算出所有用户故事和行为并编写验收测试。这可以帮助照亮计划中的黑暗角落。
或者,您可以在启动功能之前编写验收测试。这可以帮助您了解需要对给定功能、其范围和边缘情况进行哪些操作。
或者,您可以在项目完成后编写验收测试。这可以作为预期行为的最终检查清单,然后再交给客户进行他们想要进行的任何验收测试。
我确信在您的工作流程中还有其他点可能适合编写验收测试,但这是我发现自己编写此类测试的三个点。 IMO,最好的地方是在开始一个功能之前。那时,我有一个用户故事,我熟悉我已经编写的代码,并且我对新代码的预期功能有所了解。
可以组织验收测试来指导编码,就像单元测试一样,但在更广泛的层面上。仍然迭代 "write failing test, write code to make test pass, write failing test," 但也有一个更大的由验收测试驱动的循环。一旦到达内部循环中您认为可以通过验收测试的点,请检查 运行 整个套件。
您可以通过另一种方式询问 "where integration and behavior testing fit in," 并且在 "where does that testing fit in with the rest of my testing and code?" 的意义上,这不是那么灰色。单元测试应该 运行 经常进行。整个单元测试套件。 经常。 所以它需要非常快。您应该能够知道您是否破坏了项目内部的某些东西立即。
集成测试用于验证来龙去脉是否按预期工作。在您的应用程序之外,您的依赖项不会发生变化,如果发生变化,您应该注意这一点。因此,您的代码和 他们的 代码之间有明确的界限。您的单元测试可以带您一路到达那个界面。集成测试验证您为之编码的接口确实是他们提供的接口。您不需要 运行 这些代码的每一个小改动。您确实需要 运行 它们,但可能只需要每次提交。它们可能会更慢。
验收测试类似于集成测试,只是它们定义接口而不是征用外部依赖来验证接口匹配。您 可以 持有它们 运行 直到临近发布,但是您 运行 它们的频率越高,它们实际提供的价值就越大。
YMMV.
我正在为一个使用 PHP 的项目做 TDD。直到现在,我编写单元测试,让它们失败,然后编写最少的代码来完成测试。项目完成后,我使用CasperJS编写验收测试。
最近我一直在研究 Codeception 和 Behat 以及其他一些测试框架,并且一直在阅读不同类型的测试,例如单元测试、集成测试等。
我找不到正确的测试顺序。
我想知道的是,当我坐下来设计项目时,我做了:
- 需求分析
- 技术栈选择
- 枚举 Resources/Business 个实体
- 然后决定什么进入模型,什么保留为服务等。
- 数据库设计
- 列出必要的模型、控制器、服务
- 在使用 phpUnit 编写个人 类 之前先编写测试
- API 准备就绪后,编写 CasperJS 测试以验证行为。
虽然这不准确,但很好地说明了我 运行 我的店铺。那么,集成测试和行为测试在哪里适合?
这真的感觉像是一个基于意见的问题,所以如果它因为这样而被关闭,请不要感到惊讶。确实没有完美的答案,决定如何以及何时编写测试实际上取决于项目和您。
您可以在第 3 步之前尝试计算出所有用户故事和行为并编写验收测试。这可以帮助照亮计划中的黑暗角落。
或者,您可以在启动功能之前编写验收测试。这可以帮助您了解需要对给定功能、其范围和边缘情况进行哪些操作。
或者,您可以在项目完成后编写验收测试。这可以作为预期行为的最终检查清单,然后再交给客户进行他们想要进行的任何验收测试。
我确信在您的工作流程中还有其他点可能适合编写验收测试,但这是我发现自己编写此类测试的三个点。 IMO,最好的地方是在开始一个功能之前。那时,我有一个用户故事,我熟悉我已经编写的代码,并且我对新代码的预期功能有所了解。
可以组织验收测试来指导编码,就像单元测试一样,但在更广泛的层面上。仍然迭代 "write failing test, write code to make test pass, write failing test," 但也有一个更大的由验收测试驱动的循环。一旦到达内部循环中您认为可以通过验收测试的点,请检查 运行 整个套件。
您可以通过另一种方式询问 "where integration and behavior testing fit in," 并且在 "where does that testing fit in with the rest of my testing and code?" 的意义上,这不是那么灰色。单元测试应该 运行 经常进行。整个单元测试套件。 经常。 所以它需要非常快。您应该能够知道您是否破坏了项目内部的某些东西立即。
集成测试用于验证来龙去脉是否按预期工作。在您的应用程序之外,您的依赖项不会发生变化,如果发生变化,您应该注意这一点。因此,您的代码和 他们的 代码之间有明确的界限。您的单元测试可以带您一路到达那个界面。集成测试验证您为之编码的接口确实是他们提供的接口。您不需要 运行 这些代码的每一个小改动。您确实需要 运行 它们,但可能只需要每次提交。它们可能会更慢。
验收测试类似于集成测试,只是它们定义接口而不是征用外部依赖来验证接口匹配。您 可以 持有它们 运行 直到临近发布,但是您 运行 它们的频率越高,它们实际提供的价值就越大。
YMMV.