Кодек несколько тестов, 1 скрипт


Я думаю, что, возможно, я неправильно понимаю концепцию или не думаю о чем-то правильно. Я ищу способ подключиться к БД, а затем запустить тест selenium (в phantomjs) для каждой строки таблицы. Тест предназначен для проверки сломанных изображений на заказанной CMS и может быть применен к любой CMS.

Я в основном хочу запустить приемочный тест для каждой страницы (определенного типа), загрузив их идентификаторы из БД, а затем запустив отдельный тест для каждого идентификатора.

Вот что у меня есть. пока что:

$I = new WebGuy($scenario);
$results = $I->getArrayFromDB('talkthrough', '`key`', array());
foreach ($results as $r) {
    $I->wantTo('Check helpfile '.$r['key'].'for broken images');
    $I->amOnPage('/talkThrough.php?id='.$r['key']);
    $I->seeAllImages();
}

Это работает до некоторой степени в том, что он выполняется до первого сбоя (потому что он выполняется как 1 Тест со многими утверждениями).

Как сделать так, чтобы это выполнялось в виде отдельных тестов?

3 6

3 ответа:

Я закончил тем, что перебрал и сохранил ключ, который не удался в строке, разделенной запятыми, и установил bool, чтобы сказать, что ошибки найдены.

$I = new WebGuy($scenario);
$results = $I->getArrayFromDB('talkthrough', '`key`', array());
$failures = "Broken help files are: ";
$failures_found = false;
foreach ($results as $key => $r) {
   $I->wantTo('Check helpfile '.$r['key'].'for broken images');
   $I->amOnPage('/talkThrough.php?id='.$r['key']);
   $allImagesFine = $I->checkAllImages();
   if($allImagesFine != '1')
   {
       $fail = $r['key'].",";
       $failures.= $fail;
       $failures_found = true;
   }
}
$I->seeBrokenImages($failures_found,$failures);

Со следующим моим webhelper

<?php
namespace Codeception\Module;

// here you can define custom functions for WebGuy 

class WebHelper extends \Codeception\Module
{
    function checkAllImages()
    {
        $result = $this->getModule('Selenium2')->session->evaluateScript("return     (function(){ return Array.prototype.slice.call(document.images).every(function (img) {return img.complete && img.naturalWidth > 0;}); })()");
        return $result;
    }
    function getArrayFromDB($table, $column, $criteria = array())
    {
        $dbh = $this->getModule('Db');
        $query = $dbh->driver->select($column, $table, $criteria);
        $dbh->debugSection('Query', $query, json_encode($criteria));

        $sth = $dbh->driver->getDbh()->prepare($query);
        if (!$sth) \PHPUnit_Framework_Assert::fail("Query '$query' can't be executed.");

        $sth->execute(array_values($criteria));
        return $sth->fetchAll();
    }
    function seeBrokenImages($bool,$failArray)
    {
        $this->assertFalse($bool,$failArray);
    }
}

Спасибо за представленные ответы

Это не сработает. Пожалуйста, избегайте циклов и условных обозначений в ваших тестах. Вы должны поместить key вручную. И не получить их из базы данных. Так как это вносит дополнительную сложность.

Возможно, это не лучший выбор дизайна, но если вы действительно хотите следовать этому подходу, вы можете использовать инструмент указать из codeception, чтобы позволить тесту продолжать работать, даже если одно утверждение не выполняется.: https://github.com/Codeception/Specify