ta-tikoma / phpunit-architecture-test
测试应用架构的方法
0.8.4
2024-01-05 14:10 UTC
Requires
- php: ^8.1.0
- nikic/php-parser: ^4.18.0 || ^5.0.0
- phpdocumentor/reflection-docblock: ^5.3.0
- phpunit/phpunit: ^10.5.5 || ^11.0.0
- symfony/finder: ^6.4.0 || ^7.0.0
Requires (Dev)
- laravel/pint: ^1.13.7
- phpstan/phpstan: ^1.10.52
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中的其余测试一起运行
- 对方法参数和返回类型的断言(用于检查依赖注入)
- 对属性的可见性断言