ta-tikoma/phpunit-architecture-test

测试应用架构的方法

0.8.4 2024-01-05 14:10 UTC

README

想法:除了特性测试和单元测试,编写架构测试。保护您的架构代码风格!

示例

不要在控制器中使用存储库,只在使用服务类。采用三个层“存储库”、“服务”、“控制器”并添加对依赖关系的断言。

$controllers  = $this->layer()->leaveByNameStart('App\\Controllers');
$services     = $this->layer()->leaveByNameStart('App\\Services');
$repositories = $this->layer()->leaveByNameStart('App\\Repositories');

$this->assertDoesNotDependOn($controllers, $repositories);
$this->assertDependOn($controllers, $services);
$this->assertDependOn($services, $repositories);

安装

通过composer安装

composer require --dev ta-tikoma/phpunit-architecture-test

将特质添加到测试类

abstract class TestCase extends BaseTestCase
{
    use ArchitectureAsserts;
}

使用

  • 创建测试
  • 构建应用程序层
  • 添加断言
    public function test_make_layer_from_namespace()
    {
        $app = $this->layer()->leaveByNameStart('PHPUnit\\Architecture');
        $tests = $this->layer()->leaveByNameStart('tests');

        $this->assertDoesNotDependOn($app, $tests);
        $this->assertDependOn($tests, $app);
    }

运行

./vendor/bin/phpunit

测试文件结构

  • tests
    • 架构
      • SomeTest.php
    • 特性
    • 单元

如何构建层

  • $this->layer() 获取访问包含所有对象的层以及过滤以创建您的层
    • 只留下层中的对象
      • ->leave($closure) 通过闭包
      • ->leaveByPathStart($path) 通过对象路径开始
      • ->leaveByNameStart($name) 通过对象名称开始
      • ->leaveByNameRegex($name) 通过对象名称正则表达式
      • ->leaveByType($name) 通过对象类型
    • 从层中删除对象
      • ->exclude($closure) 通过闭包
      • ->excludeByPathStart($path) 通过对象路径开始
      • ->excludeByNameStart($name) 通过对象名称开始
      • ->excludeByNameRegex($name) 通过对象名称正则表达式
      • ->excludeByType($name) 通过对象类型
  • 您可以通过split创建多个层
    • ->split($closure) 通过闭包
    • ->splitByNameRegex($closure) 通过对象名称

断言

依赖关系

示例:控制器不使用存储库,只通过服务使用。

  • assertDependOn($A, $B) 层A必须包含来自层B的依赖项。
  • assertDoesNotDependOn($A, $B) 层A(或数组A中的层)必须不包含来自层B(或数组B中的层)的依赖项。

方法

  • assertIncomingsFrom($A, $B) 层A必须包含来自层B的类型参数。
  • assertIncomingsNotFrom($A, $B) 层A必须不包含来自层B的类型参数。
  • assertOutgoingFrom($A, $B) 层A必须包含来自层B的方法返回类型。
  • assertOutgoingNotFrom($A, $B) 层A必须不包含来自层B的方法返回类型。
  • assertMethodSizeLessThan($A, $SIZE) 层A必须不包含小于SIZE的方法大小。

属性

  • assertHasNotPublicProperties($A) 层A中的对象必须不包含公共属性。

本质

您可以使用 $layer->essence($path) 方法从层中收集数据。例如,获取层中所有属性的可见性:$visibilities = $layer->essence('properties.*.visibility');

  • assertEach($list, $check, $message) - 列表中的每个项目都必须通过 $check-function 测试。
  • assertNotOne($list, $check, $message) - 列表中的任何一个项目都必须不通过 $check-function 测试。
  • assertAny($list, $check, $message) - 列表中的任何一个项目都必须不通过 $check-function 测试。

替代方案

优势

  • 通过正则表达式动态创建层(无需声明每个模块)
  • phpunit中的其余测试一起运行
  • 对方法参数和返回类型的断言(用于检查依赖注入)
  • 对属性的可见性断言