ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Nextcloud user_ldap 集成测试实战:基于 Docker OpenLDAP 的自动化测试机制解析

2026/9/6 23:07:06 拓冰建站 浏览量
Nextcloud user_ldap 集成测试实战:基于 Docker OpenLDAP 的自动化测试机制解析 Nextcloud user_ldap 集成测试实战基于 Docker OpenLDAP 的自动化测试机制解析【免费下载链接】server☁️ Nextcloud server, a safe home for all your data项目地址: https://gitcode.com/GitHub_Trending/se/server本篇指南基于apps/user_ldap/tests/Integration/目录下的集成测试说明文档readme.md系统讲解 Nextcloud user_ldap 应用的 LDAP 集成测试是如何运作的如何搭建测试环境、如何用一条命令拉起一个全新的 OpenLDAP 并执行指定测试脚本、测试框架内部如何驱动case*用例以及这套机制的适用边界与已知限制。读完后你可以独立运行 user_ldap 的 LDAP 集成测试、为特定场景编写新的测试用例并理解测试脚本与AbstractIntegrationTest基类、容器化 LDAP 环境之间的调用关系。一、Requirements测试环境的组成原文档明确指出运行集成测试前需要在setup-scripts目录中准备好三个脚本如仓库中尚未包含需从 ownCloud 官方的 ldap-testing 项目复制而来start.sh启动一个全新、干净的 OpenLDAP Docker 容器stop.sh停止并重置容器config.phpLDAP 连接配置主机、端口、绑定 DN、Base DN、管理员密码等。文档同时提醒应按需修改config.php并检查start.sh和stop.sh中的 LDAP 与网络设置例如容器端口映射。从源码结构看config.php在测试链路中有三处消费方Bootstrap.php 在定义CLI_TEST_RUN并加载 Nextcloud 内核lib/base.php之后加载setup-scripts/config.php由此获得$host、port、$adn管理员绑定 DN、$apwd、$bdnBase DN等全局变量各 setup 脚本如 createExplicitUsers.php直接include config.php用其中的凭据以 PHP LDAP 扩展连接容器内的 slapd创建ouUsers组织单元和alice、boris、cynthia等inetOrgPerson用户条目测试类在文件末尾用这些变量构造测试实例例如 IntegrationTestAttributeDetection.php 的结尾/** var string $host */ /** var int $port */ /** var string $adn */ /** var string $apwd */ /** var string $bdn */ $test new IntegrationTestAttributeDetection($host, $port, $adn, $apwd, $bdn); $test-init(); $test-run();也就是说config.php是容器端口/凭据与PHP 测试代码之间的唯一桥梁这也是文档要求先配置好它再谈运行的原因。二、Usage用一条命令运行测试文档给出的基本命令是在tests/Integration目录内、以 root 身份执行sudo ./run-test.sh [phpscript]原文档附带的真实运行输出示例如下可以看到容器 ID、端口映射、测试数据创建过程和最终结果$ sudo ./run-test.sh lib/IntegrationTestAccessGroupsMatchFilter.php 71cbe88a4993e67066714d71c1cecc5ef26a54911a208103cb6294f90459e574 c74dc0155db4efa7a0515d419528a8727bbc7596601cf25b0df05e348bd74895 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c74dc0155db4 osixia/phpldapadmin:0.5.1 /sbin/my_init 1 seconds ago Up Less than a second 80/tcp, 0.0.0.0:8443-443/tcp docker-phpldapadmin 71cbe88a4993 nickstenning/slapd:latest /sbin/my_init 1 seconds ago Up Less than a second 127.0.0.1:7770-389/tcp docker-slapd LDAP server now available under 127.0.0.1:7770 (internal IP is 172.17.0.78) phpldapadmin now available under https://127.0.0.1:8443 created user : Alice Ealic created group : RedGroup created group : BlueGroup created group : GreenGroup created group : PurpleGroup running case1 running case2 Tests succeeded Stopping and resetting containers docker-slapd docker-phpldapadmin docker-slapd docker-phpldapadmin对照 run-test.sh 源码其完整逻辑非常简洁if [ $1 ] ; then TESTSCRIPT$1 else echo No test file given exit fi if [ ! -e $TESTSCRIPT ] ; then echo Test file does not exist exit fi # sleep is necessary, otherwise the LDAP server cannot be connected to, yet. setup-scripts/start.sh sleep 5 php -f $TESTSCRIPT setup-scripts/stop.sh可以归纳为四个硬性行为未传参数或测试文件不存在时直接退出不触碰容器start.sh成功后sleep 5—— 注释明确说明这是为了避免LDAP 服务器尚不可连接的竞态用php -f以 CLI 方式执行指定测试脚本无论测试成功与否最后都会执行stop.sh关停并重置容器保证下一次运行从干净环境开始。批量执行run-all.shrun-all.sh 是把所有用例串起来的批量入口它通过ls -d -p Lib/*和ls -d -p Lib/User/*收集根目录与User子目录下的测试文件代码注释表明将来目录更多时应改为递归遍历逐个调用./run-test.sh并依据输出中是否包含Tests succeeded判定成败任一失败即打印failed!、通过notify-send弹出桌面通知并exit 1全部通过则提示All tests succeeded。这一判定方式正是测试脚本如何向 shell 汇报结果的契约脚本进程以退出码 0 结束且打印了Tests succeeded批量脚本才认为通过。三、How it works三步流程与测试基类3.1 文档描述的三步流程原文档 How it works 一节将整体流程概括为执行start.sh拉起一个全新、干净的 OpenLDAPDocker 容器执行所提供的测试脚本脚本自身负责输出结果执行stop.sh关停 OpenLDAP。这与run-test.sh的源码完全对应并且解释了为什么每次测试都是一次性环境容器被销毁重置避免了测试间的数据污染例如上一个测试创建的用户、组残留。3.2 测试脚本内部AbstractIntegrationTest每个Lib/下的测试脚本如 Lib/IntegrationTestPaging.php、Lib/User/IntegrationTestUserAvatar.php都继承 AbstractIntegrationTest.php基类定义了两段核心机制1init()构建一套指向测试容器的 LDAP 连接。initConnection()通过setConfiguration()写入一组与 Nextcloud LDAP 配置同名的键$this-connection-setConfiguration([ ldapHost $this-server[host], ldapPort $this-server[port], ldapBase $this-base, ldapAgentName $this-server[dn], ldapAgentPassword $this-server[pwd], ldapUserFilter objectclassinetOrgPerson, ldapUserDisplayName cn, ldapGroupDisplayName cn, ldapLoginFilter (|(uid%uid)(samaccountname%uid)), ldapCacheTTL 0, ldapConfigurationActive 1, ]);其中ldapCacheTTL 0值得注意集成测试必须禁用缓存否则查询会命中上一轮的缓存结果而不是刚在容器里写入的数据ldapLoginFilter同时兼容uid与samaccountname覆盖 OpenLDAP 与 Active Directory 两种属性风格。init()还会依次初始化LDAP封装、Connection、Manager用户管理器、Helper与Access把 user_ldap 的核心运行时装配到测试上下文中。2run()约定式用例发现。基类遍历当前类的所有方法凡以case开头的如case1、case2或 IntegrationTestAttributeDetection.php 中的caseNativeUUIDAttributeUsers依次执行方法返回 false 打印 !!! Test xxx FAILED !!! 并以退出码 1 结束抛出异常打印RAISED AN EXCEPTION同样退出 1全部通过则打印Tests succeeded若一个case*方法都没找到则打印No Test was available.并退出 1。这段逻辑解释了输出示例中running case1 / running case2 / Tests succeeded的来源也是run-all.sh判定的依据。3测试数据的准备。测试类的init()会先require对应的 setup 脚本例如 AttributeDetection 测试在父类init()之前先执行require(__DIR__ . /../setup-scripts/createExplicitUsers.php); require(__DIR__ . /../setup-scripts/createExplicitGroups.php);createExplicitUsers.php 用ldap_connectldap_bind连接容器创建ouUsers再批量写入 7 个inetOrgPerson用户createExplicitGroups.php、createExplicitGroupsDifferentOU.php、createUsersWithoutDisplayName.php 则覆盖显式创建组、组分布在多个 OU、用户无 displayName 属性等场景。这正是输出示例中created user : Alice Ealic、created group : RedGroup ...等行的来源。3.3 测试覆盖的场景一览结合 tests/Integration 目录结构该机制当前覆盖的测试分为两组根目录Lib/属性自动检测AttributeDetection、分页Paging、按登录名计数/检索用户等核心访问路径Lib/User/头像UserAvatar配合 data/avatar-valid.jpg 与 data/avatar-invalid.gif 测试素材、显示名、离线用户清理UserCleanUp。四、Beware文档明确声明的机制边界原文档 Beware 一节给出了三条重要限制使用时必须知晓这是一个面向单个测试用例的快速方案。文档自述随着用例扩展这套机制本身也应改进——它不追求工程化的测试编排而是起容器 → 跑脚本 → 停容器的最短路径不会自动运行。文档原文It does not run automatically, unless you do it. No integration with any testing framework.即它没有接入 PHPUnit 等测试框架不会随autotest.sh之类的入口自动执行只能手动触发ExceptionOnLostConnection.php 不属于该机制。ExceptionOnLostConnection.php 不通过run-test.sh运行需要阅读其源码后单独执行文档还半开玩笑地建议顺手把它移植进该机制。此外从run-test.sh源码还可以补充两个文档未展开的实操细节由于要执行start.sh/stop.sh管理容器并可能涉及特权端口文档强调要as root from within this directory运行而脚本中sleep 5是写死的容器就绪等待若你的环境里 slapd 启动更慢容器端口映射如示例中的127.0.0.1:7770-389/tcp也应按config.php/start.sh中的实际设置核对确保config.php中的 host/port 与容器映射一致。五、小结user_ldap 的集成测试是一套容器化 OpenLDAP 约定式 PHP 脚本的轻量方案环境侧start.sh/stop.sh管理一次性 slapd 容器config.php提供唯一的连接配置setup 脚本负责注入测试数据驱动侧run-test.sh完成启容器 → sleep → 跑脚本 → 停容器的闭环run-all.sh按Tests succeeded关键字批量判定代码侧AbstractIntegrationTest 通过init()装配完整的 LDAP 连接与用户/组管理栈通过run()执行所有case*方法并以退出码汇报结果。若需要为该机制新增一个测试用例路径是明确的在Lib/下新建脚本requireBootstrap.php 与所需 setup 脚本继承AbstractIntegrationTest实现若干case*方法末尾按$host/$port/$adn/$apwd/$bdn五参构造并init()、run()即可随后用sudo ./run-test.sh Lib/YourTest.php验证。【免费下载链接】server☁️ Nextcloud server, a safe home for all your data项目地址: https://gitcode.com/GitHub_Trending/se/server创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考