0. 速读结论
维度 | 静态测试 | 动态测试 |
---|---|---|
执行时机 | 不运行代码 | 必须运行代码 |
目标 | 预防缺陷 | 发现缺陷 |
典型方法 | 代码审查、静态分析工具 | 单元测试、接口测试、性能测试 |
优势 | 早期低成本发现缺陷 | 验证真实运行行为 |
1. 本质区别图解
图表
代码
下载
否
是
测试类型
是否执行代码?
静态测试
动态测试
人工走查/工具扫描
输入数据/观察输出
2. 深度解析(附代码示例)
2.1 静态测试:像X光扫描代码
▶ 典型场景:
-
代码评审时发现潜在空指针异常(Java示例):
java
复制
下载
// 静态分析工具(如SonarQube)会标记此风险 String str = null; System.out.println(str.length()); // 缺陷预警!
▶ 优势:
-
在编码阶段即可发现
拼写错误
、死代码
、安全漏洞
等 -
成本仅为动态测试的1/5(数据来源:NIST研究报告)
2.2 动态测试:像发动机压力测试
▶ 典型场景(Python+Pytest示例):
python
复制
下载
# 测试函数执行结果是否符合预期 def test_add(): assert add(2, 3) == 5 # 动态验证
▶ 必须满足三要素:
-
测试输入(如参数2和3)
-
执行环境(需部署Python解释器)
-
预期输出(结果为5)
3. 如何选择?看这个决策树
plaintext
复制
下载
是否需要验证运行时行为? ├─ 是 → 动态测试(如内存泄漏检测) └─ 否 → 静态测试(如代码规范检查)
4. 实战经验包
-
组合使用效果更佳:
-
先用
SonarQube
做静态扫描 → 再通过JUnit
动态验证
-
-
避坑指南:
-
静态测试无法发现
并发问题
(需动态测试) -
动态测试
覆盖率不足
时需补充静态检查
-
5. 终极答案
静态测试是“预防性体检”,动态测试是“治疗性手术”
两者如同汽车的安全带
和安全气囊
,缺一不可!