【问题标题】:Confusion over Symfony testing practices: functional vs integration testingSymfony 测试实践的困惑:功能测试与集成测试
【发布时间】:2015-04-25 05:36:20
【问题描述】:

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

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

  1. 提出请求;
  2. 测试响应;
  3. 点击链接或提交表单;
  4. 测试响应;
  5. 冲洗并重复。

虽然Ruby on Rails docs 是这样描述的:

  1. 网络请求是否成功?
  2. 用户是否被重定向到正确的页面?
  3. 用户是否成功通过身份验证?
  4. 响应模板中是否存储了正确的对象?
  5. 是否在视图中向用户显示了适当的消息?

Symfony 文档似乎在描述更类似于集成测试的东西。单击链接、填写表单、提交表单等。您正在测试所有这些不同的组件是否正常交互。在他们的示例测试用例中,他们基本上通过遍历网页来测试控制器的所有操作。

我很困惑为什么 Symfony 不区分功能测试和集成测试。 Symfony 社区中是否有人将测试隔离到特定的控制器操作?我是不是想多了?

【问题讨论】:

  • 我会在 BDD 中抽象出所有这些......你正在将一个通用的 symfony 示例与一个包含数据持久化和用户身份验证的 ROR 示例进行比较......
  • 我对比较的观点是 Symfony 建议编写功能测试,而不仅仅是发出请求和测试响应。他们建议您然后“单击”并“浏览”结果以测试其他组件。 Rails 文档不建议这样做,因为他们在集成测试文档中谈到了这一点
  • Rails 没有最终的测试方法。这只是一种方法。

标签: symfony testing integration-testing functional-testing


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

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

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

【讨论】:

  • 请解释反对意见 - 我很高兴犯错,当我明白为什么时我会更高兴。
【解决方案2】:

在我看来,这两个列表并不矛盾。第一个列表(Symfony)可以看作是为第二个列表(Rails)提供答案的一种方法。

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

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

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

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

【讨论】:

    【解决方案3】:

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

    然后是集成和单元测试。这些测试处于较低级别。单元测试的基本预测是它们是孤立的。您可以测试特定对象及其方法,但没有外部或实际依赖项。这就是mocks 的用途(基本上模拟根据单元测试需要模拟真实对象)。不了解IOC 真的很难写隔离测试。

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

    【讨论】:

      【解决方案4】:

      是的,你想多了;)

      我不知道为什么 Symfony 或 Ruby on Rails 会这样说。有一段时间,测试取决于它所看的眼睛。底线:名字无关紧要。唯一重要的是测试给你的信心,你正在做什么。

      除此之外,测试是活跃的,应该随着您的代码而发展。我有时只测试特定的 HTTP 状态代码,有时我隔离一个模块并对其进行单元测试......取决于我必须花费的时间、好处等。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-07
        • 2013-08-06
        • 1970-01-01
        • 1970-01-01
        • 2011-04-09
        • 1970-01-01
        • 2016-08-27
        • 1970-01-01
        相关资源
        最近更新 更多