引言
软件测试不仅是“找Bug”,更是质量保障的系统工程。本文梳理5个核心知识点,从理论到实践,帮助初学者快速搭建知识框架。

模块一:测试用例设计——等价类与边界值
为什么需要用例设计?
穷尽测试不可能。用例设计的目标是用最少用例覆盖最多有效场景。
核心方法:等价类划分+边界值分析
- ►等价类:将输入数据划分为有效和无效两类,每类取一个代表值。
- ►例:年龄输入框(1-100岁)
- ►有效等价类:1-100
- ►无效等价类:<1、>100、非数字字符
- ►边界值:取边界两侧的值(上点、离点、内点)。
- ►例:1-100的边界值包括:0、1、2、99、100、101
实战示例(测试Python的年龄验证函数):
python
# 被测函数
def validate_age(age):
if not isinstance(age, int):
return "输入必须为整数"
if age < 1 or age > 100:
return "年龄超出范围"
return "有效"
# 测试用例(边界值)
test_cases = [0, 1, 2, 99, 100, 101, "abc", None]
for case in test_cases:
result = validate_age(case)
print(f"输入: {case} -> 结果: {result}")
输出结果:
text
输入: 0 -> 结果: 年龄超出范围
输入: 1 -> 结果: 有效
输入: 2 -> 结果: 有效
输入: 99 -> 结果: 有效
输入: 100 -> 结果: 有效
输入: 101 -> 结果: 年龄超出范围
输入: abc -> 结果: 输入必须为整数
输入: None -> 结果: 输入必须为整数
模块二:缺陷生命周期与管理
缺陷从发现到关闭的完整流程:
1. 发现:测试人员提交Bug报告
2. 确认:开发人员复现并确认
3. 分配:项目经理指派给对应开发
4. 修复:开发修改代码
5. 验证:测试人员回归测试
6. 关闭:验证通过后关闭
常见状态流转:
text
新建 → 已确认 → 已分配 → 已修复 → 已验证 → 已关闭
↑ ↓ ↓ ↓
└──── 重新打开 ←── 修复失败 ←─┘
关键字段: 标题、优先级(P1-P4)、严重程度(致命/严重/一般/轻微)、环境、步骤、预期/实际结果。
模块三:自动化测试框架——Pytest入门
为什么选择Pytest?
- ►简洁的断言语法
- ►自动发现测试用例
- ►丰富的插件生态
核心概念:
- ►测试函数以
test_开头
- ►使用
assert进行断言
- ►夹具(Fixture)管理测试数据
实战:测试购物车模块
python
# 被测模块:cart.py
class ShoppingCart:
def __init__(self):
self.items = {}
def add_item(self, name, price, quantity=1):
if price <= 0 or quantity <= 0:
raise ValueError("价格和数量必须为正数")
if name in self.items:
self.items[name]['quantity'] += quantity
else:
self.items[name] = {'price': price, 'quantity': quantity}
def get_total(self):
return sum(item['price'] * item['quantity'] for item in self.items.values())
# 测试文件:test_cart.py
import pytest
from cart import ShoppingCart
@pytest.fixture
def empty_cart():
return ShoppingCart()
def test_add_item(empty_cart):
empty_cart.add_item("苹果", 5.0, 2)
assert empty_cart.items["苹果"]["quantity"] == 2
def test_total_calculation(empty_cart):
empty_cart.add_item("香蕉", 3.0, 3)
empty_cart.add_item("橙子", 4.0, 2)
assert empty_cart.get_total() == 17.0 # 3*3 + 4*2 = 17
def test_invalid_price(empty_cart):
with pytest.raises(ValueError):
empty_cart.add_item("葡萄", -1, 1)
运行命令: pytest test_cart.py -v
模块四:接口测试——Postman与Python
接口测试的核心:验证请求与响应的正确性。
Postman基础操作:
1. 设置请求方法(GET/POST/PUT/DELETE)
2. 添加Headers(Content-Type、Authorization)
3. 编写Body(JSON格式)
4. 编写Tests脚本(断言状态码、响应体)
Python实现(使用requests库):
python
import requests
import json
# 测试一个模拟的图书管理系统API
base_url = "http://api.example.com/books"
# 新增图书
def test_add_book():
new_book = {
"title": "软件测试实战",
"author": "张三",
"isbn": "978-7-XXXX-XXXX-X"
}
response = requests.post(base_url, json=new_book)
assert response.status_code == 201
book_id = response.json()["id"]
return book_id
# 查询图书
def test_get_book(book_id):
response = requests.get(f"{base_url}/{book_id}")
assert response.status_code == 200
assert response.json()["title"] == "软件测试实战"
# 删除图书
def test_delete_book(book_id):
response = requests.delete(f"{base_url}/{book_id}")
assert response.status_code == 204
# 执行测试
book_id = test_add_book()
test_get_book(book_id)
test_delete_book(book_id)
print("接口测试通过!")
模块五:性能测试基础——Locust入门
性能测试的核心指标:
- ►响应时间(RT)
- ►吞吐量(TPS/QPS)
- ►并发用户数
- ►错误率
Locust示例:模拟用户登录场景
python
from locust import HttpUser, task, between
class WebsiteUser(HttpUser):
wait_time = between(1, 5) # 用户操作间隔1-5秒
@task(3) # 权重为3
def view_homepage(self):
self.client.get("/")
@task(1) # 权重为1
def login(self):
self.client.post("/login", json={
"username": "test_user",
"password": "123456"
})
def on_start(self):
"""每个用户启动时执行"""
print("用户开始测试")
运行命令: locust -f locustfile.py --host=http://example.com
分析结果:
- ►当响应时间超过2秒时,用户体验明显下降
- ►错误率超过1%需要排查服务器配置或代码问题
- ►吞吐量瓶颈通常出现在数据库或网络IO
自测清单
完成学习后,尝试回答以下问题:
1. 等价类划分和边界值分析如何结合使用?
2. 缺陷从提交到关闭经历哪些状态?
3. Pytest的fixture有什么作用?
4. 接口测试中如何验证JSON响应?
5. Locust的wait_time参数控制什么?