mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-11-10 08:52:39 +01:00
Add PytestTestEngine
This commit is contained in:
parent
c38bc4376c
commit
81a1c09148
2 changed files with 91 additions and 0 deletions
|
@ -168,6 +168,7 @@ phutil_register_library_map(array(
|
|||
'PhutilLintEngine' => 'lint/engine/PhutilLintEngine.php',
|
||||
'PhutilUnitTestEngine' => 'unit/engine/PhutilUnitTestEngine.php',
|
||||
'PhutilUnitTestEngineTestCase' => 'unit/engine/__tests__/PhutilUnitTestEngineTestCase.php',
|
||||
'PytestTestEngine' => 'unit/engine/PytestTestEngine.php',
|
||||
'UnitTestableArcanistLintEngine' => 'lint/engine/UnitTestableArcanistLintEngine.php',
|
||||
),
|
||||
'function' =>
|
||||
|
@ -299,6 +300,7 @@ phutil_register_library_map(array(
|
|||
'PhutilLintEngine' => 'ArcanistLintEngine',
|
||||
'PhutilUnitTestEngine' => 'ArcanistBaseUnitTestEngine',
|
||||
'PhutilUnitTestEngineTestCase' => 'ArcanistTestCase',
|
||||
'PytestTestEngine' => 'ArcanistBaseUnitTestEngine',
|
||||
'UnitTestableArcanistLintEngine' => 'ArcanistLintEngine',
|
||||
),
|
||||
));
|
||||
|
|
89
src/unit/engine/PytestTestEngine.php
Normal file
89
src/unit/engine/PytestTestEngine.php
Normal file
|
@ -0,0 +1,89 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Very basic 'py.test' unit test engine wrapper.
|
||||
*
|
||||
* @group unitrun
|
||||
*/
|
||||
final class PytestTestEngine extends ArcanistBaseUnitTestEngine {
|
||||
|
||||
public function run() {
|
||||
$junit_tmp = new TempFile();
|
||||
|
||||
$cmd_line = csprintf('py.test --junitxml=%s',
|
||||
$junit_tmp);
|
||||
|
||||
$future = new ExecFuture('%C', $cmd_line);
|
||||
list($stdout, $stderr) = $future->resolvex();
|
||||
|
||||
return $this->parseTestResults($junit_tmp);
|
||||
}
|
||||
|
||||
public function parseTestResults($junit_tmp) {
|
||||
// xunit xsd: https://gist.github.com/959290
|
||||
$xunit_dom = new DOMDocument();
|
||||
$xunit_dom->loadXML(Filesystem::readFile($junit_tmp));
|
||||
|
||||
$results = array();
|
||||
$testcases = $xunit_dom->getElementsByTagName("testcase");
|
||||
foreach ($testcases as $testcase) {
|
||||
$classname = $testcase->getAttribute("classname");
|
||||
$name = $testcase->getAttribute("name");
|
||||
$time = $testcase->getAttribute("time");
|
||||
|
||||
$status = ArcanistUnitTestResult::RESULT_PASS;
|
||||
$user_data = "";
|
||||
|
||||
// A skipped test is a test which was ignored using framework
|
||||
// mechanizms (e.g. @skip decorator)
|
||||
$skipped = $testcase->getElementsByTagName("skipped");
|
||||
if ($skipped->length > 0) {
|
||||
$status = ArcanistUnitTestResult::RESULT_SKIP;
|
||||
$messages = array();
|
||||
for ($ii = 0; $ii < $skipped->length; $ii++) {
|
||||
$messages[] = trim($skipped->item($ii)->nodeValue, " \n");
|
||||
}
|
||||
|
||||
$user_data .= implode("\n", $messages);
|
||||
}
|
||||
|
||||
// Failure is a test which the code has explicitly failed by using
|
||||
// the mechanizms for that purpose. e.g., via an assertEquals
|
||||
$failures = $testcase->getElementsByTagName("failure");
|
||||
if ($failures->length > 0) {
|
||||
$status = ArcanistUnitTestResult::RESULT_FAIL;
|
||||
$messages = array();
|
||||
for ($ii = 0; $ii < $failures->length; $ii++) {
|
||||
$messages[] = trim($failures->item($ii)->nodeValue, " \n");
|
||||
}
|
||||
|
||||
$user_data .= implode("\n", $messages)."\n";
|
||||
}
|
||||
|
||||
// An errored test is one that had an unanticipated problem. e.g., an
|
||||
// unchecked throwable, or a problem with an implementation of the
|
||||
// test.
|
||||
$errors = $testcase->getElementsByTagName("error");
|
||||
if ($errors->length > 0) {
|
||||
$status = ArcanistUnitTestResult::RESULT_BROKEN;
|
||||
$messages = array();
|
||||
for ($ii = 0; $ii < $errors->length; $ii++) {
|
||||
$messages[] = trim($errors->item($ii)->nodeValue, " \n");
|
||||
}
|
||||
|
||||
$user_data .= implode("\n", $messages)."\n";
|
||||
}
|
||||
|
||||
$result = new ArcanistUnitTestResult();
|
||||
$result->setName($classname.".".$name);
|
||||
$result->setResult($status);
|
||||
$result->setDuration($time);
|
||||
$result->setUserData($user_data);
|
||||
|
||||
$results[] = $result;
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue