#php #zend-framework #tdd #bdd #behat
#php #zend-framework #tdd #bdd #behat
Вопрос:
Кто-нибудь использовал Behat с Zend Framework? Есть примеры того, как использовать оба?
Комментарии:
1. Я думаю, что вы могли бы быть пионером в этом каким-то образом. Я даже не слышал о behat. на сайте это звучит и выглядит полезным.
2. Какие элементы вашего приложения вы хотите протестировать? Полный стек, пользовательский интерфейс, API? Существует ряд различных подходов в зависимости от ваших целей тестирования.
Ответ №1:
У меня получилось. Она работает с PHPUnit
и Zend_Test
, поэтому вы можете использовать все эти изящные assertXYZ()
методы. Во-первых, убедитесь, что он behat
установлен и доступен в вашей системе $PATH
. Я сделал следующее:
sudo pear channel-discover pear.symfony.com
sudo pear channel-discover pear.behat.org
sudo pear install behat/behat
Теперь создайте структуру каталогов следующим образом:
features
application
ControllerTestCase.php
bootstrap
FeatureContext.php
homepage.feature
features/application/ControllerTestCase.php
Класс типичен для Zend_Test
тестируемой реализации:
<?php
require_once 'Zend/Application.php';
require_once 'Zend/Test/PHPUnit/ControllerTestCase.php';
class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase {
public $application;
public function setUp() {
$this->application = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH
. '/configs/application.ini');
$this->bootstrap = array($this, 'appBootstrap');
parent::setUp();
}
public function appBootstrap(){
$this->application->bootstrap();
}
}
features/bootstrap/FeatureContext.php
Класс — это то, что нужно Behat для начальной загрузки:
<?php
use BehatBehatContextClosuredContextInterface,
BehatBehatContextTranslatedContextInterface,
BehatBehatContextBehatContext,
BehatBehatExceptionPendingException;
use BehatGherkinNodePyStringNode,
BehatGherkinNodeTableNode;
require_once 'PHPUnit/Autoload.php';
require_once 'PHPUnit/Framework/Assert/Functions.php';
define('APPLICATION_ENV', 'testing');
define('APPLICATION_PATH', dirname(__FILE__) . '/../path/to/your/zf/application');
set_include_path('.' . PATH_SEPARATOR . APPLICATION_PATH . '/../library'
. PATH_SEPARATOR . get_include_path());
require_once dirname(__FILE__) . '/../application/ControllerTestCase.php';
class FeatureContext extends BehatContext {
protected $app;
/**
* Initializes context.
* Every scenario gets it's own context object.
*
* @param array $parameters context parameters (set up via behat.yml)
*/
public function __construct(array $parameters) {
$this->app = new ControllerTestCase();
$this->app->setUp();
}
/**
* @When /^I load the URL "([^"]*)"$/
*/
public function iLoadTheURL($url) {
$this->app->dispatch($url);
}
/**
* @Then /^the module should be "([^"]*)"$/
*/
public function theModuleShouldBe($desiredModule) {
$this->app->assertModule($desiredModule);
}
/**
* @Given /^the controller should be "([^"]*)"$/
*/
public function theControllerShouldBe($desiredController) {
$this->app->assertController($desiredController);
}
/**
* @Given /^the action should be "([^"]*)"$/
*/
public function theActionShouldBe($desiredAction) {
$this->app->assertAction($desiredAction);
}
/**
* @Given /^the page should contain a "([^"]*)" tag that contains "([^"]*)"$/
*/
public function thePageShouldContainATagThatContains($tag, $content) {
$this->app->assertQueryContentContains($tag, $content);
}
/**
* @Given /^the action should not redirect$/
*/
public function theActionShouldNotRedirect() {
$this->app->assertNotRedirect();
}
}
И теперь вы можете писать такие функции, как features/homepage.feature
:
Feature: Homepage
In order to know ZF works with Behat
I need to see that the page loads.
Scenario: Check the homepage
Given I load the URL "/index"
Then the module should be "default"
And the controller should be "index"
And the action should be "index"
And the action should not redirect
And the page should contain a "title" tag that contains "My Nifty ZF App"
Чтобы запустить тесты, cd
перейдите в каталог, содержащий features
папку, и введите behat
.
Удачи!
Комментарии:
1. Есть ли способ сохранить определения шагов в отдельных файлах? Не все из них в одном
FeatureContext
классе?2. похоже, у меня это не работает. должно быть, загрузчик ZF вызывается несколько раз, потому что я получаю «Постоянные уже определенные» ошибки
Ответ №2:
Codeception имеет модуль для Zend Framework. Это очень похоже на Behat, но тесты написаны на PHP DSL, а не на Gherkin.
Ответ №3:
Мой сценарий всегда останавливался на первом шаге. Я, наконец, понял это, где-то в моем коде была кнопка die или и exit, которая останавливала выполнение. Поэтому убедитесь, что в вашем приложении нет элементов die или exit. Теперь все работает нормально.