Тестирование на приемку
Тестирование на приемку может выполняться непрограммистом. Это может быть ваш тестировщик, менеджер или даже клиент. Если вы разрабатываете веб-приложение (а вы, вероятно, это делаете), тестировщику потребуется только веб-браузер, чтобы проверить корректность работы вашего сайта. Вы можете воспроизвести действия тестировщика на приемку в сценариях и выполнить их автоматически. Codeception поддерживает чистые и простые тесты, как будто они были записаны по словам реального тестировщика на приемку.
Не имеет значения, какая (если таковая имеется) CMS или фреймворк используется на сайте. Вы даже можете тестировать сайты, созданные с использованием различных языков программирования, таких как Java, .NET и т.д. Всегда рекомендуется добавлять тесты на ваш веб-сайт. По крайней мере, вы будете уверены, что функции сайта работают после последних изменений.
Пример сценария
Предположим, первый тест, который вы хотите выполнить, это вход в систему. Для написания такого теста нам все еще потребуется базовое знание PHP и HTML:
<?php
$I->amOnPage('/login');
$I->fillField('username', 'davert');
$I->fillField('password', 'qwerty');
$I->click('LOGIN');
$I->see('Welcome, Davert!'); Этот сценарий может быть выполнен как с помощью PhpBrowser, так и с помощью «реального» браузера через WebDriver.
| PhpBrowser | WebDriver | |
|---|---|---|
| Двигатель браузера | Guzzle + Symfony BrowserKit | Chrome или Firefox |
| JavaScript | Нет | Да |
see/seeElement проверяет, если… | …текст присутствует в исходном коде HTML | …текст действительно виден пользователю |
| Доступ к заголовкам и кодам состояния HTTP ответа | Да | Нет |
| Системные требования | PHP с ext-curl | Chrome или Firefox; необязательно с Selenium Standalone Server |
| Скорость | Быстро | Медленно |
Мы начнем писать наши первые тесты на приемку с PhpBrowser.
PhpBrowser
Это самый быстрый способ выполнения тестов на приемку, так как он не требует запуска реального браузера. Мы используем PHP веб-скрейпер, который действует как браузер: он отправляет запрос, затем получает и анализирует ответ. Codeception использует Guzzle и Symfony BrowserKit для взаимодействия с HTML веб-страницами.
Общие недостатки PhpBrowser:
- Вы можете кликать только по ссылкам с валидными URL-адресами или кнопкам отправки форм
- Вы не можете заполнять поля, которые не находятся внутри формы
Нам нужно указать параметр url в конфигурации набора тестов на приемку:
# acceptance.suite.yml
actor: AcceptanceTester
modules:
enabled:
- PhpBrowser:
url: http://www.example.com/
- \Helper\Acceptance Мы должны начать с создания теста с помощью следующей команды:
vendor/bin/codecept g:cest acceptance Signin
Он будет размещен в каталоге tests/acceptance.
<?php
class SigninCest
{
public function tryToTest(AcceptanceTester $I)
{
}
} Объект $I используется для записи всех взаимодействий. Методы объекта $I взяты из модуля PhpBrowser. Мы кратко опишем их здесь:
<?php
$I->amOnPage('/login'); Мы будем предполагать, что все действия, начинающиеся с am и have, описывают начальную среду. Действие amOnPage устанавливает стартовую точку теста на странице /login.
С помощью PhpBrowser вы можете нажимать на ссылки и заполнять формы. Это, вероятно, будет большая часть ваших действий.
Click
Эмулирует щелчок по валидным якорям. Будет открыт URL, указанный в атрибуте href. В качестве параметра можно указать имя ссылки или допустимый селектор CSS или XPath.
<?php
$I->click('Log in');
// CSS selector applied
$I->click('#login a');
// XPath
$I->click('//a[@id=login]');
// Using context as second argument
$I->click('Login', '.nav'); Codeception пытается найти элемент по его тексту, имени, CSS или XPath. Вы можете вручную указать тип локатора, передав массив в качестве параметра. Мы называем это **строгим локатором**. Доступные типы строгих локаторов:
- id
- name
- css
- xpath
- link
- class
<?php // By specifying locator type $I->click(['link' => 'Login']); $I->click(['class' => 'btn']);
Существует специальный класс Codeception\Util\Locator, который может помочь вам генерировать сложные локаторы XPath. Например, он может легко позволить вам нажать на элемент в последней строке таблицы:
$I->click('Edit' , \Codeception\Util\Locator::elementAt('//table/tr', -1)); Формы
Нажатие на ссылки, вероятно, не занимает больше всего времени во время тестирования веб-сайта. Большинство затрат времени приходится на тестирование форм. Codeception предоставляет несколько способов тестирования форм.
Давайте отправим эту тестовую форму внутри теста Codeception:
<form method="post" action="/update" id="update_form">
<label for="user_name">Name</label>
<input type="text" name="user[name]" id="user_name" />
<label for="user_email">Email</label>
<input type="text" name="user[email]" id="user_email" />
<label for="user_gender">Gender</label>
<select id="user_gender" name="user[gender]">
<option value="m">Male</option>
<option value="f">Female</option>
</select>
<input type="submit" name="submitButton" value="Update" />
</form> С точки зрения пользователя, форма состоит из полей, которые необходимо заполнить, а затем нажать кнопку отправки:
<?php
// we are using label to match user_name field
$I->fillField('Name', 'Miles');
// we can use input name or id
$I->fillField('user[email]','miles@davis.com');
$I->selectOption('Gender','Male');
$I->click('Update'); Чтобы сопоставить поля по их меткам, вы должны написать атрибут for в теге label.
С точки зрения разработчика, отправка формы — это просто отправка валидного запроса POST на сервер. Иногда проще заполнить все поля сразу и отправить форму без нажатия кнопки «Отправить». Аналогичный сценарий можно переписать всего одной командой:
<?php
$I->submitForm('#update_form', array('user' => array(
'name' => 'Miles',
'email' => 'Davis',
'gender' => 'm'
))); submitForm не эмулирует действия пользователя, но весьма полезно в ситуациях, когда форма отформатирована неправильно, например, для обнаружения того, что метки не заданы или что у полей нечистые имена или плохо написанные ID, или форма отправляется с помощью вызова JavaScript.
По умолчанию submitForm не отправляет значения для кнопок. Последний параметр позволяет указать, какие значения кнопок следует отправить, или значения кнопок можно явно указать во втором параметре:
<?php
$I->submitForm('#update_form', array('user' => array(
'name' => 'Miles',
'email' => 'Davis',
'gender' => 'm'
)), 'submitButton');
// this would have the same effect, but the value has to be explicitly specified
$I->submitForm('#update_form', array('user' => array(
'name' => 'Miles',
'email' => 'Davis',
'gender' => 'm',
'submitButton' => 'Update'
))); Скрытие конфиденциальных данных
Если вам нужно заполнить конфиденциальные данные (например, пароли) и скрыть их в логах, вы можете передать экземпляр \Codeception\Step\Argument\PasswordArgument с данными, которые необходимо скрыть.
<?php
use \Codeception\Step\Argument\PasswordArgument;
$I->amOnPage('/form/password_argument');
$I->fillField('password', new PasswordArgument('thisissecret')); thisissecret будет заполнен в форму, но не будет отображаться в выводе и логах.
Ассершены
В PhpBrowser вы можете проверить содержимое страницы. В большинстве случаев вам нужно просто проверить, что необходимый текст или элемент присутствуют на странице.
Самый полезный метод для этого — see():
<?php
// We check that 'Thank you, Miles' is on the page.
$I->see('Thank you, Miles');
// We check that 'Thank you, Miles' is inside an element with 'notice' class.
$I->see('Thank you, Miles', '.notice');
// Or using XPath locators
$I->see('Thank you, Miles', "//table/tr[2]");
// We check this message is *not* on the page.
$I->dontSee('Form is filled incorrectly'); Вы можете проверить, существует ли определенный HTML-элемент (или нет) на странице:
<?php
$I->seeElement('.notice');
$I->dontSeeElement('.error'); У нас также есть другие полезные команды для выполнения проверок. Обратите внимание, что все они начинаются с префикса see:
<?php
$I->seeInCurrentUrl('/user/miles');
$I->seeCheckboxIsChecked('#agree');
$I->seeInField('user[name]', 'Miles');
$I->seeLink('Login'); Условные утверждения
Обычно, как только какое-либо утверждение терпит неудачу, дальнейшие утверждения в этом тесте пропускаются. Иногда вы не хотите этого — возможно, у вас есть длительный тест, и вы хотите, чтобы он проходил до конца. В этом случае вы можете использовать условные утверждения. Каждый метод see имеет соответствующий метод canSee , и dontSee имеет метод cantSee:
<?php
$I->canSeeInCurrentUrl('/user/miles');
$I->canSeeCheckboxIsChecked('#agree');
$I->cantSeeInField('user[name]', 'Miles'); Каждое неудачное утверждение будет показано в результатах теста, но не остановит тест.
Условные утверждения отключены в настройках запуска. Чтобы включить их, вы должны добавить соответствующие декораторы шагов в конфигурацию набора тестов:
Если вы начинали проект как
codecept init acceptance, они должны быть уже включены в конфигурацию
# in acceptance.suite.yml # or in codeception.yml inside suites section step_decorators: - \Codeception\Step\ConditionalAssertion
Затем перестройте актеров с помощью команды codecept build.
Комментарии
В рамках длинного сценария вы должны описать, какие действия вы собираетесь выполнить и какие результаты должны быть достигнуты. Методы комментариев, такие как amGoingTo, expect, expectTo помогут вам сделать тесты более описательными:
<?php
$I->amGoingTo('submit user form with invalid values');
$I->fillField('user[email]', 'miles');
$I->click('Update');
$I->expect('the form is not submitted');
$I->see('Form is filled incorrectly'); Сборщики
Эти команды извлекают данные, которые можно использовать в тесте. Представьте, что ваш сайт генерирует пароль для каждого пользователя, и вы хотите проверить, может ли пользователь войти в систему с помощью этого пароля:
<?php
$I->fillField('email', 'miles@davis.com');
$I->click('Generate Password');
$password = $I->grabTextFrom('#password');
$I->click('Login');
$I->fillField('email', 'miles@davis.com');
$I->fillField('password', $password);
$I->click('Log in!'); Сборщики позволяют получить одно значение с текущей страницы с помощью команд:
<?php
$token = $I->grabTextFrom('.token');
$password = $I->grabTextFrom("descendant::input/descendant::*[@id = 'password']");
$api_key = $I->grabValueFrom('input[name=api]'); Cookies, URL, Заголовок и т.д.
Действия для cookies:
<?php
$I->setCookie('auth', '123345');
$I->grabCookie('auth');
$I->seeCookie('auth'); Действия для проверки заголовка страницы:
<?php
$I->seeInTitle('Login');
$I->dontSeeInTitle('Register'); Действия для URL:
<?php
$I->seeCurrentUrlEquals('/login');
$I->seeCurrentUrlMatches('~^/users/(\d+)~');
$I->seeInCurrentUrl('user/1');
$user_id = $I->grabFromCurrentUrl('~^/user/(\d+)/~'); WebDriver
Приятная особенность Codeception заключается в том, что большинство сценариев похожи, независимо от того, как они выполняются. PhpBrowser эмулировал запросы браузера, но как выполнить такой тест в реальном браузере, таком как Chrome или Firefox? Selenium WebDriver может управлять ими, поэтому в наших тестах на приемку мы можем автоматизировать сценарии, которые мы раньше тестировали вручную. В таких тестах мы должны больше сосредоточиться на **тестировании пользовательского интерфейса**, чем на тестировании функциональности.
«WebDriver» — это название протокола (определенного W3C) для автоматического управления браузерами. Этот стандарт реализован для всех современных настольных и мобильных браузеров. Codeception использует php-webdriver/php-webdriver в качестве PHP-реализации протокола WebDriver.
Для управления браузерами вам необходимо использовать программу или службу для запуска/остановки сессий браузера. В следующем разделе мы рассмотрим самые популярные решения.
Локальная настройка
Сервер Selenium
Selenium требуется для запуска и управления браузерами из Codeception. Сервер Selenium должен быть установлен и запущен перед запуском тестов.
Самый быстрый способ получения Selenium — использование пакета NodeJS selenium-standalone. Он автоматически устанавливает Selenium и все необходимые зависимости и запускает сервер. Для этого требуются **NodeJS и Java**.
npm install selenium-standalone -g
selenium-standalone install
Запустите эту команду в отдельном терминале:
selenium-standalone start

