Тесты Selenium / PHPUnit всегда запускаются дважды, проваливаются при втором проходе - PullRequest
0 голосов
/ 29 октября 2010

Проблема, с которой я столкнулся, заключается в том, что у меня есть установочные программы для моих тестов Selenium / PHPUnit, и они всегда запускаются дважды, для каждого теста, один за другим.И тогда он перейдет к следующему тесту.Я обнаружил http://www.phpunit.de/ticket/688, что эта ошибка, кажется, именно то, что происходит со мной, поэтому я удалил все ссылки на PHPUnit_MAIN_METHOD, но у меня все еще остается та же проблема, и кажется, что "ошибка" была устранена два года назади я использую новейшую версию PHPUnit.

Вот мой код бегуна:

<?php
require_once '/libs/prefix.php';

class WWW_TestSuite
{
public static function main()
{
    PHPUnit_TextUI_TestRunner::run(self::suite());
}

public static function suite(){
    global $TEST_CASES, $TEST_FILES, $DOMAINS, $SUB_DOMAINS, $LOG_FILES;
    $suite = new PHPUnit_Framework_TestSuite('PHPUnit Framework');
    $GLOBALS['testDomain'] = 'cco';
    $GLOBALS['startURL'] = 'www.domain.com';
    $GLOBALS['resultsFile'] = $LOG_FILES['www.domain.com'];
    $numberOfTests = count($TEST_CASES['cco']);
    $resultsFile = $GLOBALS['resultsFile'];
    $fh = fopen($resultsFile, 'w');
    fwrite($fh, CRLF.DELIM_PLUS.CRLF);
    fwrite($fh, $numberOfTests.NUMBER_OF_TESTS_STRING.CRLF);
    fwrite($fh, DELIM_PLUS.CRLF);
    fclose($fh);
    foreach ($TEST_CASES['cco'] as $testCase){
        include $TEST_FILES['cco'][$testCase];
        $suite->addTestSuite($testCase);
    }
    return $suite;
}
}
?>

И мой код класса отчетности:

<?php
class reporting extends PHPUnit_Extensions_SeleniumTestCase
{
private $linkNotFound;
private $imageNotFound;
private $textNotFound;
private $testStatus;
private $successLines = array();
private $errorLines = array();

public function testContentPresent($testContent, $className){
        foreach ($testContent as $contentType=>$contentArr){
            foreach ($contentArr as $currentContent){
                try {
                    $this->assertTrue($this->$contentType($currentContent));
                    $this->successLines[] = $contentType.': '.$currentContent;
                } catch (PHPUnit_Framework_AssertionFailedError $e) {
                    $this->textNotFound = 1;
                    $this->errorLines[] = $contentType.': '.$currentContent;
                }
            }
        }
    $this->print_report($this->testURL, $className, $this->errorLines, $this->successLines);
}


public function print_report($testURL, $testName, $errorLines='', $successLines=''){
    $timeStamp = CRLF.date("m/d/y h:i:s a").CRLF;
    $resultsFile = $GLOBALS['resultsFile'];
    $fh = fopen($resultsFile, 'a');
    fwrite($fh, CRLF.DELIM_NUM);
    fwrite($fh, $timeStamp);
    fwrite($fh, "TEST NAME: ".$testName.CRLF);
    fwrite($fh, "TEST URL: ".$testURL.CRLF);
    fwrite($fh, DELIM_NUM.CRLF);
    if (!empty($successLines)) {
        fwrite($fh, DELIM_STAR.CRLF);
        fwrite($fh, TEST_PASS.CRLF);
        fwrite($fh, DELIM_STAR.CRLF);
        foreach ($successLines as $successLine){
            fwrite($fh, $successLine.CRLF);
        }
    }else {
        fwrite($fh, DELIM_STAR.CRLF);
        fwrite($fh, TEST_PASS.": NONE".CRLF);
        fwrite($fh, DELIM_STAR.CRLF);           
    }
    if (!empty($errorLines)) {
        fwrite($fh, DELIM_STAR.CRLF);
        fwrite($fh, TEST_FAIL.CRLF);
        fwrite($fh, DELIM_STAR.CRLF);
        foreach ($errorLines as $errorLine){
            fwrite($fh, $errorLine.CRLF);
        }
    }else {
        fwrite($fh, DELIM_STAR.CRLF);
        fwrite($fh, TEST_FAIL.": NONE".CRLF);
        fwrite($fh, DELIM_STAR.CRLF);
    }
    fclose($fh);
}
}
?>

