功能测试断言的深度


Functional tests depth of assertions

我正在开发一个基于Symfony2和PHPUnit的项目。据我所知,功能测试代表了从用户的角度来看系统应该做什么。但是,我对这种方法有一些疑问。

假设我正在测试一个用户注册表单。因此,提交表单后我要做的第一件事是断言响应成功,发送了电子邮件,并可能在成功页面上进行断言。系统内部应该存储注册日期,更改用户状态等。

问题是:检查像注册日期和状态这样的低级代码是否应该由功能测试覆盖?如果没有,哪里是放置这类测试的最佳地点?

如果您不强制将其包含在集成测试中,那么我建议将其作为单元测试进行。一般来说,你的测试结构应该是一个金字塔:http://martinfowler.com/bliki/TestPyramid.html

我将把这个测试分为几个部分:

  • 单元测试,检查信息是否按预期的方式正确反序列化,是否创建了预期的数据结构
  • 单元测试以检查该数据结构是否被传递给特定的服务(例如,如果存储库收到带有预期时间和其他参数的'save'请求)
  • 集成测试,检查存储库是否正确处理"保存"请求。这通常是一个"一般"测试,与这个特定的用户故事没有紧密联系。
  • 通用(与此特定用户故事无关)集成测试,检查单元测试的基础设施是否正确连接(包括视图/UI)

这样你会得到很多单元测试,而只有很少的集成/ui测试。这很好。这是因为维护功能测试需要大量的努力,并且与单元测试相比非常缓慢