Фреймворк для автоматического тестирования PHP проектов Codeception обзавелся первым серьезным апдейтом. Пришлось перелопатить всё ядро, всё поломать, всё починить и сделать это так, чтобы не сломать обратную совместимость. Как результат, теперь в тестах можно использовать любой PHP-код, а не только сценарий, добавилась возможность находить элементы по XPath, а также появилась возможность использования модулей Codeception в тестах PHPUnit.
В комментариях одной из прошлых статейин sqrt спросил: «возможно ли при вызове метода хэлпера вернуть результат, чтоб его можно было использовать в сценарии тестирования?» Например, вот так:
$token = $I->grabTextValueFrom('#token');
$I->fillField('token', $token);
Раньше так сделать не получалось, а в новой версии можно. Добавились специальные команды — грабберы. Они все начинаются с префикса «grab» и теперь включены практически во все модули.
Так что теперь вам придется реже писать свои хэлперы, а большинство задач можно будет сделать сразу в тесте. К тому же, теперь в тесте можно писать любой PHP код. Казалось бы, зачем это нужно — пусть тест имеет четкую структуру, и незачем давать разработчику писать всё что угодно. В отсутствии строгих правил тест наверняка потеряет читабельность. Но строгие правила остаются, а вот возможность вставлять PHP упрощает работу с фикстурами.
Например:
<?php
if ($scenario->preload()) {
require 'user_data.php'
}
$I = new TestGuy($scenario);
$I->amLoggedAs($user1);
$I->click('Log In');
$I->see("Hello, ".$user1->name);
if ($scenario->running()) {
$user1->delete();
}
?>
Пользователь $user1 был загружен из файла user_data.php и удален в конце теста.
Ранее в Codeception практиковалась следующая стратегия: все данные одинаково вгружаются и очищаются для всех тестов в группе. Теперь разработчикам предоставлена большая гибкость в работе с данными.
Необходимо пояснить, что вставляя любой код нужно указывать когда он должен выполнятся: на анализе сценария или уже во время его выполнения. Собственно, для этого и нужны блоки if ($scenario->preload()) и if ($scenario->running()).
Как непрямое следствие проведенного рефакотринга, теперь в PHPUnit тестах можно использовать модули Codeception. Т.е. впринципе сценарии можно выбросить и писать все приемочные тесты на PHPUnit. Всё будет выглядеть примерно вот так:
public function testUserIsLoggedIn()
{
$user = User::find(1);
$user->setPassword('qwerty');
$user->save();
$this->testGuy->amOnPage('/login');
$this->testGuy->submitForm('#login', array('username' => $user->name, 'password' => 'qwerty'));
$this->testGuy->see('Hello, '.$user->name);
}
Но лично я бы рекомендовал использовать подобные возможности для написания интеграционных тестов. Модули для работы с базой данных или ORM Doctrine будут там очень даже кстати.
Ну и напоследок об ещё одном нововведении. Теперь тесты могут находить элементы по XPath локаторам. При этом не были введены никакие новые команды в существующие модули. Там где ранее использовались CSS селекторы, теперь можно использовать и XPath локаторы.
Вот вроде и всё. Спасибо за внимание. Тестируйте!
Подробности релиза в официальном блоге.
Автор: Davert