proklung / bitrix-phpunit-testing-tools
Bitrix PHPUNIT 测试工具。
Requires
- ext-mysqli: *
- andreyryabin/sprint.migration: ^4
- proklung/phpunit-testing-tools: ^1.0
- sheerockoff/bitrix-ci: ^21.400
README
内部
安装
composer require --dev proklung/bitrix-phpunit-testing-tools
在依赖此包的包中,composer.json 中必须有一个部分(需要确保迁移模块安装到正确的位置)
"extra": { "installer-paths": { "vendor/sheerockoff/bitrix-ci/files/bitrix/modules/{$name}/": ["type:bitrix-module"] } }
细节
测试的基础类 - BitrixableTestCase
。启动应用于包的 Bitrix,并允许在测试中使用其 API。
数据库访问参数在基础类 BitrixableTestCase
的 setupDatabaseData
方法中定义。
如果数据库在启动时不存在,则将创建。
默认情况下
protected function setupDatabaseData() : void { putenv('MYSQL_HOST=localhost'); putenv('MYSQL_DATABASE=bitrix_ci'); putenv('MYSQL_USER=root'); putenv('MYSQL_PASSWORD='); }
可以在每个具体的测试中重写。
管理
特性 ResetDatabaseTrait
指定在每次测试之前重置数据库并重新加载。
特性 CustomDumpTrait
重置数据库并加载自定义数据库备份。
备份路径在测试的 getDumpPath
方法中指定
protected function getDumpPath() : string { return $_SERVER['DOCUMENT_ROOT'] . '/Tests/dump/dump.sql'; }
仅与 ResetDatabaseTrait
结合使用。
使用备份时通常会出现许可证过期的问题。在这种情况下,必须手动替换 vendor/sheerockoff/bitrix-ci/files/bitrix/modules/main
中的 include.php
文件。
特性 SprintMigrationsTrait
使用模块 sprint.option 的迁移。
迁移目录的路径在测试的 getPathSprintMigrations
方法中指定
protected function getPathSprintMigrations() : string { return __DIR__ . '../../../../../../Tests/sprint_migrations/'; }
细节
由于使用 Bitrix CI 的特殊性质,必须巧妙地安装模块 - 直接在构建包的文件夹中(在 vendor/sheerockoff/bitrix-ci/files/bitrix/modules/sprint.option
中)在 composer 阶段。副作用 - 如果构建包本身更新,则迁移模块可能会丢失。
目前就是这样。
数据库会定期因到期而失效("...试用版已过期 ...")。为了修复此问题,需要启动任何带有 ResetDatabaseTrait
特性的测试,该特性将重新创建数据库。
特性 UseMigrationsTrait
指定在每次测试之前运行迁移。
底层是 包 的简化版本,因此也适用于来自该包的迁移。唯一的例外是,迁移不是从 Arrilot\BitrixMigrations\BaseMigrations\BitrixMigration
类继承,而是从 Arrilot\BitrixMigrationsFork\BaseMigrations\BitrixMigration
类继承。
迁移目录的路径在测试的 getMigrationsDir
方法中指定
protected function getMigrationsDir() : string { return __DIR__ . '/../migrations'; }
特性附带了一个用于根据模板创建迁移的辅助方法 makeMigration
。
protected function makeMigration(string $name, string $template) : void
现有模板
附加特性 - CSVTrait
用于在迁移中导入 CSV 文件(Bitrix 导出格式)。
使用后,测试必须实现以下方法
getIblockCode()
- 信息块代码;getImportDefinitionSections()
- 子部分定义。CSV 文件中的列号数组(IC_GROUP0 等);getImportDefinitionProperties()
- 属性定义。属性代码 => CSV 文件中的列号的数组;getCsvPath()
- CSV 文件路径;
注意! - CSV 文件中不应包含列标题行。
调用者
从 包。根据特定需求进行了修改。
细节
使用 Prokl\BitrixTestingTools\Invokers\ComponentInvoker
类来帮助测试组件代码。
类方法
__constructor($componentObject)
- 初始化启动组件对象;init()
- 初始化;setParams($params)
- 为启动测试组件设置参数;setArParams($params)
- 为启动测试组件设置 arParams;setName(string $name)
- 设置组件名称("test.component");setTemplate($template)
- 设置组件模板("test.component");execute()
- 执行组件(不使用模板);getResultValue($name)
- 返回按键 $name 的 $arResult 参数;getArResult()
- 返回组件工作的完整 $arResult;getArResultCached()
- 返回组件工作后通过 $this->__component 缓存的部分 $arResult;getExecuteResult()
- 当组件代码中使用return
返回操作符时,返回组件工作结果;
示例
// ... /** * @label component * @test */ public function useComponentInvoker() { /** @var CBitrixComponent $componentObject */ $component = new \Prokl\BitrixTestingTools\Invokers\ComponentInvoker($componentObject); $component->init(); $component->setParams(array("id" => 10)); $component->execute(); $this->getAssert()->equal($component->getResultValue("id"), 10, "Результат не верен"); }
测试模板适配器(result_modifier)的工作
可以使用 Prokl\BitrixTestingTools\Invokers\ResultModifierInvoker
类的对象测试组件的 result_modifier。
方法
__construct($componentName, $template)
- 初始化对象,参数与CMain::IncludeComponent()
方法参数相同;setArResult($arResult)
- 人工设置结果以传递给适配器;setArParams($params)
- 为启动测试组件设置 arParams;execute()
- 执行适配器;getArResult()
- 返回适配器工作的完整 $arResult;getArResultCached()
- 返回组件工作后通过 $this->__component 缓存的部分 $arResult;getArResultValue($name)
- 返回适配器工作结果按键$name
的值;
示例
/** * @label component * @test */ public function modifierForSomeTemplate() { $rm = new \Prokl\BitrixTestingTools\Invokers\ResultModifierInvoker("project:test.with.class", "list"); $rm->setArResult(array("id" => 10)); $rm->execute(); $this->getAssert()->equal($rm->getArResultValue("id"), 10, "Параметры не равны"); }
测试事件处理
Prokl\BitrixTestingTools\Invokers\EventInvoker
类简化了事件处理测试。
方法
__construct($module, $eventName)
- 初始化事件启动对象,$module - 事件抛出模块的名称,$eventName - 事件名称;setExecuteParams($params)
- 将事件参数设置为数组形式,将传递给事件参数;execute()
- 抛出事件;countOfHandlers()
- 获取事件处理器的数量;getEvent()
- 获取事件对象;
示例
// ... /** * @test */ public function handlersOfEventExist() { $eventInvoker = new \Prokl\BitrixTestingTools\Invokers\EventInvoker("main", "OnPageStart"); $eventInvoker->setExecuteParams(array( "IBLOCK_ID" => 12 )); $eventInvoker->execute(); $this->getAssert()->asTrue($eventInvoker->countOfHandlers() > 1); }
其他
BitrixableTestCase
类的goTo
方法。模拟在某个 URL 上。设置与 URL 相关的所有旧内核和 D7 相关的内容。
还自动替换 $_SERVER、$_POST 等超级全局变量中的所有可能内容。
$_GET['test'] = 'OK'; $this->goTo('/test/'); $url = $APPLICATION->GetCurPage(); // $url = '/test/index.php' $request = Application::getInstance()->getContext()->getRequest(); $uriString = $request->getRequestUri(); // $uriString = '/test/' $testGetParam = $request->getQuery('test'); // $testGetParam = 'OK'