1. 等价类划分法(Equivalence Partitioning)
-
应用场景:验证输入参数的有效性和无效性(如注册表单、API参数校验)。
-
自动化实现:
-
参数化测试:使用数据驱动框架(如TestNG、pytest参数化)为每个等价类提供测试数据。
-
断言设计:针对有效等价类验证预期结果,对无效等价类断言异常处理逻辑。
-
-
示例:
python
复制
@pytest.mark.parametrize("username", ["valid_user", "a"*5, "user@#$"]) def test_username_validation(username): response = register(username) if len(username) < 6 or not username.isalnum(): assert response.code == 400 # 无效等价类断言异常 else: assert response.code == 200 # 有效等价类断言成功
2. 边界值分析法(Boundary Value Analysis)
-
应用场景:测试数值范围、字符串长度等边界附近的输入。
-
自动化实现:
-
边界数据生成:使用工具自动生成边界值(如0, 1, max-1, max, max+1)。
-
数据驱动测试:结合等价类划分,覆盖边界及相邻值。
-
-
示例(测试年龄输入框允许18-100岁):
python
复制
ages = [17, 18, 19, 99, 100, 101] @pytest.mark.parametrize("age", ages) def test_age_boundary(age): assert is_valid_age(age) == (18 <= age <= 100)
3. 场景法(Scenario-Based Testing)
-
应用场景:验证端到端业务流程(如用户下单、支付流程)。
-
自动化实现:
-
UI/API流程串联:使用工具(如Selenium、Cypress、Postman)模拟用户操作链。
-
依赖管理:通过测试框架管理前置条件(如登录状态、数据初始化)。
-
-
示例(电商下单流程):
python
复制
def test_order_flow(): login() # 前置条件:登录 add_to_cart() # 添加商品 checkout() # 结算 payment() # 支付 assert order_status() == "completed"
4. 状态迁移法(State Transition Testing)
-
应用场景:验证状态驱动的系统(如订单状态机、工单流转)。
-
自动化实现:
-
状态机建模:使用库(如Python的
transitions
)定义合法状态转换。 -
路径覆盖:编写脚本测试所有合法和非法状态迁移。
-
-
示例(订单状态验证):
python
复制
def test_order_state_transition(): order = Order() order.create() # 初始状态:待付款 order.pay() # 合法转换:待付款 → 已付款 assert order.state == "paid" order.cancel() # 非法操作:已付款状态下不可取消 assert order.state == "paid" # 断言状态未改变
5. 决策表法(Decision Table Testing)
-
应用场景:多条件组合规则(如权限控制、优惠券使用规则)。
-
自动化实现:
-
表格驱动测试:将决策表转换为CSV或Excel文件,读取数据生成用例。
-
组合生成工具:使用工具(如AllPairs)自动生成条件组合。
-
-
示例(登录条件组合):
python
复制
# 决策表:用户名有效、密码有效、验证码正确 → 登录成功/失败 test_cases = [ (True, True, True, 200), (True, True, False, 401), (True, False, True, 401), # ... 其他组合 ] @pytest.mark.parametrize("username_valid, pwd_valid, captcha_valid, expected", test_cases) def test_login_combinations(username_valid, pwd_valid, captcha_valid, expected): # 模拟输入条件并断言结果 assert login(username_valid, pwd_valid, captcha_valid) == expected
6. 因果图法(Cause-Effect Graphing)
-
应用场景:条件间存在依赖关系(如“用户已登录”是“发表评论”的前提)。
-
自动化实现:
-
逻辑依赖验证:通过前置条件设置(如先登录再执行操作)。
-
断言链式操作:验证因果关系的正确性。
-
-
示例:
python
复制
def test_comment_without_login(): # 未登录时尝试评论 response = post_comment() assert response.code == 403 # 断言权限错误 def test_comment_after_login(): login() response = post_comment() assert response.code == 200 # 登录后允许评论
7. 错误推测法(Error Guessing)
-
应用场景:针对历史缺陷或高风险区域设计用例(如SQL注入、并发问题)。
-
自动化实现:
-
异常输入注入:使用模糊测试工具(如AFL、Burp Suite)生成异常数据。
-
安全测试工具:结合OWASP ZAP或SQLMap自动化攻击测试。
-
-
示例(SQL注入测试):
python
复制
sql_injection_payloads = ["' OR 1=1 --", "DROP TABLE users;"] @pytest.mark.parametrize("payload", sql_injection_payloads) def test_sql_injection(payload): response = search_user(payload) assert "error" not in response.text # 断言系统正确处理异常输入
8. 探索性测试(Exploratory Testing)
-
应用场景:快速验证新功能或复杂交互(如游戏操作、动态页面)。
-
自动化实现:
-
录制回放工具:使用工具(如Selenium IDE)录制探索路径后生成脚本。
-
AI辅助测试:结合AI工具(如Testim、Applitools)动态调整测试路径。
-
-
示例:
python
复制
# 半自动化探索:随机点击页面元素并记录结果 def test_explore_page(): driver.open("/home") elements = driver.find_elements(By.TAG_NAME, "a") for element in random.sample(elements, 5): # 随机选择5个链接 element.click() assert driver.current_url != "404" # 断言页面有效
9. 正交实验法(Orthogonal Array Testing)
-
应用场景:多参数组合测试(如浏览器兼容性、配置组合)。
-
自动化实现:
-
正交表生成工具:使用工具(如PICT、正交表生成器)生成组合。
-
并行执行:通过云测试平台(如Sauce Labs)并发执行多环境测试。
-
-
示例(浏览器+操作系统组合):
python
复制
# 使用正交表生成的组合 combinations = [ ("Chrome", "Windows", "1920x1080"), ("Firefox", "macOS", "1440x900"), # ... 其他正交组合 ] @pytest.mark.parametrize("browser, os, resolution", combinations) def test_cross_browser(browser, os, resolution): driver = start_browser(browser, os, resolution) assert driver.title == "Home Page"
组合策略与最佳实践
-
分层覆盖:
-
单元测试:等价类 + 边界值(快速验证函数逻辑)。
-
集成测试:场景法 + 状态迁移(验证模块交互)。
-
系统测试:正交实验法 + 决策表(覆盖复杂组合)。
-
-
工具整合:
-
使用CI/CD管道(如Jenkins、GitHub Actions)自动触发测试。
-
结合测试报告工具(如Allure、ReportPortal)可视化覆盖率。
-
-
维护性优化:
-
使用Page Object模式(UI测试)或API Client封装(接口测试)降低维护成本。
-
定期清理冗余用例,聚焦高风险场景。
-
总结
在自动化测试中,传统测试设计方法通过以下方式落地:
-
数据驱动:参数化、表格驱动覆盖输入组合。
-
流程串联:模拟用户路径验证端到端场景。
-
组合优化:正交法、决策表减少冗余用例。
-
异常覆盖:错误推测法 + 模糊测试捕获边界问题。
最终目标是:以最小成本实现最大覆盖,同时保持脚本稳定、易维护。