Как разработать функциональное тестирование в приложении 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();