cspray / labrador-async-unit
基于PHP8编写的异步单元和集成测试框架
Requires
- php: ^8.0
- amphp/amp: ^2
- amphp/byte-stream: ^1.8
- amphp/file: ^1.0
- cspray/labrador: ^3.2.0
- cspray/labrador-async-event: ^2.3
- cspray/labrador-styled-byte-stream: ^0.1.0
- cspray/yape: ^3.1
- nikic/php-parser: ^4.10
- opis/json-schema: ^2.0
- phpunit/php-timer: ^5.0
- symfony/console: ^5.2
Requires (Dev)
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-03 20:57:39 UTC
README
一个测试框架,重点关注集成测试,将Amp的Loop视为一等公民!
- 通过扩展
Cspray\Labrador\AsyncUnit\TestCase
并在测试上添加#[Test]
注释来开始 - 使用诸如
#[BeforeEach]
和#[AfterEach]
之类的属性对方法进行注释来设置和清理测试 - 使用
Cspray\Labrador\AsyncUnit\TestSuite
将测试套件视为一等公民,并为集成测试带来更多功能层 - 具有一流异步支持和清晰的断言API
- 使用
#[Disabled]
属性禁用测试、TestCase
或TestSuite
- 利用
#[DataProvider]
减少测试重复 - 期望测试抛出具有或不具有特定消息的异常
- 包含一个用于运行测试的捆绑CLI应用程序
AsyncUnit正在积极开发中!该项目有一个定义的路线图,目前正在实现0.5.0版本的功能。
安装
composer require --dev cspray/labrador-async-unit
你好,AsyncUnit
尽管AsyncUnit可以满足大多数单元和集成测试的需求,但它实际上是为一种特定的测试而设计的,这种测试即使在同步环境中也可能难以正确运行。AsyncUnit的“经典”测试示例如下,并演示了框架的核心功能。
<?php namespace Acme\MyApp; use Cspray\Labrador\AsyncUnit\Attribute\AfterAll; use Cspray\Labrador\AsyncUnit\Attribute\BeforeAll; use Cspray\Labrador\AsyncUnit\Attribute\BeforeEachTest; use Cspray\Labrador\AsyncUnit\Attribute\AfterEachTest; use Cspray\Labrador\AsyncUnit\Attribute\BeforeEach; use Cspray\Labrador\AsyncUnit\Attribute\Test; use Cspray\Labrador\AsyncUnit\Attribute\AttachToTestSuite as UseTestSuite; use Cspray\Labrador\AsyncUnit\TestCase; use Cspray\Labrador\AsyncUnit\TestSuite; use Amp\Success; use Amp\Delayed; use function Amp\Postgres\pool; class DatabaseTestSuite extends TestSuite { #[BeforeAll] public function connectToDatabase() { // In test situations we want to make sure we're dealing with the same connection so we can properly clean up data $pool = pool(connectionConfig(), maxConnections: 1, resetConnections: false); $this->set('pool', $pool); } #[BeforeEachTest] public function startTransaction() { yield $this->get('pool')->query('START TRANSACTION'); } #[AfterEachTest] public function rollback() { yield $this->get('pool')->query('ROLLBACK'); } #[AfterAll] public function closeDatabase() { $this->get('pool')->close(); } } // The name of this class doesn't matter... you only need to ensure you extend TestCase #[UseTestSuite(DatabaseTestSuite::class)] class MyDatabaseTestCase extends TestCase { // Again, none of the method names matter... just make sure you're annotating with the correct Attribute #[BeforeEach] public function loadFixture() { yield someMethodThatLoadsData($this->testSuite()->get('pool')); } #[Test] public function ensureSomethingHappens() { yield new Delayed(100); // just to show you we're on the loop // These values could be retrieved from the database $this->assert()->stringEquals('foo', 'foo'); } #[Test] public function ensureSomethingAsyncHappens() { yield new Delayed(100); yield $this->asyncAssert()->stringEquals('foo', new Success('foo')); } #[Test] public function makeSureYouAssertSomething() { // a failed test because you didn't assert anything! } } class MyNormalTestCase extends TestCase { #[Test] public function ensurePoolNotAvailable() { $this->assert()->isNull($this->testSuite()->get('pool')); } }
我希望您在上述测试示例中看到的整洁性与我一样多!如果您想看到更多示例,有两个地方可以找到它们;examples/
和acme_src/
目录。否则,请查阅此README的其余部分,了解如何开始使用此项目。
文档
无论您是学习如何使用框架编写测试的用户,还是想要改进库的贡献者,我们的文档都应该满足您的需求!我们指导您完成启动所需的一切,教授您需要了解的所有重要概念,并列出可用的断言。对于贡献者,我们提供了一个全面的概述,说明了一切是如何工作的。
在线文档在https://docs.labrador-kennel.io/asyncunit.
Labrador AsyncUnit文档由GitBook赞助。如果您需要开发人员友好的、托管文档托管服务,绝对应该检查他们!
讨论
您对框架有什么想法?想知道某件事如何工作,有什么问题要问?想要与维护者互动?您就在正确的位置!这是AsyncUnit的“社交”部分... 加入讨论!
路线图
AsyncUnit有一个相当明确的路线图,最终将有一个稳定的API和1.0版本发布。我们的路线图没有日期,因为框架目前由一个人在业余时间维护和实现。相反,我们有多个0.x版本,这些版本具有使测试越来越复杂的功能,直到我们的经典示例可以执行。查看路线图以查看AsyncUnit的将来!我们目前正在努力实现的功能可以在我们的活跃冲刺中跟踪。