软件质量工程 07
软件测试计划 (Software Test Plan)
软件测试计划 是一个描述软件测试的目标、范围、方法和重点的文档,用于验证软件产品的可接受性。它面向特定受众,涵盖所有功能性和非功能性需求,并确保需求可追溯性 (Traceability)。
测试计划的常见问题
- 不完整的测试计划可能导致软件部分功能或状态未被测试。
- 未记录或报告错误,影响问题追踪。
- 错误修复不及时,由于错误原因描述不清。
- 疏忽或时间压力导致错误未完全修复。
- 定义: 软件测试是一个由专业测试团队执行的正式过程,涉及运行软件单元、集成单元或整个软件包,按照批准的测试用例和程序进行测试。
测试计划的结构
测试计划应涵盖以下内容:
- 测试范围 (Scope of the Tests):
- 测试的软件包(名称、版本、修订号)
- 测试依据的文档(名称、版本)
- 测试环境 (Testing Environment):
- 测试地点
- 所需的硬件和固件配置
- 参与组织
- 人力需求
- 测试团队的准备和培训
- 测试细节 (Test Details):
- 测试标识(Test Identification)
- 测试目标(Test Objective)
- 与设计和需求文档的交叉引用
- 测试类别 (Test Class)
- 测试级别 (单元测试、集成测试、系统测试)
- 测试用例要求(Test Case Requirements)
- 特殊要求(如响应时间测量、安全要求)
- 记录的数据(Data to be recorded)
- 测试计划 (Test Schedule):
- 准备时间
- 测试时间
- 错误修复时间(Error Correction)
- 回归测试时间 (Regression Tests)
测试计划的实施
- 组织范围: 测试计划应适用于组织内所有软件开发项目。
- 启动时间: 与需求文档和项目计划同步开始。
- 测试过程:
- 确定测试方法 (Test Methodology)
- 规划测试
- 设计测试 (实施)
软件测试描述 (Software Test Description, STD)
软件测试描述 是记录测试用例和测试程序的文档,描述如何执行测试。
STD 结构
- 测试范围:
- 测试的软件包(名称、版本、修订号)
- 测试依据的文档
- 测试环境:
- 测试标识
- 操作系统和硬件配置的详细描述
- 软件加载说明
- 测试过程:
- 输入指令(详细描述每个输入步骤)
- 测试期间记录的数据
- 测试用例:
- 测试用例标识
- 输入数据和系统设置
- 预期中间结果(如适用,intermediate results)
- 预期结果(数值 numerical、消息 message、设备激活 activation of equipment 等)
- 程序失败/停止时的措施(Actions to be taken in case of program failure/cessation)
- 根据测试结果总结应用的程序(Procedures to be applied according to the test results summary)
软件测试报告 (Software Test Report, STR)
软件测试报告 记录单个测试和回归测试的结果。
STR 结构
- 测试标识、地点、计划和参与者:
- 测试的软件标识(名称、版本、修订号)
- 测试依据的文档
- 测试地点
- 每次测试的开始和结束时间
- 测试团队成员
- 其他参与者
- 测试投入的小时数
- 测试环境:
- 硬件和固件配置
- 测试前的准备和培训
- 测试结果:
- 测试标识
- 测试用例结果(逐个测试用例)
- 测试用例标识
- 测试者标识
- 结果:通过/失败
- 如果失败:详细描述结果/问题
- 错误统计:
- 错误总数、分布和类型总结
- 与之前结果的比较(回归测试)
- 特殊事件和测试者建议:
- 测试期间的特殊事件和软件的意外响应(Special events and unpredicted responses of the software during testing)
- 测试中遇到的问题(Problems encountered during testing)
- 测试环境(包括准备)的改进建议(Proposals for changes in the test environment, including test preparations)
- 测试程序和测试用例文件的修改建议(Proposals for changes or corrections in test procedures and test case files)
测试计划的关键内容
序号 | 关键内容 | 序号 | 关键内容(续) |
---|---|---|---|
I | 测试计划标识 (Test Plan Identifier) | XI | 测试交付物 (Test Deliverables) |
II | 参考文献 (References) | XII | 剩余测试任务 (Remaining Test Tasks) |
III | 介绍/背景 (Introduction/Background) | XIII | 环境需求 (Environmental Needs) |
IV | 测试项 (Test Items) | XIV | 人员和培训需求 (Staffing and Training Needs) |
V | 软件风险问题 (Software Risk Issues) | XV | 角色 (Roles) |
VI | 测试功能 (Features to be Tested) | XVI | 职责 (Responsibilities) |
VII | 不测试的功能 (Features not to be Tested) | XVII | 日程安排 (Schedule) |
VIII | 方法 (Approach) | XVIII | 计划风险和应急措施 (Planning Risks and Contingencies) |
IX | 项目通过/失败标准 (Item Pass/Fail Criteria) | XIX | 批准 (Approvals) |
X | 暂停标准和恢复要求 (Suspension Criteria and Resumption Requirements) | XX | 术语表 (Glossary) |
支持标准
- IEEE 829:软件和系统测试文档(Software and System Test Documentation)
- IEEE 1008: 软件单元测试标准 (Standard for Software Unit Testing)
- IEEE 1012-2016: 系统、软件和硬件验证与验证标准 (Standard for System, Software, and Hardware Verification and Validation)
角色与职责
- 管理团队 (Management Team):
- 角色:项目负责人 (Project Leader)、软件质量保证负责人 (Software Quality Assurance Leader)
- 测试团队 (Testing Team):
- 角色:测试计划者和控制器 (Test Planner and Controllers)、测试者 (Testers)
- 业务团队 (Business Team):
- 角色:业务分析师和代表 (Business Analyst and Representatives)
- 测试支持团队 (Testing Support Team):
- 角色:支持程序员 (Support Programmers)
- 外部支持团队 (External Support Team):
- 角色:技术支持 (Technical Support)
集成测试 (Integration Testing)
集成测试 将两个或多个组件组合成更大结构进行测试,分为手动和自动化测试。
特点
- 测试来源于规格说明书或架构描述。
- 静态代码分析 (Static Code Analysis) 可减少缺陷。
- 工具:模糊测试 (Fuzz Test)、负面测试 (Negative Testing)、测试覆盖分析器 (Test Coverage Analyser)。
- 成本:占项目成本的 20%以上。
- 注意:避免口头协议,确保正式文档。(Be careful of verbal agreements between managers and team leaders)
方法
- 自顶向下测试 (Top-down Testing):
- 自底向上测试 (Bottom-up Testing):
- 混合测试: 结合自顶向下和自底向上。
测试计划主题
问题与测试类型
- 功能测试 (Functional Testing): 验证软件是否满足功能需求。
- 集成测试 (Integration Testing): 测试组件间的交互。
- 验收测试 (Acceptance Testing): 确认软件是否满足用户需求。
- 性能测试 (Performance Testing): 评估软件在特定条件下的性能。
团队组织案例
- 情景: 管理一个开发博客平台的 20 人开发团队(第三版,成熟产品)。
- 角色分配:
- 项目负责人: 监督项目进度,协调资源。
- 质量保证负责人: 制定测试计划,监督测试执行。
- 测试计划者: 设计测试用例和测试程序。
- 测试者: 执行测试,记录结果。
- 业务分析师: 确保测试覆盖业务需求。
- 支持程序员: 开发测试工具或修复错误。
- 任务分配:
- 质量保证任务可分配给专门的质量保证团队,也可融入开发团队。
- 假设:质量保证团队独立以提高客观性,但与开发团队紧密协作。
测试计划笔记
- 内容: 测试计划、测试类型、角色与职责、测试用例编写、集成测试、接口测试 (Interface Testing)、面向对象测试 (Object-Oriented Testing)、基于场景测试 (Scenario-Based Testing)。
- 测试类型列表:
- 功能测试
- 集成测试
- 用户验收测试
- 性能测试
- 其他:压力测试 (Stress Testing)、安全测试 (Security Testing)等。
测试用例编写
测试用例模板:
- 标题 (Title): 测试用例名称
- 测试类型 (Type of Test): 单元测试、集成测试、黑盒测试、白盒测试、路径测试、场景测试等
- 目的 (Purpose): 测试的简短描述
- 前置条件 (Prerequisite): 测试执行前的要求
- 输入数据/进入标准 (Input Data/Entry Criteria): 变量和值列表
- 步骤 (Steps): 执行测试的步骤
- 输出 (Output): 预期结果
- 退出标准 (Exit Criteria): 通过/失败的判定标准
- 建议 (Recommendations): 开放性建议
- 备注 (Note): 其他信息
提高程序可测试性 (Increasing Testability)
- 案例: 测试 HTML 文档打印功能。
- 问题代码:
class Document { String html; Document(String url) { HtmlClient client = new HtmlClient(); html = client.get(url); } } class Printer { void print(Document html) { System.out.println("Testing print method of Printer class"); } }
- 问题:
Document
类直接依赖HtmlClient
,难以模拟网络行为,降低可测试性。
- 问题:
- 改进代码:
class Document { String html; Document(String url, HtmlClient client) { this.html = client.get(url); } } class Printer { void print(Document doc) { System.out.println("Printing document content: " + doc.html); } } class HtmlClientStub extends HtmlClient { @Override public String get(String url) { return "<html>Test HTML Content</html>"; } } class PrinterTest { public void testPrint() { HtmlClientStub clientStub = new HtmlClientStub(); Document doc = new Document("http://example.com", clientStub); Printer printer = new Printer(); printer.print(doc); } }
- 改进点: 使用依赖注入 (Dependency Injection, DI) 注入
HtmlClient
,便于测试时替换为HtmlClientStub
。
- 改进点: 使用依赖注入 (Dependency Injection, DI) 注入
- 设计指南:
- 避免硬编码依赖,使用依赖注入。
- 模块化设计,降低耦合。
- 提供可模拟的接口 (Mockable Interfaces)。
可能考法与示例考题
可能考法
- 定义与结构:
- 描述软件测试计划、测试描述和测试报告的定义和结构。
- 列出测试计划的关键内容及其作用。
- 测试类型:
- 比较功能测试、集成测试、验收测试和性能测试的区别。
- 解释自顶向下和自底向上集成测试的优缺点。
- 测试用例编写:
- 根据模板为给定场景编写测试用例。
- 可测试性:
- 分析代码的可测试性问题并提出改进方法。
- 团队组织:
- 设计质量保证团队的角色和职责分配。
示例考题
-
问题: 简述软件测试计划 (Software Test Plan) 的定义,并列出其四个主要部分的结构。
- 参考答案:
- 中文: 软件测试计划是一个描述软件测试目标、范围、方法和重点的文档,用于验证软件产品的可接受性。其主要部分包括:
- 测试范围: 定义测试的软件包和依据文档。
- 测试环境: 描述测试地点、硬件配置、参与组织等。
- 测试细节: 包括测试标识、目标、类别、级别等。
- 测试计划: 包括准备、测试、错误修复和回归测试的时间估算。
- 英文: A Software Test Plan is a document describing the objectives, scope, approach, and focus of software testing to validate the acceptability of a software product. Its main sections include:
- Scope of the Tests: Defines the software package and reference documents.
- Testing Environment: Describes test sites, hardware configurations, participating organizations, etc.
- Test Details: Includes test identification, objectives, class, level, etc.
- Test Schedule: Includes time estimates for preparation, testing, error correction, and regression tests.
- 中文: 软件测试计划是一个描述软件测试目标、范围、方法和重点的文档,用于验证软件产品的可接受性。其主要部分包括:
- 参考答案:
-
问题: 为以下代码编写一个白盒测试用例,基于圈复杂度 (Cyclomatic Complexity) 分析。
public int calculate(int a, int b) { if (a > 0) { if (b > 0) { return a + b; } else { return a - b; } } else { return 0; } }
flowchart TD Start([Start]) A{a > 0?} B{b > 0?} C1[return a + b] C2[return a - b] D[return 0] End([End]) Start --> A A -- Yes --> B A -- No --> D B -- Yes --> C1 B -- No --> C2 C1 --> End C2 --> End D --> End
flowchart TD Start([Start]) A{a > 0?} B{b > 0?} C1[return a + b] C2[return a - b] D[return 0] End([End]) Start --> A A -- Yes --> B A -- No --> D B -- Yes --> C1 B -- No --> C2 C1 --> End C2 --> End D --> End- 参考答案:
- 中文:
- 圈复杂度分析: 圈复杂度 $V(G) = E - N + 2$,其中 $E$ 为边数,$N$ 为节点数。此函数有 3 条路径(a > 0 && b > 0, a > 0 && b <= 0, a <= 0),圈复杂度为 3。
- 测试用例:
- 标题: 测试 calculate 方法
- 测试类型: 白盒测试 (White Box Testing)
- 目的: 验证 calculate 方法在不同输入条件下的正确性
- 前置条件: 无
- 输入数据:
- 用例 1: a = 5, b = 3
- 用例 2: a = 5, b = -2
- 用例 3: a = -1, b = 4
- 步骤:
- 创建 calculate 方法的实例。
- 输入测试数据 (a, b)。
- 调用 calculate 方法并记录输出。
- 输出:
- 用例 1: 8 (5 + 3)
- 用例 2: 7 (5 - (-2))
- 用例 3: 0
- 退出标准: 所有用例输出与预期一致则通过。
- 建议: 增加边界值测试(如 a = 0, b = 0)。
- 备注: 无
- 英文:
- Cyclomatic Complexity Analysis: Cyclomatic complexity $V(G) = E - N + 2$, where $E$ is the number of edges and $N$ is the number of nodes. This function has 3 paths (a > 0 && b > 0, a > 0 && b <= 0, a <= 0), so complexity is 3.
- Test Case:
- Title: Test calculate method
- Type of Test: White Box Testing
- Purpose: Verify the correctness of the calculate method under different input conditions
- Prerequisite: None
- Input Data:
- Case 1: a = 5, b = 3
- Case 2: a = 5, b = -2
- Case 3: a = -1, b = 4
- Steps:
- Create an instance of the calculate method.
- Input test data (a, b).
- Call the calculate method and record the output.
- Output:
- Case 1: 8 (5 + 3)
- Case 2: 7 (5 - (-2))
- Case 3: 0
- Exit Criteria: Pass if all outputs match expectations.
- Recommendations: Add boundary value tests (e.g., a = 0, b = 0).
- Note: None
- 中文:
- 参考答案: