Вышел Codeception 1.1

в 12:01, , рубрики: bdd, codeception, php, qa, tdd, тестирование, метки: , , ,

Фреймворк для автоматического тестирования 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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js