mihaeu/test-generator

为现有文件生成测试用例

1.3.0 2018-08-25 14:41 UTC

This package is auto-updated.

Last update: 2024-09-04 18:32:08 UTC


README

Travis branch Codecov branch Infection MSI

为现有文件生成测试用例

用例

  • PHPStorm 支持文件模板的 Apache Velocity,但使用起来很麻烦,而且功能有限
  • 其他 IDE 或编辑器,如 Vim 或 Emacs,没有内置代码生成功能
  • 某些情况下,测试文件永远不会出现在它们应该的位置,迫使您手动重新排列代码

test-generator 可以让您在测试遗留应用程序时避免所有繁琐的重复代码输入。下次您为一个具有太多依赖关系的类编写测试并开始模拟时,想想如果能够自动化这个流程,您可以节省多少时间。

这就是 test-generator 发挥作用的地方。试试看,根据您的需求进行配置,并为您的 shell 创建一个别名,或者更好的是将它作为外部工具包含在您的编辑器/IDE 中(例如 PHPStorm)。

用法

CLI

bin/test-generator --help
Test-Generator

Usage:
  test-generator [options] [(--src-base --test-base)] <file>

Options:
  --php5                        Generate PHP5 compatible code [default:false].
  --phpunit5                    Generate a test for PHPUnit 5 [default:false].
  --mockery                     Generates mocks using Mockery [default:false].
  --covers                      Adds the @covers annotation   [default:false].
  --base-class=<base-class>     Inherit from this base class e.g. "Example\TestCase".
  --subject-format=<format>     Format the field for the subject class.
  --field-format=<format>       Format the fields for dependencies.
  -s, --src-base=<path>         Base directory for source files; requires --test-base
  -t, --test-base=<path>        Base directory for test files; requires --src-base; writes output to that directory

Format:
  %n                            Name starting with a lower-case letter.
  %N                            Name starting with an upper-case letter.
  %t                            Type starting with a lower-case letter.
  %T                            Type starting with a upper-case letter.

Format Examples:
  "mock_%t"                      Customer => mock_customer
  "%NTest"                       arg => ArgTest
  "testClass"                    SomeName => TestClass

PHPStorm

我建议将 test-generator 作为外部工具集成到 PHPStorm 中。这是因为 PHPStorm 可以将当前活动文件的文件名作为参数传递给 test-generator,然后将其生成并写入您预先配置的位置。

导航到设置 > 工具 > 外部工具,点击 +。添加以下信息

如果您正在使用 .phar 文件,请记住调整 程序参数

如果您想使用不同的设置和位置生成不同的测试用例,只需创建更多的外部工具条目。

How to integrate test-generator in PHPStorm

技巧:为此工具分配一个快捷键,因为您可能会经常使用它 ;)

安装

Composer (PHP 7.1+)

# local install
composer require "mihaeu/test-generator:^1.0"

# global install
composer global require "mihaeu/test-generator:^1.0"

Phar (PHP 5.5+)

由于我实际上需要在 5.5 的遗留项目中使用它(应该也适用于 5.4,但未对其进行测试),因此我还发布了一个适用于旧版本的 Phar 文件。

wget https://github.com/mihaeu/php-test-generator/releases/download/1.2.0/test-generator-1.2.0.phar
chmod +x test-generator-1.2.0.phar

请注意,通过这样做,我们应该对自己未能升级到 PHP 7.1(很快将是 7.2)感到厌恶。

Git

git clone https://github.com/mihaeu/php-test-generator
cd php-test-generator
composer install
bin/test-generator --help

如果您没有安装 PHP 7.1,可以运行 bin/remove-php7-features 转换源文件。但是,我不会接受没有 PHP 7.1 支持的拉取请求。

示例

给定一个 PHP 文件,如下所示

<?php declare(strict_types=1);
namespace Mihaeu\TestGenerator;
use Twig_TemplateWrapper;
class TwigRenderer
{
    // ...
    public function __construct(\Twig_Environment $twig, TemplateConfiguration $templateConfiguration)
    {
        // ...
    }
    // ...
}

运行以下命令

# re-formatted for legibility
bin/test-generator src/TwigRenderer.php
    --field-format="mock%N" 
    --subject-format="classUnderTest" 
    --php5 
    --phpunit5 
    --mockery 
    --base-class="Vendor\\TestCase"

将生成一个包括模拟依赖项的测试用例

<?php

namespace Mihaeu\PhpDependencies\Analyser;

use Mockery;
use Mockery\MockInterface;
use Vendor\TestCase;

class StaticAnalyserTest extends TestCase
{
    /** @var StaticAnalyser */
    private $classUnderTest;

    /** @var PhpParser\NodeTraverser | MockInterface */
    private $mockNodeTraverser;

    /** @var Mihaeu\PhpDependencies\Analyser\DependencyInspectionVisitor | MockInterface */
    private $mockDependencyInspectionVisitor;

    /** @var Mihaeu\PhpDependencies\Analyser\Parser | MockInterface */
    private $mockParser;

    protected function setUp()
    {
        $this->mockNodeTraverser = Mockery::mock(PhpParser\NodeTraverser::class);
        $this->mockDependencyInspectionVisitor = Mockery::mock(Mihaeu\PhpDependencies\Analyser\DependencyInspectionVisitor::class);
        $this->mockParser = Mockery::mock(Mihaeu\PhpDependencies\Analyser\Parser::class);
        $this->classUnderTest = new StaticAnalyser(
            $this->mockNodeTraverser,
            $this->mockDependencyInspectionVisitor,
            $this->mockParser
        );
    }

    public function testMissing()
    {
        $this->fail('Test not yet implemented');
    }
}

路线图

  • 默认情况下通过包含(使用 use)所有所需的命名空间来避免 FQNs
  • --template=<path> 用于自定义模板
  • 以及更多计划中的功能,请 查看功能待办事项

贡献

如果您有任何新功能的想法或愿意亲自贡献,我们非常欢迎您这样做。

请确保将代码覆盖率保持在 100%(并运行 humbug 进行变异测试),并坚持 PSR-2。仓库中的 Makefile 做了很多假设,可能在您的机器上无法正常工作,但它可能有所帮助。

许可证

版权所有 (c) 2017-2019 Michael Haeuslmann

特此授予任何获得本软件及其相关文档文件(以下简称“软件”)副本的任何人,在不受限制的情况下处理软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许向软件提供的人以本条款为条件这样做。

上述版权声明和本许可声明应包含在软件的所有副本或实质性部分中。

软件按“现状”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于对适销性、特定用途适用性和非侵权的保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论该责任源于合同行为、侵权或其他,无论与软件或软件的使用或其他相关。