Skip to content

Commit

Permalink
Merge pull request #25 from ergebnis/feature/time-keeper
Browse files Browse the repository at this point in the history
Enhancement: Use TimeKeeper instead of SlowTestCollector in Subscriber\TestPreparedSubscriber
  • Loading branch information
ergebnis-bot committed Jan 24, 2021
2 parents 2289f1a + dd5672d commit 879305b
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 80 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ For a full diff see [`7afa59c...main`][7afa59c...main].
* Renamed `SlowTestReporter` to `Reporter\Reporter` ([#20]), by [@localheinz]
* Renamed `Reporter\Reporter` to `Reporter\DefaultReporter` and extracted `Reporter\Reporter` interface ([#21]), by [@localheinz]
* Renamed `Collector` to `Collector\DefaultCollector` and extracted `Collector\Collector` interface ([#24]), by [@localheinz]
* Used `TimeKeeper` instead of `SlowTestCollector` in `Subscriber\TestPreparedSubscriber` ([#25]), by [@localheinz]

[7afa59c...main]: https://github.com/ergebnis/phpunit-slow-test-detector/compare/7afa59c...main

Expand All @@ -40,5 +41,6 @@ For a full diff see [`7afa59c...main`][7afa59c...main].
[#22]: https://github.com/ergebnis/phpunit-slow-test-detector/pull/22
[#23]: https://github.com/ergebnis/phpunit-slow-test-detector/pull/23
[#24]: https://github.com/ergebnis/phpunit-slow-test-detector/pull/24
[#25]: https://github.com/ergebnis/phpunit-slow-test-detector/pull/25

[@localheinz]: https://github.com/localheinz
10 changes: 5 additions & 5 deletions src/Subscriber/TestPreparedSubscriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,21 @@

namespace Ergebnis\PHPUnit\SlowTestDetector\Subscriber;

use Ergebnis\PHPUnit\SlowTestDetector\SlowTestCollector;
use Ergebnis\PHPUnit\SlowTestDetector\TimeKeeper;
use PHPUnit\Event;

final class TestPreparedSubscriber implements Event\Test\PreparedSubscriber
{
private SlowTestCollector $slowTestCollector;
private TimeKeeper $timeKeeper;

public function __construct(SlowTestCollector $slowTestCollector)
public function __construct(TimeKeeper $timeKeeper)
{
$this->slowTestCollector = $slowTestCollector;
$this->timeKeeper = $timeKeeper;
}

public function notify(Event\Test\Prepared $event): void
{
$this->slowTestCollector->testPrepared(
$this->timeKeeper->start(
$event->test(),
$event->telemetryInfo()->time()
);
Expand Down
103 changes: 28 additions & 75 deletions test/Unit/Subscriber/TestPreparedSubscriberTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,8 @@

namespace Ergebnis\PHPUnit\SlowTestDetector\Test\Unit\Subscriber;

use Ergebnis\PHPUnit\SlowTestDetector\SlowTest;
use Ergebnis\PHPUnit\SlowTestDetector\SlowTestCollector;
use Ergebnis\PHPUnit\SlowTestDetector\Subscriber\TestPreparedSubscriber;
use Ergebnis\PHPUnit\SlowTestDetector\Test\Double;
use Ergebnis\PHPUnit\SlowTestDetector\Test\Fixture;
use Ergebnis\PHPUnit\SlowTestDetector\TimeKeeper;
use Ergebnis\Test\Util;
use PHPUnit\Event;
Expand All @@ -28,103 +26,58 @@
* @covers \Ergebnis\PHPUnit\SlowTestDetector\Subscriber\TestPreparedSubscriber
*
* @uses \Ergebnis\PHPUnit\SlowTestDetector\SlowTest
* @uses \Ergebnis\PHPUnit\SlowTestDetector\SlowTestCollector
* @uses \Ergebnis\PHPUnit\SlowTestDetector\TimeKeeper
*/
final class TestPreparedSubscriberTest extends Framework\TestCase
{
use Util\Helper;

public function testNotifyCollectsPreparedTest(): void
public function testNotifyRecordsTestStartWithTimeKeeper(): void
{
$faker = self::faker();

$maximumDuration = Event\Telemetry\Duration::fromSeconds($faker->numberBetween(
5,
10
));

$preparedTime = Event\Telemetry\HRTime::fromSecondsAndNanoseconds(
$faker->numberBetween(),
0
$faker->numberBetween(0, 999_999_999)
);

$preparedTest = self::createTest('test');
$preparedTest = new Event\Code\Test(
Fixture\ExampleTest::class,
'foo',
'foo with data set #123'
);

$preparedTestEvent = new Event\Test\Prepared(
self::createTelemetryInfo($preparedTime),
new Event\Telemetry\Info(
new Event\Telemetry\Snapshot(
$preparedTime,
Event\Telemetry\MemoryUsage::fromBytes($faker->numberBetween()),
Event\Telemetry\MemoryUsage::fromBytes($faker->numberBetween())
),
Event\Telemetry\Duration::fromSeconds($faker->numberBetween()),
Event\Telemetry\MemoryUsage::fromBytes($faker->numberBetween()),
Event\Telemetry\Duration::fromSeconds($faker->numberBetween()),
Event\Telemetry\MemoryUsage::fromBytes($faker->numberBetween()),
),
$preparedTest
);

$passedTime = Event\Telemetry\HRTime::fromSecondsAndNanoseconds(
$preparedTime->seconds() + $maximumDuration->seconds() + 1,
0
);
$timeKeeper = new TimeKeeper();

$passedTest = clone $preparedTest;

$slowTestCollector = new SlowTestCollector(
$maximumDuration,
new TimeKeeper(),
new Double\Collector\AppendingCollector()
);

$subscriber = new TestPreparedSubscriber($slowTestCollector);
$subscriber = new TestPreparedSubscriber($timeKeeper);

$subscriber->notify($preparedTestEvent);

self::assertSame([], $slowTestCollector->slowTests());

$slowTestCollector->testPassed(
$passedTest,
$passedTime
);

$expected = [
SlowTest::fromTestAndDuration(
$passedTest,
$passedTime->duration($preparedTime)
),
];

self::assertEquals($expected, $slowTestCollector->slowTests());
}

private static function createTelemetryInfo(Event\Telemetry\HRTime $time): Event\Telemetry\Info
{
$faker = self::faker();

return new Event\Telemetry\Info(
new Event\Telemetry\Snapshot(
$time,
Event\Telemetry\MemoryUsage::fromBytes($faker->numberBetween()),
Event\Telemetry\MemoryUsage::fromBytes($faker->numberBetween())
),
Event\Telemetry\Duration::fromSeconds($faker->numberBetween()),
Event\Telemetry\MemoryUsage::fromBytes($faker->numberBetween()),
Event\Telemetry\Duration::fromSeconds($faker->numberBetween()),
Event\Telemetry\MemoryUsage::fromBytes($faker->numberBetween()),
$passedTime = Event\Telemetry\HRTime::fromSecondsAndNanoseconds(
$faker->numberBetween($preparedTime->seconds()),
0
);
}

private static function createTest(string $methodName): Event\Code\Test
{
$faker = self::faker();

$methodNameWithDataSet = \sprintf(
'%s with data set #%d',
$methodName,
$faker->numberBetween()
$duration = $timeKeeper->stop(
clone $preparedTest,
$passedTime
);

if ($faker->boolean) {
$methodNameWithDataSet = $methodName;
}

return new Event\Code\Test(
self::class,
$methodName,
$methodNameWithDataSet
);
self::assertEquals($passedTime->duration($preparedTime), $duration);
}
}

0 comments on commit 879305b

Please sign in to comment.