测试基础与方法

00:00
7 min Beginner 2026/6/14

软件测试原则、测试分类、黑盒与白盒测试方法、测试用例设计、测试计划与测试报告编写。

1. 软件测试概述

1.1 定义

软件测试是通过手动或自动化手段来运行或检验软件系统的过程,目的是发现软件缺陷、验证软件是否满足需求,并评估软件质量。

1.2 测试原则

原则说明
测试显示缺陷存在测试只能证明缺陷存在,不能证明没有缺陷
穷尽测试不可能无法测试所有输入组合,需用风险驱动优先级
尽早测试缺陷越早发现,修复成本越低
缺陷集群性少数模块往往包含大部分缺陷(二八定律)
杀虫剂悖论反复使用相同测试用例将无法发现新缺陷
测试依赖于上下文不同系统需要不同的测试策略
无错误谬误没有发现缺陷 ≠ 系统满足用户需求

1.3 缺陷成本曲线

修复成本

  │                          ╱
  │                        ╱
  │                      ╱
  │                    ╱
  │                  ╱
  │               ╱
  │           ╱
  │      ╱
  │  ╱
  └──────────────────────────────────→ 时间
  需求  设计  编码  单元测试  集成测试  系统测试  发布后

2. 测试分类

2.1 按开发阶段分类

类型测试对象执行者关注点
单元测试函数/方法/类开发人员代码逻辑正确性
集成测试模块间接口开发/测试模块交互与数据传递
系统测试完整系统测试人员功能、性能、安全
验收测试交付系统用户/客户是否满足业务需求

2.2 按测试方法分类

类型特点是否需要代码
黑盒测试关注输入输出,不关注内部不需要
白盒测试关注内部逻辑与结构需要
灰盒测试部分了解内部结构部分需要

2.3 按执行方式分类

类型说明
手动测试人工执行测试用例
自动化测试使用工具/脚本执行测试

2.4 按测试目标分类

类型说明
功能测试验证功能是否正确
性能测试验证响应时间、吞吐量
安全测试验证系统安全性
兼容性测试验证多环境适配
易用性测试验证用户体验
可靠性测试验证长时间运行稳定性

3. 黑盒测试方法

3.1 等价类划分

将输入域划分为有效等价类无效等价类,从每个等价类中选取代表值进行测试。

示例:用户年龄输入(18-60岁)

等价类范围测试数据
有效等价类18 ≤ age ≤ 6025
无效等价类-1age < 1810
无效等价类-2age > 6070
无效等价类-3非数字输入”abc”
无效等价类-4空输入""
# 等价类划分测试用例示例
import pytest

def validate_age(age_input):
    """验证年龄输入"""
    if not age_input:
        raise ValueError("年龄不能为空")
    try:
        age = int(age_input)
    except ValueError:
        raise ValueError("年龄必须为数字")

    if age < 18:
        raise ValueError("年龄不能小于18岁")
    if age > 60:
        raise ValueError("年龄不能大于60岁")
    return age

# 有效等价类测试
def test_valid_age():
    assert validate_age("25") == 25
    assert validate_age("18") == 18   # 边界值
    assert validate_age("60") == 60   # 边界值

# 无效等价类测试
def test_invalid_age_too_young():
    with pytest.raises(ValueError, match="不能小于18岁"):
        validate_age("10")

def test_invalid_age_too_old():
    with pytest.raises(ValueError, match="不能大于60岁"):
        validate_age("70")

def test_invalid_age_not_number():
    with pytest.raises(ValueError, match="必须为数字"):
        validate_age("abc")

def test_invalid_age_empty():
    with pytest.raises(ValueError, match="不能为空"):
        validate_age("")

3.2 边界值分析

边界值是缺陷最容易出现的区域,需对等价类边界进行重点测试。

示例:密码长度(6-20位)

边界值数据预期结果
小于下界5位失败
下界6位成功
下界+17位成功
上界-119位成功
上界20位成功
大于上界21位失败
def validate_password(password: str) -> bool:
    """验证密码长度 6-20 位"""
    return 6 <= len(password) <= 20

class TestPasswordBoundary:
    def test_below_min(self):
        assert validate_password("12345") is False    # 5位

    def test_at_min(self):
        assert validate_password("123456") is True    # 6位

    def test_above_min(self):
        assert validate_password("1234567") is True   # 7位

    def test_below_max(self):
        assert validate_password("1" * 19) is True    # 19位

    def test_at_max(self):
        assert validate_password("1" * 20) is True    # 20位

    def test_above_max(self):
        assert validate_password("1" * 21) is False   # 21位

3.3 因果图法

适用于多条件组合的测试场景,通过分析输入条件(因)与输出结果(果)的逻辑关系设计测试用例。

基本符号:

符号含义
恒等原因为真,结果为真
原因为真,结果为假
任一原因为真,结果为真
所有原因为真,结果为真

