ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

YOURLS 单元测试套件完全指南:本地搭建 PHPUnit 测试环境与“新进程”场景测试

YOURLS 单元测试套件完全指南:本地搭建 PHPUnit 测试环境与“新进程”场景测试 后端【免费下载链接】YOURLS The standard, self hosted, powerful and customizable, URL shortener in PHP项目地址https://gitcode.com/gh_mirrors/yo/YOURLS点击查看免费下载导读本文以 YOURLS 官方测试套件tests/README.md为核心完整讲解如何在本地搭建 PHPUnit 测试环境、运行全部 500 条测试以及如何使用“新进程New Process”机制测试那些只能在全新 PHP 进程中才能验证的行为如常量定义、require_once加载顺序等。读完本文你将能够独立配置测试数据库、运行整组或指定分组的测试并掌握如何为 YOURLS 编写和运行场景化scenario测试。测试套件概览YOURLS 的单元测试套件位于仓库根目录的 tests 目录包含数百条测试用例覆盖 API、认证、数据库、格式化、GeoIP、HTTP、安装、l10n、链接、插件、短链、统计、主题、工具函数等几乎所有核心模块。它的设计目标非常明确当 YOURLS 的任何代码被新增、修改或删除时确保在官方支持的所有 PHP 版本下一切功能仍然正常原文“a collection of hundreds of tests to make sure that whenever something in YOURLS is added, changed or removed, everything still works under all the supported PHP versions”。从仓库结构看测试套件由以下几部分协同构成tests/bootstrap.phpPHPUnit 的引导脚本负责加载测试配置、引导 YOURLS 核心、安装数据库表并输出 “YOURLS installed, starting PHPUnit” 提示tests/includes测试专用辅助函数与 traitboot.php、install.php、new-process.php、utils.phptests/tests按模块组织的 PHPUnit 测试用例如api/、auth/、shorturl/等子目录tests/data测试数据与脚本包括配置样例、插件、翻译文件、远程页面样本及场景脚本phpunit.xml.dist仓库根目录下的 PHPUnit 配置模板。本地运行测试分步指南第 0 步安装 PHPUnit测试依赖通过 tests/composer.json 声明phpunit/phpunit: *并定义了test脚本为phpunit。在 YOURLS 仓库根目录执行composer -d tests/ install-d tests/让 Composer 在tests/目录下工作安装 PHPUnit 及其依赖。第 1 步准备一个空的 MySQL 数据库创建一个全新的 MySQL 数据库和对应的用户。千万不要使用任何已有的数据库因为测试套件会在引导阶段删除其中的表——原文明确警告“Do not use an exisiting database or you will lose data, guaranteed.”使用了已有数据库数据必然丢失无例外。这一危险行为在源码中有明确实现tests/includes/install.php 中的yut_drop_all_tables_if_local()会在本地非 CI环境下执行DROP TABLE IF EXISTS依次清空YOURLS_DB_TABLE_URL、YOURLS_DB_TABLE_OPTIONS、YOURLS_DB_TABLE_LOG三张表$tables sprintf(%s,%s,%s, YOURLS_DB_TABLE_URL, YOURLS_DB_TABLE_OPTIONS, YOURLS_DB_TABLE_LOG); $sql sprintf(DROP TABLE IF EXISTS %s, $tables); yourls_get_db(write-drop_tables_if_local)-perform($sql);因此请务必为测试单独建库隔离运行环境。第 2 步复制并编辑测试配置文件将配置样例复制到测试配置位置cp tests/data/config/yourls-tests-config-sample.php tests/yourls-tests-config.php然后编辑 tests/yourls-tests-config.php使其匹配你的环境。配置样例的完整内容见 tests/data/config/yourls-tests-config-sample.php关键常量如下常量说明样例值YOURLS_ABSPATH被测 YOURLS 代码库的绝对路径/home/you/yourls_directoryYOURLS_SITE该代码库对应的 URLhttp://127.0.0.1/yourls_directoryYOURLS_DB_USER/YOURLS_DB_PASSMySQL 用户名 / 密码your DB username等YOURLS_DB_NAME空的测试数据库名内容会被全部清空DB name for tests -- an empty oneYOURLS_DB_HOSTMySQL 主机localhostYOURLS_DB_PREFIX表前缀yourls_YOURLS_PHP_BINPHP 可执行文件路径若不在系统 PATH 中需填绝对路径如c:/php/php.exephpYOURLS_LANG测试用语言环境指向 data 目录中的样例翻译文件fr_FRYOURLS_DEBUG开启调试trueYOURLS_COOKIEKEYCookie 密钥I hearts; unit tests配置中还预置了两组重要的全局数据$yourls_reserved_URL保留短链关键词数组如porn、sex、fuck等用于测试保留关键词校验逻辑$yourls_user_passwords多组测试账号与密码覆盖纯文本、MD5salt、旧版 PHPass、password_hash、特殊字符如lol .\*?[^]$(){}!|:-/、引号、UTF-8 阿拉伯语密码等边界情况用于认证相关测试。配置文件查找顺序定义在 tests/includes/boot.php 的yut_find_config()中依次尝试仓库根目录下的yourls-tests-config.php、tests/yourls-tests-config.php以及user/config.phpCI 场景第一个可读的即被采用。第 3 步运行测试在 YOURLS 根目录执行composer -d tests/ run test -- --configuration../phpunit.xml.dist ..该命令经由composer -d tests/ run test调用phpunit显式指定 phpunit.xml.dist 为配置并把测试目录指向仓库根目录..。配置文件中已声明bootstraptests/bootstrap.php使用测试引导脚本testsuite 名为YOURLS Test Suite扫描./tests/tests目录排除AbstractLoginTestCase.php与LoginAssertionTrait.php两个基类文件排除ajax分组该分组依赖浏览器环境通过php段注入PHPUNIT_TESTSUITE常量、登录请求参数usernameyourls、passwordsecret-ci-test、模拟服务端环境SERVER_SOFTWARETRAVIS APACHE、HTTP_USER_AGENT、HTTP_HOST、HTTP_CLIENT_IP以及 API 默认formatsimple。运行成功后你将看到类似如下的输出来自 README 的真实运行记录YOURLS installed, starting PHPUnit PHPUnit by Sebastian Bergmann and contributors. Configuration: ...\phpunit.xml.dist ............................................................... 63 / 519 ( 12%) ............................................................... 126 / 519 ( 24%) ............................................................... 189 / 519 ( 36%) ............................................................... 252 / 519 ( 48%) ............................................................... 315 / 519 ( 60%) ............................................................... 378 / 519 ( 72%) ............................................................... 441 / 519 ( 84%) ............................................................... 504 / 519 ( 97%) ............... 519 / 519 (100%) Time: 6.06 seconds, Memory: 24.25Mb OK (519 tests, 1123 assertions)引导阶段tests/bootstrap.php做了什么其关键流程为先require_once各辅助文件再调用yut_boot_yourls()加载配置并引导 YOURLS 核心此时不读数据库随后标记is_installing以绕过防洪水flood检查调用yut_install_yourls()建表内部会检查 MySQL 与 PHP 版本过低则直接die之后读取全部选项、加载插件并注册一个简化版yourls_die()的 action——测试中触发yourls_die()时会打印参数与最近 10 层调用栈并以状态码 1 退出便于定位问题。只运行指定分组的测试PHPUnit 原生支持按group注解筛选测试例如只跑格式化相关用例phpunit --group formatting仓库中大量测试文件都带有分组注解例如tests/tests/format/下的DatesTest.php、EscTest.php、SanitizeTest.php等均归属formatting分组。你可以用同样的方式按需筛选auth、shorturl、stats、plugins等分组加快迭代调试。自定义 PHPUnit 配置phpunit.xml 优先PHPUnit 同时支持phpunit.xml与phpunit.xml.dist且phpunit.xml的优先级更高。如果你想指定自己的设置例如修改缓存目录、调整 testsuite 范围、改变注入的服务器变量只需cp phpunit.xml.dist phpunit.xml然后编辑phpunit.xml即可无需改动仓库自带的.dist模板。高级机制在全新 PHP 进程中测试New Process Testing为什么需要新进程有些行为在每个 PHP 进程中只能发生一次常量一旦被define()就无法重新定义文件一旦被require_once加载就不会再执行第二次。如果在测试套件的进程内直接断言这些行为你只能知道“之前某个测试恰好先触发了什么”而不是被测代码本身的确定性行为。例如YOURLS_PRIVATE是否为true会决定 includes/auth.php 是否被加载、YOURLS_USER是否被定义某些引导步骤依赖于配置常量在不同配置下表现完全不同。这类场景必须通过scenario场景脚本在一个全新的 PHP 进程中验证。新进程测试的用法在测试类中引入NewProcessTrait定义于 tests/includes/new-process.php即可调用run_in_new_process()class SomeTest extends PHPUnit\Framework\TestCase { use NewProcessTrait; public function test_something() { $report $this-run_in_new_process( some-scenario, array( YOURLS_SOMETHING false ) ); $this-assertArrayNotHasKey( YOURLS_USER, $report[constants] ); $this-assertNotContains( includes/auth.php, $report[included] ); } }run_in_new_process( $scenario, $constants )的签名与行为见 new-process.php$scenario场景名即tests/data/scripts/scenarios/name.php$constants在 YOURLS 引导之前定义的常量映射$name $value返回数组包含三个键scenario场景名、constants进程中所有已定义的YOURLS_*常量、included已加载文件中位于YOURLS_ABSPATH之下的部分以相对路径按加载顺序列出。实现细节若未定义YOURLS_PHP_BIN测试会被标记为 skipped跳过实际执行时用escapeshellarg安全地拼接命令php run-scenario.php scenario constants-json通过exec()运行并断言退出码为 0报告取输出内容的最后一行 JSON 解析——场景脚本在此之前打印的任何内容都会被忽略。底层执行流程run-scenario.php执行新进程测试的核心脚本是 tests/data/scripts/run-scenario.php其工作流程与 README 描述完全一致定义常量解析命令行参数场景名 JSON 格式的常量对象在加载任何代码之前逐一定义这些常量确保 config 与核心代码能看到它们。用法示例php run-scenario.php maybe-require-auth {YOURLS_PRIVATE:false}引导 YOURLSrequire_once测试的 boot.php 并调用yut_boot_yourls()以与测试套件完全相同的方式引导 YOURLS与tests/bootstrap.php不同的是这里会读取数据库——数据库表由调用它的测试套件预先装好运行场景require对应的scenarios/name.php场景文件。场景是纯 PHP、无任何断言的“行动者”它只负责执行动作由测试侧对报告做断言回报结果收集所有user常量中以YOURLS_开头的部分以及get_included_files()中位于YOURLS_ABSPATH之下的文件转换为相对路径、保持加载顺序最后输出一行 JSON。此外脚本还注册了skip_password_hashing过滤器作为安全网确保场景执行过程中绝不会重写测试套件的配置文件。场景文件长什么样仓库自带两个真实场景位于 tests/data/scripts/scenariosmaybe-require-auth.php在进程中预先填充username/password请求参数与admin_login的 nonce然后调用yourls_maybe_require_auth()。配合调用侧传入不同的YOURLS_PRIVATE值即可验证“公开站 vs 私密站”两种配置下 includes/auth.php 是否被加载、YOURLS_USER是否被定义restrict-remote-title-fetch.php验证远程标题抓取受限场景。编写新场景只需在scenarios/目录下新增一个纯 PHP 文件在 YOURLS 完整引导后运行一次内部不做断言、只执行动作断言全部由测试方法针对run_in_new_process()返回的报告完成。注意运行场景时数据库已被测试套件安装完毕场景可直接使用。小结YOURLS 的测试套件是一套设计严谨的工程质量保障体系通过 bootstrap.php 自动化安装数据库、通过 phpunit.xml.dist 统一注入测试环境、通过 NewProcessTrait 与 run-scenario.php 解决“进程级单次行为”的测试难题。按照 README 的四步流程——安装 PHPUnit、准备空数据库、复制配置、运行测试——任何人都可以在本地完整复现OK (519 tests, 1123 assertions)的绿色结果并在此基础上编写属于自己的分组测试与场景测试。赞分享后端【免费下载链接】YOURLS The standard, self hosted, powerful and customizable, URL shortener in PHP项目地址https://gitcode.com/gh_mirrors/yo/YOURLS点击查看免费下载相关推荐Moodle PHPUnit 测试环境搭建与单元测试编写完整指南Moodle PHPUnit 测试环境搭建与单元测试编写完整指南 本文以 Moodle 仓库中的 public/lib/phpunit/readme.md ht教育后端前端phpMyAdmin 测试套件实战指南单元测试与 Selenium 端到端测试环境搭建phpMyAdmin 测试套件实战指南单元测试与 Selenium 端到端测试环境搭建 本指南围绕 tests/README.rst https://link数据库后端3大核心功能解密Chatterbox开源语音合成从零到专业实战3大核心功能解密Chatterbox开源语音合成从零到专业实战 你是否在为多语言语音合成需求而烦恼是否需要一个既能快速部署又支持情感控制的语音解决方案Ch人工智能语音音频媒体生成本地部署创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表