【问题标题】:How to design functional testing in a RESTful ZF2 application?如何在 RESTful ZF2 应用程序中设计功能测试?
【发布时间】:2015-05-22 11:12:29
【问题描述】:

我正在计划一个由 Apigility 驱动的 RESTful Zend Framework 2 应用程序。对于单元测试,也可能用于数据库测试 PHPUnit 将被使用。现在我要为应用程序定义功能 tesgin。

“功能测试”对我来说意味着测试真正的功能。它还具有集成测试方面,因为应用程序随后会“模块化”进行测试,因此它是跨单元/模块的测试。 (我对功能测试的理解正确吗?)

对于此测试,将发送真实请求,并将响应与预期进行比较。对于写请求,它可能会更复杂一些,但为了简单起见,让我们首先考虑GET 的情况。 (对吗?)

为此目的,使用行为测试似乎是有意义的。 (实际上我根本看不到任何其他合适的方法。) (对吗?)

如果我的逻辑步骤之一是错误的,请纠正我。

可以在 RESTful PHP (ZF2) 应用程序的上下文中使用哪些行为测试工具? PHPUnit Story Extension? behat? phpspec?其他框架?或者直接通过 PHPUnit 进行测试(定义一个单独的测试套件并在其测试类中使用 API 调用执行行为测试)?

或者这一切都错了,功能测试需要完全不同的方法?

【问题讨论】:

  • 我投票结束这个问题,因为它似乎更适合programmers.stackexchange.com
  • 感谢您的评论。我认为,这个问题实际上可以发布在programmers.stackexchange.com 上,但这个地方也是正确的。但无论如何,即使没有,我也不会关闭,而是将其移至programmers.stackexchange.com。
  • 它更适合programmers.SE,因为在这个阶段它更具概念性,而不是“我有这个代码,我将如何修复这个错误”。随意c&p到programmers.SE并删除这个:)
  • 这个问题是一个资源请求。它将在 Programmers.SE 上作为题外话关闭。请阅读:What goes on Programmers.SE? A guide for Stack Overflow.
  • 我也觉得在programmers.SE有问题,但我也觉得应该移到qsa.stackexchange.com

标签: php rest zend-framework2 bdd functional-testing


【解决方案1】:

Behat 是针对 Apigility 应用程序(或任何应用程序)的行为测试的完全可接受的工具。

如果您专门谈论 API(通常是 Apigility),您还可以查看 Dredd from apiary.io。在您记录 API 后,它是一个很好的测试工具(这样做还有很多其他好处)

【讨论】:

  • 你能告诉我 Behat 和 Dredd 的区别吗?
【解决方案2】:

您的所有工具示例(PHPUnit Story Extension、behat、phpspec)都与 PHP 相关...事实上,您可以扩大搜索范围。

对 Web 应用程序进行黑盒测试的好处在于,您无需使用与您“在盒子内”使用的语言绑定的框架。

例如,我使用Capybara 来测试我的Web 应用程序,而没有一个是使用Ruby 完成的。选择最适合您的测试风格的一种。

我选择 Capybara 是因为它以用户为中心的方法和可读性:

require 'spec_helper'

 feature 'Register' do

  scenario 'as a new user' do
    visit '/register.html'
    fill_in 'Username', :with => a_string()
    fill_in 'Password', :with => 'secret'
    fill_in 'Confirm password', :with => 'secret'
    click_on 'submit'
    expect(page).to have_content "Your account has been created"
  end

  scenario 'not as an existing user' do
    visit '/register.html'
    fill_in 'Username', :with => 'hatter'
    fill_in 'Password', :with => 'secret'
    fill_in 'Confirm password', :with => 'secret'
    click_on 'submit'
    expect(page).to have_content 'username already exists'
  end

 end

如果您的应用程序更像一个 API,您可以找到更适合此的其他类型的语言(例如 Frisby.js):

test.create('Site cookie authentication')
  .post('http://cassandre.local:1337/_session', {name:'alice', password:'whiterabbit'})
  .expectStatus(200)
  .after(function(error, resource) {
    test.create('HTTP cookie authentication use')
      .get('http://cassandre.local:1337/text/Wonderland/')
      .addHeader('Cookie', resource.headers['set-cookie'])
      .expectStatus(200)
      .toss();
  })
  .toss();

【讨论】:

  • 感谢您的帖子。我不能接受它和/或奖励赏金,因为我找不到我的(理论)问题的答案。但无论如何,它提供了我真正需要的非常有用的信息,谢谢! +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多