Теперь вы готовы запускать тесты WebDriver с помощью Codeception.
В качестве альтернативы сервер Selenium можно установить вручную. Загрузите его с официального сайта и запустите сервер с помощью Java:
java -jar selenium-server-....jar. В этом случае ChromeDriver и GeckoDriver необходимо установить отдельно.
- Дополнительную информацию можно найти в инструкции по установке
- Включите расширение RunProcess для автоматического запуска/остановки Selenium (необязательно).
Конфигурация
Для выполнения теста в браузере необходимо изменить конфигурацию набора тестов для использования модуля **WebDriver**.
Измените файл acceptance.suite.yml:
actor: AcceptanceTester
modules:
enabled:
- WebDriver:
url:
browser: chrome
- \Helper\Acceptance Подробности см. в модуле WebDriver.
Обратите внимание, что действия, выполняемые в браузере, будут вести себя иначе. Например, seeElement не просто проверит, существует ли элемент на странице, но также проверит, что элемент действительно виден пользователю:
<?php
$I->seeElement('#modal'); В то время как WebDriver дублирует функциональность PhpBrowser, у него есть свои ограничения: он не может проверять заголовки, так как браузеры не предоставляют для этого API. WebDriver также добавляет функциональность, специфичную для браузера:
Ожидание
При тестировании веб-приложения вам может потребоваться подождать, пока произойдут события JavaScript. Из-за своей асинхронной природы сложные взаимодействия JavaScript трудно тестировать. Именно поэтому вам может потребоваться использовать ожидатели, действия с префиксом wait. Они могут быть использованы для указания события, которое, по вашему ожиданию, должно произойти на странице, прежде чем продолжить тест.
Например:
<?php
$I->waitForElement('#agree_button', 30); // secs
$I->click('#agree_button'); В этом случае мы ожидаем появления кнопки «согласиться», а затем нажимаем на неё. Если она не появится через 30 секунд, тест завершится ошибкой. Есть и другие wait методы, которые вы можете использовать, такие как waitForText, waitForElementVisible и другие.
Если вы не знаете, какое именно элемент нужно ждать, вы можете просто приостановить выполнение, используя $I->wait()
<?php $I->wait(3); // wait for 3 secs
Умное ожидание
Возможна отсрочка поиска элементов до их появления на странице. Если тест использует элемент, который еще не находится на странице, Codeception подождет несколько дополнительных секунд перед завершением с ошибкой. Эта функция основана на неявном ожидании Selenium. Codeception включает неявное ожидание только при поиске конкретного элемента и отключает его во всех остальных случаях. Таким образом, производительность теста не страдает.
Умное ожидание можно включить, установив wait параметр в конфигурации WebDriver. Он ожидает количество секунд ожидания. Пример:
wait: 5
С этой конфигурацией у нас есть следующий тест:
<?php // we use wait: 5 instead of // $I->waitForElement(['css' => '#click-me'], 5); // to wait for element on page $I->click(['css' => '#click-me']);
Важно понимать, что умное ожидание работает только с определенными локерами:
-
#locator— CSS ID локатор, работает -
//locator— общий XPath локатор, работает -
['css' => 'button'']— строгий локатор, работает
Но он не будет выполнен для всех других типов локеров. Посмотрите пример:
<?php
$I->click('Login'); // DISABLED, not a specific locator
$I->fillField('user', 'davert'); // DISABLED, not a specific locator
$I->fillField(['name' => 'password'], '123456'); // ENABLED, strict locator
$I->click('#login'); // ENABLED, locator is CSS ID
$I->see('Hello, Davert'); // DISABLED, Not a locator
$I->seeElement('#userbar'); // ENABLED
$I->dontSeeElement('#login'); // DISABLED, can't wait for element to hide
$I->seeNumberOfElements(['css' => 'button.link'], 5); // DISABLED, can wait only for one element Повтор
Когда трудно определить условие ожидания, можно повторить команду несколько раз, пока она не выполнится успешно. Например, если вы пытаетесь нажать, пока идёт анимация, вы можете попробовать сделать это несколько раз, пока она не замрёт. Начиная с Codeception 3.0 каждое действие и утверждение имеют псевдоним, начинающийся с retry, что позволяет повторно выполнить нестабильную команду.
<?php
$I->retryClick('flaky element');
$I->retrySee('Something changed'); Повтор можно настроить с помощью команды $I->retry(), где можно задать количество повторов и начальный интервал: интервал будет удваиваться при каждом неудачном выполнении.
<?php // Retry up to 6 sec: 4 times, for 400ms initial interval => 400ms + 800ms + 1600ms + 3200ms = 6000ms $I->retry(4, 400);
$I->retry принимает 2 параметра:
- количество повторов (по умолчанию 1)
- начальный интервал (по умолчанию 200 мс)
Повтор по умолчанию отключён. Чтобы включить его, необходимо добавить декораторы шагов повтора в конфигурацию комплекта:
Если вы начинали проект как
codecept init acceptance, они должны быть уже включены в конфигурацию
# in acceptance.suite.yml # or in codeception.yml inside suites section step_decorators: - \Codeception\Step\Retry
Затем добавьте \Codeception\Lib\Actor\Shared\Retry трайт в AcceptanceTester класс:
<?php
class AcceptanceTester extends \Codeception\Actor
{
use _generated\AcceptanceTesterActions;
use \Codeception\Lib\Actor\Shared\Retry;
} Запустите codecept build для повторного создания действий. Новые retry* действия доступны для тестов. Имейте в виду, что вы можете динамически изменить политику повтора для каждого теста.
Ожидание и действие
Для сочетания waitForElement с действиями внутри этого элемента можно использовать метод performOn. Давайте посмотрим, как можно выполнить некоторые действия внутри всплывающего окна HTML:
<?php
$I->performOn('.confirm', \Codeception\Util\ActionSequence::build()
->see('Warning')
->see('Are you sure you want to delete this?')
->click('Yes')
); В качестве альтернативы это можно выполнить с помощью обратного вызова, в этом случае экземпляр WebDriver передаётся в качестве аргумента
<?php
$I->performOn('.confirm', function(\Codeception\Module\WebDriver $I) {
$I->see('Warning');
$I->see('Are you sure you want to delete this?');
$I->click('Yes');
}); Для получения дополнительной информации см. performOn() ссылку на справку.
A/B-тестирование
Когда веб-сайт действует непредсказуемо, вам может потребоваться отреагировать на это изменение. Это происходит, если сайт настроен для A/B-тестирования или отображает разные всплывающие окна в зависимости от среды.
С Codeception 3.0 вы можете иметь некоторые действия, которые будут молча завершаться ошибкой, если произойдёт ошибка. Допустим, вы открываете страницу, и иногда там есть всплывающее окно, которое нужно закрыть. Мы можем попытаться нажать кнопку «Закрыть», но если это действие завершается ошибкой (всплывающего окна на странице нет), мы просто продолжаем тест.
Вот как это можно реализовать:
<?php
$I->amOnPage('/');
$I->tryToClick('x', '.alert');
// continue execution Вы также можете использовать tryTo в качестве условия для своих тестов:
<?php
if ($I->tryToSeeElement('.alert')) {
$I->waitForText('Do you accept cookies?');
$I->click('Yes');
} A/B-тестирование по умолчанию отключено. Чтобы включить его, необходимо добавить соответствующие декораторы шагов в конфигурацию комплекта:
Если вы начинали проект как
codecept init acceptanceв Codeception >= 3.0, они должны быть уже включены в конфигурацию
# in acceptance.suite.yml # or in codeception.yml inside suites section step_decorators: - \Codeception\Step\TryTo
Затем перестройте актеров с помощью команды codecept build.
Тестирование в нескольких сессиях
Codeception позволяет выполнять действия в одновременных сессиях. Наиболее очевидным случаем для этого является тестирование реального времени обмена сообщениями между пользователями на сайте. Для этого вам нужно будет запустить два окна браузера одновременно для одного и того же теста. Codeception имеет очень умную концепцию для этого. Она называется Друзья:
<?php
$I->amOnPage('/messages');
$nick = $I->haveFriend('nick');
$nick->does(function(AcceptanceTester $I) {
$I->amOnPage('/messages/new');
$I->fillField('body', 'Hello all!');
$I->click('Send');
$I->see('Hello all!', '.message');
});
$I->wait(3);
$I->see('Hello all!', '.message'); В этом случае мы выполнили или «сделали» некоторые действия во втором окне с помощью метода does на объекте друга.
Иногда вам может потребоваться закрыть веб-страницу перед окончанием теста. В таких случаях вы можете использовать leave(). Вы также можете указать роли для друга:
<?php
$nickAdmin = $I->haveFriend('nickAdmin', adminStep::class);
$nickAdmin->does(function(adminStep $I) {
// Admin does ...
});
$nickAdmin->leave(); Тестирование в нескольких сессиях по умолчанию отключено. Чтобы включить его, добавьте \Codeception\Lib\Actor\Shared\Friend в AcceptanceTester.
<?php
class AcceptanceTester extends \Codeception\Actor
{
use _generated\AcceptanceTesterActions;
use \Codeception\Lib\Actor\Shared\Friend;
} Тестирование в облаке
Некоторые среды трудно воспроизвести вручную, тестирование Internet Explorer 6-8 на Windows XP может быть сложной задачей, особенно если у вас нет установленной Windows XP. Именно здесь службы облачного тестирования приходят на помощь. Такие сервисы, как SauceLabs, BrowserStack и другие могут создавать виртуальные машины по требованию и настраивать Selenium Server и нужный браузер. Тесты выполняются на удалённой машине в облаке, для доступа к локальным файлам службы облачного тестирования предоставляют специальное приложение под названием Тунель. Тунель работает по защищённому протоколу и позволяет браузерам, запущенным в облаке, подключаться к локальному веб-серверу.
Услуги облачного тестирования работают со стандартным протоколом WebDriver. Это значительно упрощает настройку облачного тестирования. Вам просто нужно настроить конфигурацию WebDriver, чтобы:
- указать хост для подключения (зависит от поставщика облачных услуг)
- данные для аутентификации (для использования вашей учётной записи)
- браузер
- ОС
Рекомендуется использовать параметры для предоставления учетных данных авторизации.
Следует отметить, что службы облачного тестирования не бесплатны. Вам следует изучить их ценовые модели и выбрать подходящий вариант. Они также могут работать очень медленно, если время пинга между локальным сервером и облаком слишком велико. Это может привести к случайным сбоям в приемочных тестах.
Отладка
Модули Codeception могут выводить ценную информацию во время выполнения. Просто выполните тесты с опцией --debug для просмотра подробностей выполнения. Для любого пользовательского вывода используйте функцию codecept_debug:
<?php
codecept_debug($I->grabTextFrom('#name')); При каждом сбое снимок последней отображённой страницы будет сохранён в директории tests/_output. PhpBrowser сохранит код HTML, а WebDriver — скриншот страницы.
Дополнительные функции отладки Codeception:
- Интерактивная пауза — это REPL, который позволяет вводить и проверять команды для мгновенной обратной связи.
- Плагин записи позволяет записывать тесты пошагово и отображать их в виде слайд-шоу
Общие случаи
Давайте посмотрим, как с помощью Codeception можно решить распространённые проблемы приемочного тестирования.
Вход
Рекомендуется поместить широко используемые действия в класс актёра. Хорошим примером является действие login, которое, вероятно, будет активно участвовать в приемочном или функциональном тестировании:
<?php
class AcceptanceTester extends \Codeception\Actor
{
// do not ever remove this line!
use _generated\AcceptanceTesterActions;
public function login($name, $password)
{
$I = $this;
$I->amOnPage('/login');
$I->submitForm('#loginForm', [
'login' => $name,
'password' => $password
]);
$I->see($name, '.navbar');
}
} Теперь вы можете использовать метод login в своих тестах:
<?php
// $I is AcceptanceTester
$I->login('miles', '123456'); Однако реализация всех действий для повторного использования в одном классе актёра может привести к нарушению принципа единственной ответственности.
Единоразовый вход
Если вам нужно авторизовать пользователя для каждого теста, вы можете сделать это, отправив форму входа в начале каждого теста. Выполнение этих шагов занимает время, и в случае тестов Selenium (которые сами по себе медленные) эта потеря времени может стать существенной.
Codeception позволяет обмениваться куки между тестами, так что тестовый пользователь может оставаться вошедшим в систему для других тестов.
Давайте улучшим код нашего метода login, выполняя отправку формы только один раз и восстанавливая сеанс из куки для каждого последующего вызова функции входа в систему:
<?php
public function login($name, $password)
{
$I = $this;
// if snapshot exists - skipping login
if ($I->loadSessionSnapshot('login')) {
return;
}
// logging in
$I->amOnPage('/login');
$I->submitForm('#loginForm', [
'login' => $name,
'password' => $password
]);
$I->see($name, '.navbar');
// saving snapshot
$I->saveSessionSnapshot('login');
} Обратите внимание, что восстановление сессии работает только для модулей WebDriver (модулей, реализующих Codeception\Lib\Interfaces\SessionSnapshot).
Настройка сессий браузера
По умолчанию модуль WebDriver настроен на автоматический запуск браузера перед тестом и остановку после него. Однако это можно отключить с помощью конфигурации модуля start: false. Чтобы запустить браузер, вам нужно написать соответствующие методы в приемочном помощнике.
Модуль WebDriver предоставляет расширенные методы для сессии браузера, но ими можно пользоваться только из помощников.
- _initializeSession — запускает новую сессию браузера
- _closeSession — останавливает сессию браузера
- _restart — обновляет конфигурацию и перезапускает браузер
- _capabilities — программно устанавливает желаемые возможности.
Эти методы можно использовать для создания пользовательских команд, например, $I->startBrowser() или использовать в before/after хуках.
Отчёт об ошибках
По умолчанию Codeception использует уровень отчёта об ошибках E_ALL & ~E_STRICT & ~E_DEPRECATED. В приемочных тестах вам может понадобиться изменить этот уровень в зависимости от политики ошибок вашей среды. Уровень отчёта об ошибках можно задать в файле конфигурации комплекта:
actor: AcceptanceTester ... error_level: E_ALL & ~E_STRICT & ~E_DEPRECATED
error_level также можно установить глобально в файле codeception.yml. Для этого необходимо указать error_level в качестве части settings. Более подробная информация доступна в разделе Глобальная настройка. Обратите внимание, что значение error_level для конкретного набора будет переопределять глобальное значение.
Заключение
Написание приемочных тестов с помощью Codeception и PhpBrowser — это хорошее начало. Вы можете легко тестировать ваши сайты Joomla, Drupal, WordPress, а также те, которые созданы с использованием фреймворков. Написание приемочных тестов похоже на описание действий тестировщика на PHP. Они достаточно читабельны и очень легко пишутся. Если вам нужно получить доступ к базе данных, вы можете использовать модуль Db.
- Следующая глава: FunctionalTests >
- Предыдущая глава: < GettingStarted
© 2011 Michael Bodnarchuk and contributors
Licensed under the MIT License.
https://codeception.com/docs/03-AcceptanceTests