Как разработать функциональное тестирование в приложении RESTful ZF2?

Я планирую приложение RESTful Zend Framework 2, основанное на Apigility. Для модульного тестирования и, возможно, также для тестирования базы данных будет использоваться PHPUnit. Теперь я собираюсь определить функциональный тезис для приложения.

"Функциональное тестирование" означает для меня тестирование реальной функциональности. Он также получает аспект интеграции, так как приложение затем тестируется "интермодулярно", поэтому оно тестирует модули/модули. (Правильно ли я понимаю функциональное тестирование?)

Для этого тестирования будет отправлен реальный запрос и ответы по сравнению с ожиданиями. С запросами на запись это может быть немного сложнее, но чтобы сохранить его простым, рассмотрим случай GET только в первую очередь. (Верно?)

С этой целью использование тестирования поведения, по-видимому, имеет смысл. (На самом деле я просто не вижу других подходящих подходов.) (Верно?)

Если один из моих логических шагов ошибочен, пожалуйста, исправьте меня.

Какие средства тестирования поведения могут использоваться в контексте приложения RESTful PHP (ZF2)? Расширение PHPUnit Story? behat? phpspec? Другие рамки? Или, может быть, прямое тестирование через PHPUnit (определение отдельного набора тестов и выполнение в тестах поведения тестовых классов с помощью API-вызовов)?

Или все это неправильно, и для функционального тестирования нужен совершенно другой подход?

Ответ 1

Behat - вполне приемлемый инструмент для тестов поведения против приложения Apigility (или любого приложения).

Если вы говорите об API-интерфейсах (что обычно относится к Apigility), вы также можете посмотреть Dredd from apiary.io. Это отличный инструмент для тестирования после документирования вашего API (много других преимуществ от этого)

Ответ 2

Все ваши примеры инструментов (PHPUnit Story Extension, behat, phpspec) привязаны к PHP... На самом деле вы можете расширить свой поиск.

Хорошая вещь с тестированием черного ящика веб-приложения заключается в том, что вам не нужно использовать фреймворк, связанный с языком, который вы использовали "внутри коробки".

Например, я использую Capybara для тестирования моих веб-приложений, но ни один из них не выполняется с 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();