И вотиспользуемые константы:

<?php
// REPORT VARIABLES
define('DELIM_NUM', '#################################################################################################');
define('DELIM_STAR', '***************************************************************');
define('DELIM_PLUS', '++++++++++++++++++++++++++++++++++++++++++++');
define('NUMBER_OF_TESTS_STRING', ' TESTS HAVE RUN IN THE FOLLOWING BATCH.');
define('CRLF' ,"\n");
define('TEST_PASS', "SUCCESSES");
define('TEST_FAIL', "ERRORS");

// DIRECTORY VARS
define('CCO_TESTS_DIR', '/tests/CCO/');

// $DOMAINS - DOMAINS ARRAY
$DOMAINS = array (
'cco'   => '.domain.com'
);

// $SUB_DOMAINS - SUB DOMAINS ARRAY
$SUB_DOMAINS = array (
'www',
'dev2'
);

// $LOG_FILES - LOG FILE PATHS ARRAY
$LOG_FILES = array (
'www.domain.com'                => CCO_LOG_FILES_DIR.date("m.d.y-H.i.s").'-CCO-WWW.txt'
);

// $TEST_CASES - TEST CASE NAMES ARRAY
$TEST_CASES = array (
'cco' => array( 
    'CCO_TestName'
)
);


// $TEST_FILES - ARRAY ASSOCIATING A TEST NAME WITH THE TEST FILE.
$TEST_FILES = array (   
'cco' => array (
    'CCO_TestName'              => CCO_TESTS_DIR.'CCO_TestName.php'                     
    )
);

// $TEST_NAME_URL_RELATION - ARRAY ASSOCIATING TEST CLASSES WITH THEIR ASSOCIATED URL ROOT.
$TEST_NAME_URL_RELATION = array(
'cco'=>array(                                   
    'CCO_TestName'                              => '/testdoc.asp?querystring=123'           
)
);

?>

Кто-нибудь может понять, почему эти тесты будут выполняться дважды, и ВСЕГДА терпеть неудачу во второй раз через?

Пример вывода CLI при выполнении тестов:

CCO_TestName
www.domain.com
.www.domain.com
E

И файл результатов обновляется только результатами первого теста (это нормальное поведение, мы не ведем запись в журнал, если мы получаем E в тесте, но мне интересно, почему он запускается дважды, чтобыначать с?

РЕДАКТИРОВАТЬ: Забыли включить мой установочный файл:

<?php
global  $TEST_NAME_URL_RELATION;
$testName = get_class($this);       
$this->reporting = new reporting();
$this->errorLines = array();
$this->startURL = $GLOBALS['startURL'];
$this->setBrowser("*firefox");
$this->setBrowserUrl("http://".$this->startURL);
$this->testUrlRoot = $TEST_NAME_URL_RELATION[$GLOBALS['testDomain']][$testName];
$this->testURL = $this->startURL.$this->testUrlRoot;
print ($this->testURL."\n");
?>

1 Ответ

3 голосов
/ 29 октября 2010

Функция

public function testContentPresent

в моем классе отчетов был причиной проблемы - Selenium автоматически запускает любой метод, который начинается со слова «тест», следовательно, он запускается дважды для фактического теста.

Переименован в:

public function ContentPresent

и теперь это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...