Фреймворк для автоматического тестирования PHP проектов Codeception обзавелся первым серьезным апдейтом. Пришлось перелопатить всё ядро, всё поломать, всё починить и сделать это так, чтобы не сломать обратную совместимость. Как результат, теперь в тестах можно использовать любой PHP-код, а не только сценарий, добавилась возможность находить элементы по XPath, а также появилась возможность использования модулей Codeception в тестах PHPUnit.
В комментариях одной из прошлых статей хабровчанин sqrt спросил: «возможно ли при вызове метода хэлпера вернуть результат, чтоб его можно было использовать в сценарии тестирования?» Например, вот так:
Раньше так сделать не получалось, а в новой версии можно. Добавились специальные команды — грабберы. Они все начинаются с префикса «grab» и теперь включены практически во все модули.
Так что теперь вам придется реже писать свои хэлперы, а большинство задач можно будет сделать сразу в тесте. К тому же, теперь в тесте можно писать любой PHP код. Казалось бы, зачем это нужно — пусть тест имеет четкую структуру, и незачем давать разработчику писать всё что угодно. В отсутствии строгих правил тест наверняка потеряет читабельность. Но строгие правила остаются, а вот возможность вставлять PHP упрощает работу с фикстурами.
Например:
Пользователь $user1 был загружен из файла user_data.php и удален в конце теста.
Ранее в Codeception практиковалась следующая стратегия: все данные одинаково вгружаются и очищаются для всех тестов в группе. Теперь разработчикам предоставлена большая гибкость в работе с данными.
Необходимо пояснить, что вставляя любой код нужно указывать когда он должен выполнятся: на анализе сценария или уже во время его выполнения. Собственно, для этого и нужны блоки if ($scenario->preload()) и if ($scenario->running()).
Как непрямое следствие проведенного рефакотринга, теперь в PHPUnit тестах можно использовать модули Codeception. Т.е. впринципе сценарии можно выбросить и писать все приемочные тесты на PHPUnit. Всё будет выглядеть примерно вот так:
Но лично я бы рекомендовал использовать подобные возможности для написания интеграционных тестов. Модули для работы с базой данных или ORM Doctrine будут там очень даже кстати.
Ну и напоследок об ещё одном нововведении. Теперь тесты могут находить элементы по XPath локаторам. При этом не были введены никакие новые команды в существующие модули. Там где ранее использовались CSS селекторы, теперь можно использовать и XPath локаторы.
Вот вроде и всё. Спасибо за внимание. Тестируйте!
Подробности релиза в официальном блоге.
В комментариях одной из прошлых статей хабровчанин 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 локаторы.
Вот вроде и всё. Спасибо за внимание. Тестируйте!
Подробности релиза в официальном блоге.
