断言的功能测试深度
Functional tests depth of assertions
我正在开发一个基于 Symfony2 和 PHPUnit 的项目。据我所知,功能测试代表了系统从用户角度应该做什么。但是,我对这种方法有一些疑问。
假设我正在测试一个用户注册表单。因此,提交表单后我应该做的第一件事是断言响应成功,发送了一封电子邮件,并可能在成功页面上进行断言。系统内部应存储注册日期、更改用户状态等。
问题是:检查注册日期和状态等低级别代码是否应该包含在功能测试中?如果没有,放置此类测试的最佳位置是哪里?
如果您没有被迫将其包含在集成测试中,那么我建议您将其作为单元测试进行。一般来说,你的测试结构应该是一个金字塔:http://martinfowler.com/bliki/TestPyramid.html
我会把这个测试分成几个:
- 检查信息是否以预期方式正确反序列化并创建预期数据结构的单元测试
- 单元测试以检查该数据结构是否传递给特定服务(例如,如果存储库收到 'save' 带有预期时间和其他参数的请求)
- 集成测试以检查存储库是否正确处理 'save' 请求。这通常是一个 'general' 测试,与这个特定的用户故事没有紧密关系。
- 一般(与此特定用户故事无关)集成测试,以检查单元测试基础设施是否正确连接(包括 view/UI)
这样您将获得许多单元测试,而只有少数 integration/ui 测试。那很好。那是因为维护功能测试需要付出很多努力,而且与单元测试相比非常慢
我正在开发一个基于 Symfony2 和 PHPUnit 的项目。据我所知,功能测试代表了系统从用户角度应该做什么。但是,我对这种方法有一些疑问。
假设我正在测试一个用户注册表单。因此,提交表单后我应该做的第一件事是断言响应成功,发送了一封电子邮件,并可能在成功页面上进行断言。系统内部应存储注册日期、更改用户状态等。
问题是:检查注册日期和状态等低级别代码是否应该包含在功能测试中?如果没有,放置此类测试的最佳位置是哪里?
如果您没有被迫将其包含在集成测试中,那么我建议您将其作为单元测试进行。一般来说,你的测试结构应该是一个金字塔:http://martinfowler.com/bliki/TestPyramid.html
我会把这个测试分成几个:
- 检查信息是否以预期方式正确反序列化并创建预期数据结构的单元测试
- 单元测试以检查该数据结构是否传递给特定服务(例如,如果存储库收到 'save' 带有预期时间和其他参数的请求)
- 集成测试以检查存储库是否正确处理 'save' 请求。这通常是一个 'general' 测试,与这个特定的用户故事没有紧密关系。
- 一般(与此特定用户故事无关)集成测试,以检查单元测试基础设施是否正确连接(包括 view/UI)
这样您将获得许多单元测试,而只有少数 integration/ui 测试。那很好。那是因为维护功能测试需要付出很多努力,而且与单元测试相比非常慢