6

我想我可能把概念弄错了,或者没有正确地思考某些事情。我正在寻找一种连接到数据库的方法,然后为表的每一行运行硒测试(在 phantomjs 中)。测试是检查定制 CMS 上的损坏图像,并且可以应用于任何 CMS。

我基本上想通过从数据库加载它们的 ID,然后为每个 ID 运行单独的测试来为每个页面(特定类型)运行验收测试。

这是我到目前为止所拥有的:

$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 个测试运行,有很多断言)。

如何将此作为单独的测试运行?

4

3 回答 3

3

我最终循环并将失败的密钥存储在逗号分隔的字符串中,并设置一个布尔值来表示发现失败。

$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);

跟随我的网络助手

<?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);
    }
}

感谢提交的答案

于 2013-12-18T15:34:03.663 回答
1

那是行不通的。请在测试中避免循环和条件。您应该key手动放置。而不是从数据库中获取它们。因为它引入了额外的复杂性。

于 2013-10-09T21:11:02.027 回答
0

它可能不是最好的设计选择,但如果您真的想遵循这种方法,您可以使用 codeception 中的指定工具,以便即使一个断言失败,您的测试也可以继续运行: https ://github.com/Codeception /指定

于 2013-10-17T09:40:31.147 回答