软件测试速查表
这份速查表汇总了软件测试的核心概念、方法和最佳实践,方便快速查阅。
测试类型速查
按测试阶段分类
| 类型 | 定义 | 特点 | 工具示例 |
|---|---|---|---|
| 单元测试 | 测试最小可测试单元 | 快速、隔离 | pytest, JUnit, Jest, Go test |
| 集成测试 | 测试模块间交互 | 中等速度 | TestContainers, pytest |
| 系统测试 | 测试完整系统 | 慢、全面 | Selenium, Playwright |
| E2E测试 | 模拟用户完整流程 | 最慢、最真实 | Playwright, Cypress |
按测试方法分类
| 类型 | 说明 | 常见技术 |
|---|---|---|
| 黑盒测试 | 不关注内部实现 | 等价类划分、边界值分析、决策表 |
| 白盒测试 | 基于代码结构 | 语句覆盖、分支覆盖、路径覆盖 |
| 灰盒测试 | 结合黑盒白盒 | 部分可见内部结构 |
按测试目的分类
| 类型 | 目的 | 关注点 |
|---|---|---|
| 功能测试 | 验证功能正确性 | 业务需求满足度 |
| 性能测试 | 验证性能指标 | 响应时间、吞吐量 |
| 安全测试 | 发现安全漏洞 | 认证、授权、注入 |
| 兼容性测试 | 验证跨平台兼容 | 浏览器、操作系统 |
| 回归测试 | 防止引入新问题 | 已有功能正常 |
测试金字塔
/\
/ \ E2E 测试(10%)- 最少、最慢、最接近用户
/____\
/ \ 集成测试(20%)- 中等数量、中等速度
/________\
/ \ 单元测试(70%)- 最多、最快、最易维护
/____________\
原则:底层测试多而快,顶层测试少而慢。
测试命名规范
测试文件
test_<module>.py # Python
<Module>Test.java # Java
<module>.test.js # JavaScript
<module>_test.go # Go
测试方法
test_<method>_<scenario>_<expected_result>
# 示例
test_login_with_valid_credentials_returns_success()
test_login_with_invalid_password_returns_error()
test_divide_by_zero_throws_exception()
AAA 模式
def test_example():
# Arrange(准备)
calculator = Calculator()
a, b = 2, 3
# Act(执行)
result = calculator.add(a, b)
# Assert(断言)
assert result == 5
测试替身速查
| 类型 | 用途 | 特点 |
|---|---|---|
| Dummy | 填充参数 | 不被使用 |
| Fake | 简化实现 | 可工作但不适用生产 |
| Stub | 预设返回值 | 不响应外部调用 |
| Spy | 记录调用信息 | 可验证调用 |
| Mock | 验证行为 | 预设期望和验证 |
# Python Mock 示例
from unittest.mock import Mock, patch
# 创建 Mock
mock = Mock()
mock.method.return_value = "result"
# 使用 patch
@patch('module.Class')
def test(mock_class):
mock_class.return_value.method.return_value = "mocked"
常用断言
Python (pytest)
# 基本断言
assert value == expected
assert value != unexpected
assert value is True
assert value is False
assert value is None
assert value is not None
# 集合断言
assert item in collection
assert item not in collection
# 异常断言
with pytest.raises(ValueError):
raise ValueError("error")
# 近似断言
assert abs(value - expected) < 0.001
JavaScript (Jest)
// 基本断言
expect(value).toBe(expected);
expect(value).toEqual(expected);
expect(value).toBeTruthy();
expect(value).toBeFalsy();
expect(value).toBeNull();
expect(value).toBeUndefined();
// 数字断言
expect(value).toBeGreaterThan(10);
expect(value).toBeLessThan(20);
// 集合断言
expect(array).toContain(item);
expect(array).toHaveLength(3);
// 异常断言
expect(() => fn()).toThrow(Error);
// Mock 断言
expect(mockFn).toHaveBeenCalled();
expect(mockFn).toHaveBeenCalledWith(arg1, arg2);
Java (JUnit 5)
// 基本断言
assertEquals(expected, actual);
assertNotEquals(unexpected, actual);
assertTrue(condition);
assertFalse(condition);
assertNull(value);
assertNotNull(value);
// 数组断言
assertArrayEquals(expectedArray, actualArray);
// 异常断言
assertThrows(IllegalArgumentException.class, () -> {
method();
});
// 超时断言
assertTimeout(Duration.ofSeconds(1), () -> {
slowMethod();
});
Go
// 基本断言
if result != expected {
t.Errorf("got %v, want %v", result, expected)
}
// 使用 testify
import "github.com/stretchr/testify/assert"
assert.Equal(t, expected, result)
assert.True(t, condition)
assert.Nil(t, err)
assert.NotNil(t, value)
assert.Error(t, err)
assert.NoError(t, err)
性能测试指标
| 指标 | 说明 | 建议阈值 |
|---|---|---|
| 响应时间 | 请求到响应的时间 | P95 < 500ms |
| 吞吐量 | 每秒处理请求数 | 根据业务需求 |
| 错误率 | 失败请求比例 | < 1% |
| 并发用户 | 同时在线用户数 | 根据业务需求 |
| 资源利用率 | CPU/内存使用率 | < 80% |
OWASP Top 10 (2021)
| 排名 | 风险 |
|---|---|
| A01 | 访问控制失效 |
| A02 | 加密失败 |
| A03 | 注入攻击 |
| A04 | 不安全设计 |
| A05 | 安全配置错误 |
| A06 | 易受攻击组件 |
| A07 | 认证失效 |
| A08 | 软件和数据完整性失败 |
| A09 | 日志监控不足 |
| A10 | 服务端请求伪造 SSRF |
常见安全测试检查点
输入验证
- SQL 注入测试
- XSS(跨站脚本)测试
- 命令注入测试
- 路径遍历测试
- 输入长度限制测试
认证授权
- 弱密码测试
- 暴力破解防护测试
- 会话管理测试
- 权限越权测试
- 密码重置安全测试
数据保护
- 敏感数据加密测试
- HTTPS 强制测试
- Cookie 安全属性测试
- 敏感信息泄露测试
配置安全
- 默认账户测试
- 敏感端点访问测试
- 安全头设置测试
- 错误信息泄露测试
覆盖率目标参考
| 代码类型 | 建议覆盖率 |
|---|---|
| 核心业务逻辑 | 90%+ |
| 通用工具类 | 80%+ |
| API 层 | 70-80% |
| UI 组件 | 60-70% |
| 配置代码 | 可忽略 |
测试工具速查
单元测试
| 语言 | 工具 | 运行命令 |
|---|---|---|
| Python | pytest | pytest tests/ |
| Java | JUnit 5 | mvn test |
| JavaScript | Jest | npm test |
| Go | go test | go test ./... |
E2E 测试
| 工具 | 特点 | 官网 |
|---|---|---|
| Playwright | 多浏览器、多语言 | playwright.dev |
| Cypress | 简单易用、调试好 | cypress.io |
| Selenium | 成熟稳定、生态大 | selenium.dev |
性能测试
| 工具 | 特点 | 官网 |
|---|---|---|
| JMeter | 功能全面、GUI | jmeter.apache.org |
| K6 | 云原生、JS脚本 | k6.io |
| Locust | Python脚本 | locust.io |
安全测试
| 工具 | 类型 | 官网 |
|---|---|---|
| OWASP ZAP | DAST | zapproxy.org |
| Burp Suite | DAST | portswigger.net |
| SonarQube | SAST | sonarqube.org |
| Snyk | SCA | snyk.io |
测试最佳实践清单
测试设计
- 测试命名清晰描述行为
- 每个测试只验证一个概念
- 测试之间相互独立
- 覆盖边界条件和错误情况
- 使用参数化减少重复
测试执行
- 测试执行速度快
- 测试结果可重复
- 失败时易于定位问题
- 使用 Mock 隔离外部依赖
测试维护
- 测试代码与生产代码同等重要
- 定期重构测试代码
- 及时修复失败的测试
- 保持测试覆盖率监控
CI/CD 集成
- 测试在 CI 中自动运行
- 设置覆盖率阈值
- 失败时阻止合并
- 生成测试报告
常用测试命令
Python
# 运行所有测试
pytest
# 运行特定文件
pytest tests/test_module.py
# 运行特定测试
pytest tests/test_module.py::test_function
# 显示打印输出
pytest -s
# 详细输出
pytest -v
# 只运行失败的测试
pytest --lf
# 覆盖率
pytest --cov=myapp --cov-report=html
JavaScript
# 运行所有测试
npm test
# 监视模式
npm test -- --watch
# 运行特定文件
npm test -- path/to/test.js
# 更新快照
npm test -- -u
# 覆盖率
npm test -- --coverage
Java
# Maven
mvn test
mvn test -Dtest=TestClass
mvn test -Dtest=TestClass#testMethod
# Gradle
./gradlew test
./gradlew test --tests TestClass
Go
# 运行所有测试
go test ./...
# 详细输出
go test -v ./...
# 运行特定测试
go test -run TestFunction ./...
# 覆盖率
go test -cover ./...
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out
测试报告模板
# 测试报告
## 测试概要
- 测试日期:2024-01-01
- 测试环境:staging
- 测试范围:用户模块
## 测试结果
- 总用例数:100
- 通过:95
- 失败:3
- 跳过:2
- 通过率:95%
## 失败用例
| 用例ID | 用例名称 | 失败原因 |
|--------|----------|----------|
| TC001 | 登录测试 | 超时 |
| TC002 | 注册测试 | 断言失败 |
## 覆盖率
- 语句覆盖:85%
- 分支覆盖:78%
- 函数覆盖:92%
## 建议
1. 修复失败用例
2. 提高分支覆盖率
3. 添加边界条件测试