codeigniter单元测试核心是围绕base model建立可验证、可回归的测试习惯,需覆盖crud行为边界、用ci_testcase模拟环境、践行tdd命名与验证逻辑下沉,并通过集成测试保障控制器-模型-第三方库协同可靠性。

CodeIgniter项目做单元测试,核心不是堆工具,而是围绕模型层建立可验证、可回归的测试习惯。尤其在使用Base Model这类增强型基础模型时,测试直接关系到数据操作的可靠性。
从Base Model开始写测试
CodeIgniter Base Model自带完整CRUD接口,测试应优先覆盖这些方法的行为边界:
-
主键操作必须验证返回值类型与内容:比如
test_get()不仅要检查是否返回数组或对象,还要断言字段名、null值处理、不存在ID时的返回(如false或空数组) -
条件查询需覆盖多字段组合、空条件、非法字段名:例如
test_get_by(['status' => 'active', 'type' => null])应明确预期行为——是忽略null还是当作IS NULL处理 -
批量操作要测数量与原子性:
test_insert_many()插入100条后,查总数是否+100;若中途失败,是否回滚(需确认事务配置)
用CI_TestCase模拟真实环境
别手动构造CI实例,直接继承CI_TestCase能省掉90%环境初始化工作:
- 自动加载
application/和system/路径,无需重复定义BASEPATH - 内置
$this->request->set()模拟HTTP请求参数,适合测带输入验证的模型方法 - 支持
$this->db模拟——可在tests/support/database.php中配置内存SQLite或mock PDO,避免污染真实库
测试驱动开发(TDD)落地要点
在CodeIgniter里实践TDD,关键不在“先写测试”,而在“让测试能快速反馈”:
- 每个测试方法只验证一个行为,命名体现意图,如
test_update_by_ignores_empty_values()比test_update()更易维护 - 把验证逻辑下沉到模型方法内部(如
validate()返回错误数组),测试就专注调用+断言,不重复校验规则 - 利用Base Model的事件钩子(
before_insert、after_get)写针对性测试,确认回调是否按序触发、能否中断流程
集成测试补位关键路径
单元测试保模型,集成测试保协作。重点测三类链路:
- 控制器调用模型后,是否正确传递参数并处理返回结果(如分页数据结构、错误码映射)
- 模型与第三方库联动场景,例如用
encrypt库加密字段后再存库,测试需覆盖加解密一致性 - 跨模型关联操作,像
UserModel->with('profile')->get(),验证关联数据是否加载、是否N+1











