Как стать автором
Обновить

Вышел Codeception 1.1

Время на прочтение2 мин
Количество просмотров2K
Фреймворк для автоматического тестирования 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 локаторы.

Вот вроде и всё. Спасибо за внимание. Тестируйте!
Подробности релиза в официальном блоге.
Теги:
Хабы:
Всего голосов 22: ↑21 и ↓1+20
Комментарии8

Публикации

Истории

Работа

Ближайшие события