法则一:聚焦单一职责原则
每个测试用例仅验证一个逻辑分支或一种行为路径。避免出现“全能型”测试,确保用例失败时可精准定位问题源。
反例:
testUserRegistration()同时验证邮箱格式、密码强度、数据库写入。
正例:拆分为testEmailValidation(),testPasswordPolicy(),testDbSave()三个独立用例。
法则二:构建确定性测试
测试结果必须100%可复现。消除随机数据、外部API依赖、未清理的共享状态(如静态变量)。采用Mock/Stub隔离外部服务,使用内存数据库替代真实连接。
// 使用Mockito模拟服务依赖 @Mock UserService userService; @Test void testOrderCreate() { when(userService.getBalance(any())).thenReturn(100.0); // 固定返回值 // 执行订单创建断言 }法则三:命名即文档
测试方法名需明确表达 “被测对象_执行条件_预期结果” 三元组。
推荐格式:
should_ReturnTrue_When_InputIsPrimeNumber()
避免模糊命名:testCase1()
法则四:践行FIRST原则
- Fast(快速): 单用例执行≤10ms
- Isolated(隔离): 用例间零耦合
- Repeatable(可重复): 环境无关
- Self-validating(自验证): 自动判断结果
- Timely(及时): 与生产代码同步编写
法则五:强化失败诊断信息
断言语句需携带业务语义化描述,加速故障分析:
# 不推荐 assert result == 0 # 推荐 assert result == 0, f"预期账户初始余额为0,实际得到{result}"法则六:分层构造测试数据
采用 Build模式 或 ObjectMother模式 管理测试数据:
// 使用Builder构建复杂订单对象 const order = new OrderBuilder() .withProduct("iPhone15", 2) .withUser(VIP_USER) .build();法则七:优先验证行为而非实现
通过黑盒测试避免过度耦合实现细节。当重构内部逻辑时,良好行为测试无需修改。
关键:验证
calculateTax()的输出是否符合税法规则,而非检查是否调用了某私有方法。
法则八:建立测试防护网
通过代码覆盖率可视化定位薄弱模块(重点关注意外处理、边界条件):
# JaCoCo示例报告重点区域 [BRANCH] com/service/Payment.java:56 - 未覆盖金额为负的异常分支法则九:自动化代码异味检测
集成静态分析工具自动拦截常见陷阱:
- 检测“沉睡测试”(无断言语句)
- 标记“脆弱测试”(包含魔法数字/字符串)
- 发现“重复测试逻辑”
法则十:测试即活文档
将测试套件作为可执行的系统规格说明书。结合BDD框架(如Cucumber)用自然语言描述需求:
Scenario: 用户登录失败处理 当 输入用户名"invalid@demo.com"和错误密码 那么 页面应显示"认证失败" 并且 账户锁定计数器+1技术演进前瞻(2026视角)
- AI辅助测试生成:基于代码上下文自动推导边界用例
- 智能突变测试:自动注入缺陷验证防护有效性
- 云原生测试沙盒:秒级创建隔离的微服务测试环境