示例:购物折扣规则

  • 条件1:会员用户(C1)
  • 条件2:订单金额 > 200(C2)
  • 条件3:使用优惠券(C3)
  • 结果1:享受8折(E1):C1 AND C2
  • 结果2:减20元(E2):C3
用例C1C2C3E1E2
1YYNYN
2YNYNY
3NYYNY
4YYYYY
5NNNNN

3.4 错误推测法

基于经验和直觉推测可能存在的错误:

经验法则示例
特殊字符输入<script>, 'OR 1=1--
空值和 null空字符串、null、undefined
极端数据超大文件、超长字符串
并发操作同时提交、重复点击
网络异常超时、断网、弱网
时区与日期跨时区、闰年、2月29日

4. 白盒测试方法

4.1 语句覆盖

确保每条语句至少执行一次:

def calculate(a: int, b: int) -> int:
    if a > 0:           # 语句1
        result = a + b  # 语句2
    else:
        result = a - b  # 语句3
    return result       # 语句4

# 语句覆盖:a=1, b=2 → 执行语句1,2,4(语句3未覆盖)
# 需要补充:a=-1, b=2 → 执行语句1,3,4

4.2 分支覆盖(判定覆盖)

确保每个判定的真假分支至少执行一次:

# 分支覆盖测试用例
def test_calculate():
    # True 分支
    assert calculate(1, 2) == 3    # a > 0 → True
    # False 分支
    assert calculate(-1, 2) == -3  # a > 0 → False

4.3 路径覆盖

确保所有可能路径至少执行一次:

def grade(score: int) -> str:
    if score >= 90:          # 判定1
        return "优秀"
    elif score >= 60:        # 判定2
        return "及格"
    else:
        return "不及格"

# 路径1: score=95  → 判定1=True
# 路径2: score=75  → 判定1=False, 判定2=True
# 路径3: score=45  → 判定1=False, 判定2=False

4.4 覆盖强度对比

覆盖类型强度说明
语句覆盖最弱每条语句至少执行一次
分支覆盖中等每个分支至少执行一次
条件覆盖较强每个条件的真假各取一次
路径覆盖最强所有路径至少执行一次

5. 测试用例设计

5.1 测试用例模板

字段说明
用例编号TC-模块-序号,如 TC-LOGIN-001
用例标题简明描述测试目的
前置条件执行前需满足的条件
测试步骤详细操作步骤
测试数据输入数据
预期结果期望的输出或行为
优先级高/中/低

5.2 测试用例示例

字段内容
编号TC-LOGIN-001
标题正确用户名和密码登录
前置条件用户已注册,账号:admin / 密码:123456
步骤1. 打开登录页面 2. 输入用户名 3. 输入密码 4. 点击登录
数据用户名:admin,密码:123456
预期登录成功,跳转首页
优先级
字段内容
编号TC-LOGIN-002
标题错误密码登录
前置条件用户已注册
步骤1. 打开登录页面 2. 输入用户名 3. 输入错误密码 4. 击登录
数据用户名:admin,密码:wrong
预期提示用户名或密码错误”
优先级

6. 测试计划编写

6.1 测试计划结构

1. 引言
   1.1 编写目的
   1.2 项目背景
   1.3 术语定义
2. 测试范围
   2.1 测试对象
   2.2 测试功能
   2.3 不测试功能
3. 测试策略
   3.1 测试类型与方法
   3.2 测试工具
   3.3 测试环境
4. 测试进度
   4.1 里程碑
   4.2 时间安排
5. 风险与应对
6. 测试交付物

6.2 测试进度示例

阶段时间交付
需求分析第1周测试计划
用例设计第2-3周测试用例
用例评审第3周末评审记录
测试第4-6周缺陷报告
回归测试第7周回归测试报告
验收测试第8周验收报告

7. 测试报告编写

7.1 测试报告结构

1. 概述
   1.1 测试目的
   1.2 测试范围
   1.3 测试环境
2. 测试结果
   2.1 用例执行统计
   2.2 缺陷统计
   2.3 测试覆盖率
3. 缺陷分析
   3.1 缺陷分布
   3.2 严重程度分布
   3.3 未解决缺陷
4. 测试结论与建议

7.2 缺陷严重程度

等级说明示例
致命系统崩溃、数据丢失支付失败、系统宕机
严重主要功能不可用无法登录、搜索结果
一般次要功能异常排序错误、样式偏移
轻微错误、建议性修改拼写错误对齐不齐

7.3 测试结果统计模板

指标百分比
总用例数500-
通过42084%
失败5010%
阻塞153%
执行153%
缺陷总数65-
修复5584.6%
修复1015.4%

知识检测

学习进度

-- 已学文档
--% 知识覆盖率

学习推荐

专注模式