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',
|
'PhutilLintEngine' => 'lint/engine/PhutilLintEngine.php',
|
||||||
'PhutilUnitTestEngine' => 'unit/engine/PhutilUnitTestEngine.php',
|
'PhutilUnitTestEngine' => 'unit/engine/PhutilUnitTestEngine.php',
|
||||||
'PhutilUnitTestEngineTestCase' => 'unit/engine/__tests__/PhutilUnitTestEngineTestCase.php',
|
'PhutilUnitTestEngineTestCase' => 'unit/engine/__tests__/PhutilUnitTestEngineTestCase.php',
|
||||||
|
'PytestTestEngine' => 'unit/engine/PytestTestEngine.php',
|
||||||
'UnitTestableArcanistLintEngine' => 'lint/engine/UnitTestableArcanistLintEngine.php',
|
'UnitTestableArcanistLintEngine' => 'lint/engine/UnitTestableArcanistLintEngine.php',
|
||||||
),
|
),
|
||||||
'function' =>
|
'function' =>
|
||||||
|
@ -299,6 +300,7 @@ phutil_register_library_map(array(
|
||||||
'PhutilLintEngine' => 'ArcanistLintEngine',
|
'PhutilLintEngine' => 'ArcanistLintEngine',
|
||||||
'PhutilUnitTestEngine' => 'ArcanistBaseUnitTestEngine',
|
'PhutilUnitTestEngine' => 'ArcanistBaseUnitTestEngine',
|
||||||
'PhutilUnitTestEngineTestCase' => 'ArcanistTestCase',
|
'PhutilUnitTestEngineTestCase' => 'ArcanistTestCase',
|
||||||
|
'PytestTestEngine' => 'ArcanistBaseUnitTestEngine',
|
||||||
'UnitTestableArcanistLintEngine' => 'ArcanistLintEngine',
|
'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