cspray/labrador-async-unit

该软件包最新版本(0.5.0)没有提供许可证信息。

基于PHP8编写的异步单元和集成测试框架

0.5.0 2021-05-27 01:14 UTC

This package is auto-updated.

Last update: 2024-09-03 20:57:39 UTC


README

Unit Tests

一个测试框架,重点关注集成测试,将Amp的Loop视为一等公民!

  • 通过扩展Cspray\Labrador\AsyncUnit\TestCase并在测试上添加#[Test]注释来开始
  • 使用诸如#[BeforeEach]#[AfterEach]之类的属性对方法进行注释来设置和清理测试
  • 使用Cspray\Labrador\AsyncUnit\TestSuite将测试套件视为一等公民,并为集成测试带来更多功能层
  • 具有一流异步支持和清晰的断言API
  • 使用#[Disabled]属性禁用测试、TestCaseTestSuite
  • 利用#[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的将来!我们目前正在努力实现的功能可以在我们的活跃冲刺中跟踪。