Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Allure + Codeception + Dataprovider. В отчёт попадают только последние сценарии из DataProvider.

codeception
dataprovider
parallel
allure
Теги: #<Tag:0x00007f7b68c56dc8> #<Tag:0x00007f7b68c56ad0> #<Tag:0x00007f7b68c567b0> #<Tag:0x00007f7b68c564e0>

(Ugin Berets) #1

Пытаюсь настроить связку Allure + Codeception + DataProvider. Но в отчет Allure попадают только последние сценарии из DataProvider.


(Oleksandr Khotemskyi) #2

Покажите цикл.

А тесты реально проходят все? Или тоже только последний?


(Ugin Berets) #3

В репорте Codeception попадают все результаты - значит выполняются. А в xml файлах (которые генерятся для дальнейшего отчёта Allure) только последние сценарии. Тесты выполняются параллельно, хотя это вряд-ли как-то влияет. Скорее всего проблема в том, что имя у этих тестов одинаковое, и каждый следующий тест перезаписывает предыдущий.


(Vadim) #4

Я тоже сталкивался с такой проблемой, сделал хак в vendor/allure-framework/allure-codeception/src/Yandex/Allure/Adapter/AllureAdapter.php добавляя к названию теста номер итерации датапровайдера.

 public function testStart(TestEvent $testEvent)
    {
        $test = $testEvent->getTest();
        $testName = $this->testIteration > 1 ? $test->getName() . $this->testIteration : $test->getName();
        $test->getMetadata()->setName($testName);
        ....
    public function suiteBefore(SuiteEvent $suiteEvent)
    {
        $this->testIteration = 1;
        ...

    public function testStart(TestEvent $testEvent)
    {
       ....

        if (!is_null($test->getMetadata()->getParam('example'))) {
            $this->testIteration++;
        }
    }

Как сделать нормальный фикс не разобрался


(Ugin Berets) #5

Спасибо за ответ! Работает. Но я немного изменил код, взяв за основу вашу логику. И перенёс код из папки vendor в helper. Может кому-то пригодится.

public static $testIteration;

public function _beforeSuite($settings = array())
{
self::$testIteration = 1;
}

public function _before(\Codeception\TestInterface $test)
{
    $testExample = $test->getMetadata()->getCurrent('example');
    if ($testExample && isset($testExample['scenarioName'])) {
        $testName = $test->getMetadata()->getName() . $testExample['scenarioName'];
    }else{
        $testName = $test->getMetadata()->getName() . '. Scenario '. self::$testIteration;
        self::$testIteration++;
    }
    $test->getMetadata()->setName($testName);
}