
本文详解如何为解析 module,marks 格式并返回最高/最低分模块的 PHP 函数编写可靠 PHPUnit 测试,重点解决输入文本模拟、断言逻辑修正及边界用例覆盖。
本文详解如何为解析 module,marks 格式并返回最高/最低分模块的 php 函数编写可靠 phpunit 测试,重点解决输入文本模拟、断言逻辑修正及边界用例覆盖。
在单元测试中处理类似 "module1,60newlinemodule2,50newlinemodule3,40" 这类自定义分隔符(非标准 \n)的输入文本,关键在于:严格匹配函数的实际行为与预期输出格式,而非仅校验数值。你的 getMaxMin() 函数并非返回纯数字,而是拼接后的字符串(如 "module1, 60newlinemodule3, 40"),因此 assertSame() 的第一个参数必须是完整期望字符串,第二个参数才是函数调用结果。
✅ 正确的测试写法(修正版)
首先,注意你原测试中 assertSame(60, 40, getMaxMin(...)) 存在三处错误:
- 参数顺序错误:
assertSame($expected, $actual),第三个参数是可选$message; - 类型与值不匹配:
60和40是整数,而getMaxMin()返回字符串; - 未按函数实际输出构造期望值。
以下是修复后的完整测试示例(假设函数已定义在 functions.inc.php 中):
<?php use PHPUnit\Framework\TestCase;
require_once 'functions.inc.php';
class MaxMinTest extends TestCase
{
public function testGetMaxMinReturnsCorrectMaxAndMinModule()
{
$input = "module1,60newlinemodule2,50newlinemodule3,40";
$expected = "module1, 60newlinemodule3, 40"; // 注意空格、大小写、"newline" 字面量
$this->assertSame($expected, getMaxMin($input));
}
// 补充边界测试:单条记录
public function testGetMaxMinWithSingleModule()
{
$input = "math,95";
$expected = "math, 95newlinemath, 95";
$this->assertSame($expected, getMaxMin($input));
}
// 补充边界测试:空输入(需根据函数鲁棒性决定是否支持)
public function testGetMaxMinWithEmptyInput()
{
$this->expectException(TypeError::class); // 若 explode 报错,或可加空输入防护
getMaxMin('');
}
}
⚠️ 注意事项与最佳实践
-
newline是字面字符串,不是换行符:你的代码使用explode("newline", $input_text),因此测试输入中必须显式写出newline(如"m1,60newlinem2,50"),而非使用PHP_EOL或\n。混淆这点会导致explode返回单元素数组,后续逻辑崩溃。 -
空格敏感:函数中拼接时使用了
'module' . ', ' . 'marks'(注意逗号后有空格),故$expected字符串中", "必须一致,否则assertSame失败。 -
排序稳定性:
usort基于marks降序排列,确保最高分在前、最低分在末尾。测试时建议用不同数值验证排序逻辑(如"a,80newlineb,90newc,70"应返回"b, 90newc, 70")。 -
防御性编程建议:当前函数未处理空行、缺失字段或非数字分数。生产环境应增强健壮性,例如:
$line_array = array_map('trim', explode(',', $line)); if (count($line_array)
✅ 运行测试
确保已安装 PHPUnit(推荐 Composer 管理):
composer require --dev phpunit/phpunit ./vendor/bin/phpunit --bootstrap functions.inc.php MaxMinTest.php
若输出 OK (3 tests, 3 assertions),说明所有测试通过。
通过以上结构化测试,你不仅能验证核心逻辑,还能提前暴露格式依赖、边界异常等潜在问题,真正实现“输入即契约,输出即承诺”的高质量单元测试目标。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











