如何在RESTful ZF2应用程序中设计功能测试?

时间:2015-05-22 11:12:30

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

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

“功能测试”对我来说意味着测试真实的功能。它还获得了集成测试方面,因为应用程序然后进行“intermodularily”测试,因此它是跨单元/模块的测试。 (我对功能测试的理解是否正确?)

对于此测试,将发送实际请求并将响应与期望进行比较。随着写入请求可能会更复杂,但为了保持简单,我们首先考虑GET情况。 (右?)

为此,使用行为测试似乎很有意义。 (实际上我根本没有看到任何其他适当的方法。) (右?)

如果我的其中一个逻辑步骤为假,请纠正我。

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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

所有工具示例(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();