Закинула меня судьбинушка заниматься тестированием на PHP. В компании уже немного укоренился Codeception. И вот о нём хочу спросить, оно действительно настолько дерьмово или я просто не умею пользоваться этой замечательной программой?
Претензия номер раз. Идея сделать код близким к человеческому языку не так хороша как может показаться. Вот пример из статьи на Хабре:
<?php
$I = new TestGuy($scenario);
$I->wantTo('create new blog post');
$I->amOnPage('/blog/posts');
$I->click('Create new post');
$I->fillField('Title','Codeception, a new way of testing!');
$I->fillField('Text','Codeception is new PHP full-stack testing framework.');
$I->click('Send');
$I->see('Congratulations, your post is successfully created!');
Выглядит круто. Но ближе к реальным тестам всё начнёт расползаться. Вот один из первых примеров из документации:
<?php
$I = new FunctionalTester($scenario);
$I->amOnPage('/');
$I->click('Sign Up');
$I->submitForm('#signup', ['username' => 'MilesDavis', 'email' => 'miles@davis.com']);
$I->see('Thank you for Signing Up!');
$I->seeEmailSent('miles@davis.com', 'Thank you for registration');
$I->seeInDatabase('users', ['email' => 'miles@davis.com']);
Уже пошли какие-то словари и массивы. В реальных тестах всё ещё хуже, ещё больше тест напоминает PHP и ещё меньше человеческий язык (на самом деле вообще не напоминает). То есть codeception'овые тесты не могут просматриваться, редактироваться, оцениваться, критиковаться, дополняться и т.п. никем кроме PHP-программистов. Идея теста на человеческом языке в таком виде провалилась.
Понимая это, в Codeception добавили возможность исполнения Gherkin-файлов. То есть сделали Cucumber/Behat (официальная реализация Cucumber'а на PHP), но с неповторимым вкусом говна. Мало того, что Codeception не поддерживает feature-файлы на языке отличном от английского (для менеджеров я бы хотел писать на русском), так ещё и в Codeception позабыли зачем хотели иметь тесты на человеческом языке. При исполнении gherkin-файлов в консоль не выводятся пройденные шаги. Более того даже с -v не выводятся. Step'ы будут выводится начиная с уровня -vv, а в какой строке в них случился exception только на уровне -vvv. То есть вывести в консоль сколько тестов прошло, сколько завалилось — это важно, а что при это делалось, в каких местах тесты падали — это совершенно не важно.
Далее. Я прочёл пару статей в защиту Codeception'а, которые даже размещены на сайте Codeception'а. Первая и вторая. Обе показались каким-то бредом, в котором всё перевёрнуто с ног на голову. Якобы код на codeception'е проще писать, потому что есть автодополнение. Аллё, feature-файлы вообще пишутся на естественном языке. Если вы не можете писать по-английски чего вам надо, то никакой autocomplete вам не поможет. А если вам нужно что-то за рамками стандартных функций Codeception'а, то опять же отсосайтунг, автокомплит не поможет. А нужно это часто. Авторы codeception'а рассчитывают, что стандартные функции покрывают 90% случаев. Хрен-то там, я бы не дал больше 50%. Да и те тривиальны, элементарно и быстро реализуются step'ами Behat'а.
Во второй статье автор тоже попытался всё вывернуть наизнанку
Don’t fall into a marketing trap. You will find yourself writing tests two times: as a feature in plain English and in code with PHP.
Это же и есть самое большое преимущество Behat'а и Cucumber'а! Кто-то, менеджер, product owner, другой программист или тестировщик может написать test case или usage scenario, а потом кто-то другой может это перевести с человеческого на машинный. Другими словами, один человек написал тест на Gherkin'е, и потом может другому объяснить что же в нём происходит. Точнее даже пояснять не придётся. Если написано «Кладу в блендер 1 банан/ Кладу в блендер 5 клубничин/Кладу в блендер стакан йогурта/Вижу в блендере смузи», то это и происходит, это и проверяется. Неподготовленные люди могут писать feature-файлы, но никто не станет писать тест на codeception/PHP. Cucumber позволяет иметь хоть какое-то описание чего же всем этим людям надо, а с codeception'ом тесты это вольная фантазия автора, и всякому ещё нужно будет пояснять что же в этих тестах происходит, проверяется и какой test case покрывает.
Так поясните же мне кто понимает, чем же этот codeception хорош? Кто в здравом уме станет им пользоваться?