umc/uutg

PHP 单元测试生成器

2.0.0 2024-06-19 07:22 UTC

This package is auto-updated.

Last update: 2024-09-19 13:05:42 UTC


README

这是一个用于生成 PHP 单元测试模板的独立应用程序

故事

我喜欢为我的代码编写单元测试。但我不喜欢一遍又一遍地写同样的事情。
所以我创建了这个应用程序,它将(应该/希望)为我生成模板。

它做什么。

它生成一个扩展 PHPUnit\Framework\TestCase 的类,并包含

  • 一个 setUp 方法,其中包含所有类依赖项和公共方法参数的模拟。
  • 为类中每个需要添加测试的公共方法生成空方法。

示例

(请按照生成代码中的内联注释操作) 对于这个类和默认配置文件(见下面的配置文件部分)

<?php

declare(strict_types=1);

namespace Dummy;

class SomeClass
{
    /**
     * @var \Dummy\MemberOne
     */
    private $memberOne;
    /**
     * @var \Dummy\MmeberTwo
     */
    private $member2;

    /**
     * @param MemberOne $memberOne
     * @param MmeberTwo $member2
     */
    public function __construct(MemberOne $memberOne, MmeberTwo $member2)
    {
        $this->memberOne = $memberOne;
        $this->member2 = $member2;
    }

    public function doSomething(\Other\Path\SomeClass $param)
    {
        //...method code here
        $this->doSomePrivateAction($param);
    }

    public function doSomethingElse()
    {
        $this->doSomething();
    }

    private function doSomePrivateAction(\Dummy\SomeOtherClass $param)
    {

    }
}

它将生成这个单元测试类

<?php

declare(strict_types=1);

namespace Dummy\Test\Unit; // COMMENT: it will build the namespace based on the original class name and the namespace strategy (see profiles below)

use Dummy\MemberOne; //COMMENT:it will extract the used class names
use Dummy\MmeberTwo;
use Dummy\SomeClass;
use Dummy\SomeOtherClass;
use Other\Path\SomeClass as SomeClassPath; //COMMENT: it will avoid conflicts in case there are 2 classes in different namespaces
use PHPUnit\Framework\Attributes\Test;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;

#[CoversClass(SomeClass::class)] //COMMENT: for PHPUnit 10+
class SomeClassTest extends TestCase
{
    /**
     * @var MemberOne | MockObject //COMMENT: extract all used memmbers at the top of the test. you can configure it via profiles to make them strong typed or not
     */
    private MemberOne|MockObject $memberOne;
    /**
     * @var MmeberTwo | MockObject
     */
    private MmeberTwo|MockObject $member2;
    /**
     * @var SomeClassPath | MockObject
     */
    private SomeClassPath|MockObject $param;
    /**
     * @var SomeOtherClass | MockObject
     */
    private SomeOtherClass|MockObject $paramSomeOtherClass;
    /**
     * @var SomeClass
     */
    private SomeClass $someClass;

    /**
     * Setup tests
     */
    protected function setUp(): void
    {
        //COMMENT:mock all needed instances and instantiate the class being tested
        $this->memberOne = $this->createMock(MemberOne::class);
        $this->member2 = $this->createMock(MmeberTwo::class);
        $this->param = $this->createMock(SomeClassPath::class);
        $this->paramSomeOtherClass = $this->createMock(SomeOtherClass::class);
        $this->someClass = new SomeClass($this->memberOne, $this->member2);
    }

    /**
     * //COMMENT: generate one test method for each public method that strictly belongs to the class being tested
     * //COMMENT: it adds the list of  methods being covered by this test (public/private/protected)
     * @covers \Dummy\SomeClass::doSomething
     * @covers \Dummy\SomeClass::doSomePrivateAction
     * @covers \Dummy\SomeClass::__construct
     */
    //COMMENT ... or for PHPUnit 10+
    #[Test]
    public function testDoSomething()
    {
        //COMMENT: generates a stub for your test
        $this->someClass->doSomething($this->param);
    }

    /**
     * @covers \Dummy\SomeClass::doSomethingElse
     * @covers \Dummy\SomeClass::doSomething
     * @covers \Dummy\SomeClass::__construct
     */
    //COMMENT ... or for PHPUnit 10+
    #[Test]
    public function testDoSomethingElse()
    {
        $this->someClass->doSomethingElse();
    }
}

如何配置它

您可以从 uutg.php.dist 开始创建自己的配置文件,并用它替换默认配置文件。配置文件中的每个元素在 uutg.php.dist 中都有解释

如何使用它

您可以通过 composer 安装它。首先配置仓库 composer config repositories.umc vcs https://github.com/ultimatemodulecreator/uutg 然后将库作为开发依赖项安装 composer require --dev umc/uutg

如果您通过 composer 安装,您可以通过命令行运行它
php ./vendor/bin/uutg --class="Class\\NameHere" [--config=path/to/config/file]

  • class 是您想要生成测试的类的名称。
  • config 是生成测试的配置文件路径。如果为空,则使用默认的 uutg.php.dist

如果您手动安装,您可以使用与 composer 版本类似的方式运行它 php ./uutg --class="Class\\NameHere" [--config=path/to/config/file] 但您必须确保您的类可以被脚本自动加载。

常见问题解答和评论

  1. "TDD 告诉你应该先写测试,然后再写类。你做得相反。"。是的,你是对的。
  2. "这将让我在单元测试方面变得更擅长吗?"。不会。它只会让你更快。
  3. "这个应用程序没有单元测试。"。你又对了。