mirror of
https://github.com/pestphp/pest.git
synced 2026-03-06 07:47:22 +01:00
fix teamcity output for tests throwing an exception before the first assertion
This commit is contained in:
@ -11,6 +11,12 @@ use Pest\Support\Str;
|
|||||||
use PHPUnit\Event\Code\Test;
|
use PHPUnit\Event\Code\Test;
|
||||||
use PHPUnit\Event\Code\TestMethod;
|
use PHPUnit\Event\Code\TestMethod;
|
||||||
use PHPUnit\Event\Code\Throwable;
|
use PHPUnit\Event\Code\Throwable;
|
||||||
|
use PHPUnit\Event\Test\BeforeFirstTestMethodErrored;
|
||||||
|
use PHPUnit\Event\Test\ConsideredRisky;
|
||||||
|
use PHPUnit\Event\Test\Errored;
|
||||||
|
use PHPUnit\Event\Test\Failed;
|
||||||
|
use PHPUnit\Event\Test\MarkedIncomplete;
|
||||||
|
use PHPUnit\Event\Test\Skipped;
|
||||||
use PHPUnit\Event\TestSuite\TestSuite;
|
use PHPUnit\Event\TestSuite\TestSuite;
|
||||||
use PHPUnit\Framework\Exception as FrameworkException;
|
use PHPUnit\Framework\Exception as FrameworkException;
|
||||||
use PHPUnit\TestRunner\TestResult\TestResult as PhpUnitTestResult;
|
use PHPUnit\TestRunner\TestResult\TestResult as PhpUnitTestResult;
|
||||||
@ -188,12 +194,30 @@ final class Converter
|
|||||||
*/
|
*/
|
||||||
public function getStateFromResult(PhpUnitTestResult $result): State
|
public function getStateFromResult(PhpUnitTestResult $result): State
|
||||||
{
|
{
|
||||||
$numberOfPassedTests = $result->numberOfTestsRun()
|
$events = [
|
||||||
- $result->numberOfTestErroredEvents()
|
...$result->testErroredEvents(),
|
||||||
- $result->numberOfTestFailedEvents()
|
...$result->testFailedEvents(),
|
||||||
- $result->numberOfTestSkippedEvents()
|
...$result->testSkippedEvents(),
|
||||||
- $result->numberOfTestsWithTestConsideredRiskyEvents()
|
...array_merge(...array_values($result->testConsideredRiskyEvents())),
|
||||||
- $result->numberOfTestMarkedIncompleteEvents();
|
...$result->testMarkedIncompleteEvents(),
|
||||||
|
];
|
||||||
|
|
||||||
|
$numberOfNotPassedTests = count(
|
||||||
|
array_unique(
|
||||||
|
array_map(
|
||||||
|
function (BeforeFirstTestMethodErrored|Errored|Failed|Skipped|ConsideredRisky|MarkedIncomplete $event): string {
|
||||||
|
if ($event instanceof BeforeFirstTestMethodErrored) {
|
||||||
|
return $event->testClassName();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->getTestCaseLocation($event->test());
|
||||||
|
},
|
||||||
|
$events
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$numberOfPassedTests = $result->numberOfTestsRun() - $numberOfNotPassedTests;
|
||||||
|
|
||||||
return $this->stateGenerator->fromPhpUnitTestResult($numberOfPassedTests, $result);
|
return $this->stateGenerator->fromPhpUnitTestResult($numberOfPassedTests, $result);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,6 +16,7 @@ use Pest\Logging\TeamCity\Subscriber\TestPreparedSubscriber;
|
|||||||
use Pest\Logging\TeamCity\Subscriber\TestSkippedSubscriber;
|
use Pest\Logging\TeamCity\Subscriber\TestSkippedSubscriber;
|
||||||
use Pest\Logging\TeamCity\Subscriber\TestSuiteFinishedSubscriber;
|
use Pest\Logging\TeamCity\Subscriber\TestSuiteFinishedSubscriber;
|
||||||
use Pest\Logging\TeamCity\Subscriber\TestSuiteStartedSubscriber;
|
use Pest\Logging\TeamCity\Subscriber\TestSuiteStartedSubscriber;
|
||||||
|
use PHPUnit\Event\Code\Test;
|
||||||
use PHPUnit\Event\EventFacadeIsSealedException;
|
use PHPUnit\Event\EventFacadeIsSealedException;
|
||||||
use PHPUnit\Event\Facade;
|
use PHPUnit\Event\Facade;
|
||||||
use PHPUnit\Event\Telemetry\Duration;
|
use PHPUnit\Event\Telemetry\Duration;
|
||||||
@ -47,6 +48,11 @@ final class TeamCityLogger
|
|||||||
|
|
||||||
private bool $isSummaryTestCountPrinted = false;
|
private bool $isSummaryTestCountPrinted = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array<string, bool>
|
||||||
|
*/
|
||||||
|
private array $testEvents = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws EventFacadeIsSealedException
|
* @throws EventFacadeIsSealedException
|
||||||
* @throws UnknownSubscriberTypeException
|
* @throws UnknownSubscriberTypeException
|
||||||
@ -108,12 +114,14 @@ final class TeamCityLogger
|
|||||||
|
|
||||||
public function testSkipped(Skipped $event): void
|
public function testSkipped(Skipped $event): void
|
||||||
{
|
{
|
||||||
|
$this->whenFirstEventForTest($event->test(), function () use ($event): void {
|
||||||
$message = ServiceMessage::testIgnored(
|
$message = ServiceMessage::testIgnored(
|
||||||
$this->converter->getTestCaseMethodName($event->test()),
|
$this->converter->getTestCaseMethodName($event->test()),
|
||||||
'This test was ignored.'
|
'This test was ignored.'
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->output($message);
|
$this->output($message);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -122,6 +130,7 @@ final class TeamCityLogger
|
|||||||
*/
|
*/
|
||||||
public function testErrored(Errored $event): void
|
public function testErrored(Errored $event): void
|
||||||
{
|
{
|
||||||
|
$this->whenFirstEventForTest($event->test(), function () use ($event): void {
|
||||||
$testName = $this->converter->getTestCaseMethodName($event->test());
|
$testName = $this->converter->getTestCaseMethodName($event->test());
|
||||||
$message = $this->converter->getExceptionMessage($event->throwable());
|
$message = $this->converter->getExceptionMessage($event->throwable());
|
||||||
$details = $this->converter->getExceptionDetails($event->throwable());
|
$details = $this->converter->getExceptionDetails($event->throwable());
|
||||||
@ -133,6 +142,7 @@ final class TeamCityLogger
|
|||||||
);
|
);
|
||||||
|
|
||||||
$this->output($message);
|
$this->output($message);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -141,6 +151,7 @@ final class TeamCityLogger
|
|||||||
*/
|
*/
|
||||||
public function testFailed(Failed $event): void
|
public function testFailed(Failed $event): void
|
||||||
{
|
{
|
||||||
|
$this->whenFirstEventForTest($event->test(), function () use ($event): void {
|
||||||
$testName = $this->converter->getTestCaseMethodName($event->test());
|
$testName = $this->converter->getTestCaseMethodName($event->test());
|
||||||
$message = $this->converter->getExceptionMessage($event->throwable());
|
$message = $this->converter->getExceptionMessage($event->throwable());
|
||||||
$details = $this->converter->getExceptionDetails($event->throwable());
|
$details = $this->converter->getExceptionDetails($event->throwable());
|
||||||
@ -163,6 +174,7 @@ final class TeamCityLogger
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->output($message);
|
$this->output($message);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -171,12 +183,14 @@ final class TeamCityLogger
|
|||||||
*/
|
*/
|
||||||
public function testConsideredRisky(ConsideredRisky $event): void
|
public function testConsideredRisky(ConsideredRisky $event): void
|
||||||
{
|
{
|
||||||
|
$this->whenFirstEventForTest($event->test(), function () use ($event): void {
|
||||||
$message = ServiceMessage::testIgnored(
|
$message = ServiceMessage::testIgnored(
|
||||||
$this->converter->getTestCaseMethodName($event->test()),
|
$this->converter->getTestCaseMethodName($event->test()),
|
||||||
$event->message()
|
$event->message()
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->output($message);
|
$this->output($message);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testFinished(Finished $event): void
|
public function testFinished(Finished $event): void
|
||||||
@ -264,4 +278,14 @@ final class TeamCityLogger
|
|||||||
|
|
||||||
ServiceMessage::setFlowId($this->flowId);
|
ServiceMessage::setFlowId($this->flowId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function whenFirstEventForTest(Test $test, callable $callback): void
|
||||||
|
{
|
||||||
|
$testIdentifier = $this->converter->getTestCaseLocation($test);
|
||||||
|
|
||||||
|
if (! isset($this->testEvents[$testIdentifier])) {
|
||||||
|
$this->testEvents[$testIdentifier] = true;
|
||||||
|
$callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
##teamcity[testSuiteStarted name='Tests/tests/Failure' locationHint='file://tests/.tests/Failure.php' flowId='1234']
|
##teamcity[testSuiteStarted name='Tests/tests/Failure' locationHint='file://tests/.tests/Failure.php' flowId='1234']
|
||||||
##teamcity[testCount count='6' flowId='1234']
|
##teamcity[testCount count='8' flowId='1234']
|
||||||
##teamcity[testStarted name='it can fail with comparison' locationHint='pest_qn://tests/.tests/Failure.php::it can fail with comparison' flowId='1234']
|
##teamcity[testStarted name='it can fail with comparison' locationHint='pest_qn://tests/.tests/Failure.php::it can fail with comparison' flowId='1234']
|
||||||
##teamcity[testFailed name='it can fail with comparison' message='Failed asserting that true matches expected false.' details='at src/Mixins/Expectation.php:343|nat src/Support/ExpectationPipeline.php:75|nat src/Support/ExpectationPipeline.php:79|nat src/Expectation.php:300|nat tests/.tests/Failure.php:6|nat src/Factories/TestCaseMethodFactory.php:100|nat src/Concerns/Testable.php:302|nat src/Support/ExceptionTrace.php:28|nat src/Concerns/Testable.php:302|nat src/Concerns/Testable.php:221|nat src/Kernel.php:86' type='comparisonFailure' actual='true' expected='false' flowId='1234']
|
##teamcity[testFailed name='it can fail with comparison' message='Failed asserting that true matches expected false.' details='at src/Mixins/Expectation.php:343|nat src/Support/ExpectationPipeline.php:75|nat src/Support/ExpectationPipeline.php:79|nat src/Expectation.php:300|nat tests/.tests/Failure.php:6|nat src/Factories/TestCaseMethodFactory.php:100|nat src/Concerns/Testable.php:302|nat src/Support/ExceptionTrace.php:28|nat src/Concerns/Testable.php:302|nat src/Concerns/Testable.php:221|nat src/Kernel.php:86' type='comparisonFailure' actual='true' expected='false' flowId='1234']
|
||||||
##teamcity[testFinished name='it can fail with comparison' duration='100000' flowId='1234']
|
##teamcity[testFinished name='it can fail with comparison' duration='100000' flowId='1234']
|
||||||
@ -12,14 +12,19 @@
|
|||||||
##teamcity[testStarted name='it can fail' locationHint='pest_qn://tests/.tests/Failure.php::it can fail' flowId='1234']
|
##teamcity[testStarted name='it can fail' locationHint='pest_qn://tests/.tests/Failure.php::it can fail' flowId='1234']
|
||||||
##teamcity[testFailed name='it can fail' message='oh noo' details='at tests/.tests/Failure.php:18|nat src/Factories/TestCaseMethodFactory.php:100|nat src/Concerns/Testable.php:302|nat src/Support/ExceptionTrace.php:28|nat src/Concerns/Testable.php:302|nat src/Concerns/Testable.php:221|nat src/Kernel.php:86' flowId='1234']
|
##teamcity[testFailed name='it can fail' message='oh noo' details='at tests/.tests/Failure.php:18|nat src/Factories/TestCaseMethodFactory.php:100|nat src/Concerns/Testable.php:302|nat src/Support/ExceptionTrace.php:28|nat src/Concerns/Testable.php:302|nat src/Concerns/Testable.php:221|nat src/Kernel.php:86' flowId='1234']
|
||||||
##teamcity[testFinished name='it can fail' duration='100000' flowId='1234']
|
##teamcity[testFinished name='it can fail' duration='100000' flowId='1234']
|
||||||
|
##teamcity[testStarted name='it throws exception' locationHint='pest_qn://tests/.tests/Failure.php::it throws exception' flowId='1234']
|
||||||
|
##teamcity[testFailed name='it throws exception' message='Exception: test error' details='at tests/.tests/Failure.php:22|nat src/Factories/TestCaseMethodFactory.php:100|nat src/Concerns/Testable.php:302|nat src/Support/ExceptionTrace.php:28|nat src/Concerns/Testable.php:302|nat src/Concerns/Testable.php:221|nat src/Kernel.php:86' flowId='1234']
|
||||||
|
##teamcity[testFinished name='it throws exception' duration='100000' flowId='1234']
|
||||||
##teamcity[testStarted name='it is not done yet' locationHint='pest_qn://tests/.tests/Failure.php::it is not done yet' flowId='1234']
|
##teamcity[testStarted name='it is not done yet' locationHint='pest_qn://tests/.tests/Failure.php::it is not done yet' flowId='1234']
|
||||||
##teamcity[testIgnored name='it is not done yet' message='This test was ignored.' details='' flowId='1234']
|
##teamcity[testIgnored name='it is not done yet' message='This test was ignored.' details='' flowId='1234']
|
||||||
##teamcity[testFinished name='it is not done yet' duration='100000' flowId='1234']
|
##teamcity[testFinished name='it is not done yet' duration='100000' flowId='1234']
|
||||||
##teamcity[testStarted name='build this one.' locationHint='pest_qn://tests/.tests/Failure.php::build this one.' flowId='1234']
|
##teamcity[testStarted name='build this one.' locationHint='pest_qn://tests/.tests/Failure.php::build this one.' flowId='1234']
|
||||||
##teamcity[testIgnored name='build this one.' message='This test was ignored.' details='' flowId='1234']
|
##teamcity[testIgnored name='build this one.' message='This test was ignored.' details='' flowId='1234']
|
||||||
##teamcity[testFinished name='build this one.' duration='100000' flowId='1234']
|
##teamcity[testFinished name='build this one.' duration='100000' flowId='1234']
|
||||||
|
##teamcity[testStarted name='it is passing' locationHint='pest_qn://tests/.tests/Failure.php::it is passing' flowId='1234']
|
||||||
|
##teamcity[testFinished name='it is passing' duration='100000' flowId='1234']
|
||||||
##teamcity[testSuiteFinished name='Tests/tests/Failure' flowId='1234']
|
##teamcity[testSuiteFinished name='Tests/tests/Failure' flowId='1234']
|
||||||
|
|
||||||
[90mTests:[39m [31;1m2 failed[39;22m[90m,[39m[39m [39m[33;1m1 risky[39;22m[90m,[39m[39m [39m[36;1m2 todos[39;22m[90m,[39m[39m [39m[33;1m1 skipped[39;22m[90m (2 assertions)[39m
|
[90mTests:[39m [31;1m3 failed[39;22m[90m,[39m[39m [39m[33;1m1 risky[39;22m[90m,[39m[39m [39m[36;1m2 todos[39;22m[90m,[39m[39m [39m[33;1m1 skipped[39;22m[90m,[39m[39m [39m[32;1m1 passed[39;22m[90m (3 assertions)[39m
|
||||||
[90mDuration:[39m [39m1.00s[39m
|
[90mDuration:[39m [39m1.00s[39m
|
||||||
|
|
||||||
|
|||||||
@ -18,9 +18,17 @@ it('can fail', function () {
|
|||||||
$this->fail("oh noo");
|
$this->fail("oh noo");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('throws exception', function () {
|
||||||
|
throw new Exception('test error');
|
||||||
|
});
|
||||||
|
|
||||||
it('is not done yet', function () {
|
it('is not done yet', function () {
|
||||||
|
|
||||||
})->todo();
|
})->todo();
|
||||||
|
|
||||||
todo("build this one.");
|
todo("build this one.");
|
||||||
|
|
||||||
|
it('is passing', function () {
|
||||||
|
expect(true)->toEqual(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user