对Symfony测试实践的困惑:功能与集成测试

时间:2015-02-23 19:10:40

标签: symfony testing integration-testing functional-testing

Symfony testing documentation并没有真正提及功能测试集成测试之间的区别,但我的理解是they are different

Symfony文档描述了这样的功能测试:

  1. 提出要求;
  2. 测试回复;
  3. 点击链接或提交表单;
  4. 测试回复;
  5. 冲洗并重复。
  6. 虽然Ruby on Rails docs形容如下:

    1. 网络请求是否成功?
    2. 是否已将用户重定向到右页?
    3. 用户是否已成功通过身份验证?
    4. 是存储在响应模板中的正确对象吗?
    5. 是在视图中向用户显示的相应消息吗?
    6. Symfony文档似乎在描述更类似于集成测试的内容。单击链接,填写表单,提交表单等。您正在测试所有这些不同组件是否正确交互。在他们的示例测试用例中,他们基本上通过遍历网页来测试控制器的所有操作。

      我很困惑为什么Symfony没有区分功能测试和集成测试。 Symfony社区中是否有人将测试与特定控制器操作隔离开来?我是不是在想事情?

4 个答案:

答案 0 :(得分:3)

  • 单元测试逐个引用类的测试方法,并检查它们是否在正确的上下文中进行了正确的调用。如果这些方法使用依赖项(注入服务或甚至该类的其他方法),我们将模拟它们以仅将测试与当前方法隔离。

  • 集成测试是指自动测试应用程序的功能。这是检查给定功能的所有可能使用方案是否按预期工作。要进行此类测试,您基本上使用爬虫,并模拟网站用户来完成该功能,并检查生成的页面甚至结果数据库数据是否一致。

  • 功能测试是指在预生产环境中手动挑战应用程序可用性。您有一个质量保证团队,该团队将推出一些方案来检查您的网站是否按预期工作。手动测试将为您提供您无法自动获得的反馈,例如"此按钮很难看","此功能太复杂而无法使用"或其他任何主观反馈a人(通常会像客户一样思考)可以给予。

答案 1 :(得分:1)

我认为2个列表的方式并不相互矛盾。第一个列表(Symfony)可以看作是为第二个列表(Rails)提供答案的方法。

这两个列表听起来像功能测试给我。他们将应用程序作为一个整体来确定应用程序是否满足要求。第二个列表(Rails)描述了确定是否满足要求的典型问题,第一个列表(Symfony)提供了如何回答这些问题的方法。

集成测试更侧重于单元如何协同工作。假设您有一个依赖于数据库抽象层的存储库单元。 单元测试可以通过存根/模拟数据库抽象层来确保存储库本身正常运行。 集成测试将使用这两个单元来查看它们是否实际上一起工作。

集成测试的另一个例子是使用真实数据库来检查是否存在正确的表/列,以及查询是否提供了您期望的结果。但是,当调用记录器来存储消息时,该消息实际上最终会出现在文件中。

PS:实际使用(无头)浏览器的功能测试通常称为验收测试。

答案 2 :(得分:1)

两个引用的文档都描述了功能测试。功能测试从用户角度(通常在GUI层)执行。它测试用户将看到什么,如果用户提交表单将会发生什么或将点击某个按钮。无论是自动还是手动过程都无关紧要。

然后是集成和单元测试。这些测试属于较低水平。单元测试的基本预测是它们是孤立的。您可以测试特定对象及其方法,但无需外部或实际依赖。这是mocks的内容(基本上模拟根据单元测试需要模拟真实对象)。不了解IOC真的很难写出孤立的测试。

如果您使用实际/外部依赖项(无模拟)编写测试,则编写集成测试。集成测试可以测试两个对象或整个包/模块的协作,包括查询数据库,发送邮件等。

答案 3 :(得分:1)

是的,你是在思考事情;)

我不知道为什么Symfony或Ruby on Rails会说出这样的事情。有一段时间,测试取决于它正在观察它的眼睛。底线:名称并不重要。唯一重要的是测试给你的信心,你正在做什么。

除此之外,测试仍然存在,并且应该随着您的代码而发展。我有时只测试特定的HTTP状态代码,有时候我会隔离模块并对其进行单元测试...取决于我必须花费的时间,好处等等。

如果我有一段仅用于控制器的代码,我通常会进行功能测试。如果我正在制作实用程序,我通常会进行单元测试。