<?php class SeleniumTestCaseResult { public $name; public $commands = array(); public $result = 'passed'; public $failures = array(); } class SeleniumTestResult { public $result = 'passed'; public $totalTime = 0; public $numTestPasses = 0; public $numTestFailures = 0; public $numCommandPasses = 0; public $numCommandFailures = 0; public $numCommandErrors = 0; public $suites = array(); public $browser = ''; public $date; public function __construct() { $this->parse_data(); $this->browser = $_SERVER['HTTP_USER_AGENT']; $this->date = time(); } protected function parse_data() { $this->result = $_POST['result']; // failed || passed $this->totalTime = $_POST['totalTime']; $this->numTestPasses = $_POST['numTestPasses']; $this->numTestFailures = $_POST['numTestFailures']; $this->numCommandPasses = $_POST['numCommandPasses']; $this->numCommandFailures = $_POST['numCommandFailures']; $this->numCommandErrors = $_POST['numCommandErrors']; foreach($_POST['tests'] as $test) { $case = new SeleniumTestCaseResult(); $case->name = $test['testcase']; $case->commands = $test['commands']; for($i = 0; $i < count($case->commands); $i++) { //$trace = $case->commands[$i]['trace']; //$trace = html_entity_decode($trace); //$case->commands[$i]['trace'] = @unserialize($trace); if($case->commands[$i]['result'] == 'failed') { $case->result = 'failed'; array_push($case->failures, $case->commands[$i]); } } $this->suites[$case->name] = $case; } } } class SeleniumHtmlReporter { protected $test; public function __construct($result) { $this->test = $result; } protected function renderHeader() { $contents = <<<EOD <html> <head> <title>Functional Test Results</title> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <style type="text/css"> body {font-family:"Verdana";font-weight:normal;color:black;background-color:white;} .failed { background-color: red; } .error0 { background-color: lightgray; } .info { padding: 0.5em; margin-top: 1em; color: white; } .passed { background-color: green; } .error_case div { padding: 0.3em 0.2em; margin: 0.5em 0; } .error_msg { padding: 0.5em; border-bottom:1px solid #ccc; } .msg { color:#c00; } .function { font-family:"Lucida Console";color: gray;} .file { border-bottom: 1px dashed gray; } .env { color: gray; font-size:10pt; padding: 0.5em; } .odd { background-color: #fee; } </style> </head> <body> EOD; return $contents; } public function render() { echo $this->renderHeader(); echo $this->renderBody(); echo $this->renderFooter(); } protected function renderBody() { /* SeleniumTestResult */ $test = $this->test; $total = count($test->suites); $date = @strftime('%Y-%m-%d %H:%M',$test->date); $contents = <<<EOD <h1 class="suite">Functional Test Results</h1> <div class="info {$test->result}"> <strong>{$total}</strong> test cases completed, <strong>{$test->numTestPasses}</strong> passes ({$test->numCommandPasses} commands), and <strong>{$test->numTestFailures}</strong> fails ({$test->numCommandErrors} commands). </div> <div class="env"> {$date}, {$test->browser} </div> EOD; $count = 1; foreach($test->suites as $suite) { foreach($suite->failures as $error) $contents .= $this->getErrorMsg($suite, $error, $count++); } return $contents; } protected function getErrorMsg($suite, $info, $count) { $parity = $count%2==0 ? 'even' : 'odd'; $command = explode("|",$info['command']); $msg = <<<EOD <div class="error_msg {$parity}"> <strong>#{$count}.</strong> "<span class="msg">{$info['msg']}</span>" in <span class="function"> {$suite->name}::{$command[1]}('{$command[2]}'); </span> </div> EOD; return $msg; } protected function renderFooter() { return "</body></html>"; } } ?>