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]
但您必须确保您的类可以被脚本自动加载。
常见问题解答和评论
- "TDD 告诉你应该先写测试,然后再写类。你做得相反。"。是的,你是对的。
- "这将让我在单元测试方面变得更擅长吗?"。不会。它只会让你更快。
- "这个应用程序没有单元测试。"。你又对了。