6

Я думаю, что, возможно, я ошибаюсь в концепции или не думаю о чем-то правильном. Я ищу способ подключения к db, а затем запустить тест селена (в phantomjs) для каждой строки таблицы. Тест состоит в том, чтобы проверить, не сломанные изображения на заказной CMS, и может быть применен к любой CMS.Codeception multiple tests, 1 script

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

Это то, что я до сих пор:

$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

Я закончил цикл и сохранил ключ, который вышел из строя с разделителями-запятыми, и установил 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); 
    } 
} 

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

+0

К сожалению, несколько вызовов 'wantTo()' не создают отдельные тесты, которые я нашел. –

1

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

+0

Я бы сказал, что жесткое кодирование всех тестов делает обслуживание болезненным и трудоемким. Есть ли что-то принципиально неправильное с циклами и условностями в тестах? –

0

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