软件质量工程 07

软件测试计划 (Software Test Plan)

软件测试计划 是一个描述软件测试的目标、范围、方法和重点的文档,用于验证软件产品的可接受性。它面向特定受众,涵盖所有功能性和非功能性需求,并确保需求可追溯性 (Traceability)。

测试计划的常见问题

  • 不完整的测试计划可能导致软件部分功能或状态未被测试。
  • 未记录或报告错误,影响问题追踪。
  • 错误修复不及时,由于错误原因描述不清。
  • 疏忽或时间压力导致错误未完全修复。
  • 定义: 软件测试是一个由专业测试团队执行的正式过程,涉及运行软件单元、集成单元或整个软件包,按照批准的测试用例和程序进行测试。

测试计划的结构

测试计划应涵盖以下内容:

  1. 测试范围 (Scope of the Tests):
    • 测试的软件包(名称、版本、修订号)
    • 测试依据的文档(名称、版本)
  2. 测试环境 (Testing Environment):
    • 测试地点
    • 所需的硬件和固件配置
    • 参与组织
    • 人力需求
    • 测试团队的准备和培训
  3. 测试细节 (Test Details):
    • 测试标识(Test Identification)
    • 测试目标(Test Objective)
    • 与设计和需求文档的交叉引用
    • 测试类别 (Test Class)
    • 测试级别 (单元测试、集成测试、系统测试)
    • 测试用例要求(Test Case Requirements)
    • 特殊要求(如响应时间测量、安全要求)
    • 记录的数据(Data to be recorded)
  4. 测试计划 (Test Schedule):
    • 准备时间
    • 测试时间
    • 错误修复时间(Error Correction)
    • 回归测试时间 (Regression Tests)

测试计划的实施

  • 组织范围: 测试计划应适用于组织内所有软件开发项目。
  • 启动时间: 与需求文档和项目计划同步开始。
  • 测试过程:
    1. 确定测试方法 (Test Methodology)
    2. 规划测试
    3. 设计测试 (实施)

软件测试描述 (Software Test Description, STD)

软件测试描述 是记录测试用例和测试程序的文档,描述如何执行测试。

STD 结构

  1. 测试范围:
    • 测试的软件包(名称、版本、修订号)
    • 测试依据的文档
  2. 测试环境:
    • 测试标识
    • 操作系统和硬件配置的详细描述
    • 软件加载说明
  3. 测试过程:
    • 输入指令(详细描述每个输入步骤)
    • 测试期间记录的数据
  4. 测试用例:
    • 测试用例标识
    • 输入数据和系统设置
    • 预期中间结果(如适用,intermediate results)
    • 预期结果(数值 numerical、消息 message、设备激活 activation of equipment 等)
  5. 程序失败/停止时的措施(Actions to be taken in case of program failure/cessation)
  6. 根据测试结果总结应用的程序(Procedures to be applied according to the test results summary)

软件测试报告 (Software Test Report, STR)

软件测试报告 记录单个测试和回归测试的结果。

STR 结构

  1. 测试标识、地点、计划和参与者:
    • 测试的软件标识(名称、版本、修订号)
    • 测试依据的文档
    • 测试地点
    • 每次测试的开始和结束时间
    • 测试团队成员
    • 其他参与者
    • 测试投入的小时数
  2. 测试环境:
    • 硬件和固件配置
    • 测试前的准备和培训
  3. 测试结果:
    • 测试标识
    • 测试用例结果(逐个测试用例)
      • 测试用例标识
      • 测试者标识
      • 结果:通过/失败
      • 如果失败:详细描述结果/问题
  4. 错误统计:
    • 错误总数、分布和类型总结
    • 与之前结果的比较(回归测试)
  5. 特殊事件和测试者建议:
    • 测试期间的特殊事件和软件的意外响应(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)

角色与职责

  1. 管理团队 (Management Team):
    • 角色:项目负责人 (Project Leader)、软件质量保证负责人 (Software Quality Assurance Leader)
  2. 测试团队 (Testing Team):
    • 角色:测试计划者和控制器 (Test Planner and Controllers)、测试者 (Testers)
  3. 业务团队 (Business Team):
    • 角色:业务分析师和代表 (Business Analyst and Representatives)
  4. 测试支持团队 (Testing Support Team):
    • 角色:支持程序员 (Support Programmers)
  5. 外部支持团队 (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)

方法

  1. 自顶向下测试 (Top-down Testing):
    • 从高层模块开始,逐步测试低层模块。
    • Top-down Testing Stages
  2. 自底向上测试 (Bottom-up Testing):
    • 从底层模块开始,逐步集成到高层。
    • Bottom-up Testing Stages
  3. 混合测试: 结合自顶向下和自底向上。

测试计划主题

问题与测试类型

  • 功能测试 (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
  • 设计指南:
    • 避免硬编码依赖,使用依赖注入。
    • 模块化设计,降低耦合。
    • 提供可模拟的接口 (Mockable Interfaces)。

可能考法与示例考题

可能考法

  1. 定义与结构:
    • 描述软件测试计划、测试描述和测试报告的定义和结构。
    • 列出测试计划的关键内容及其作用。
  2. 测试类型:
    • 比较功能测试、集成测试、验收测试和性能测试的区别。
    • 解释自顶向下和自底向上集成测试的优缺点。
  3. 测试用例编写:
    • 根据模板为给定场景编写测试用例。
  4. 可测试性:
    • 分析代码的可测试性问题并提出改进方法。
  5. 团队组织:
    • 设计质量保证团队的角色和职责分配。

示例考题

  1. 问题: 简述软件测试计划 (Software Test Plan) 的定义,并列出其四个主要部分的结构。

    • 参考答案:
      • 中文: 软件测试计划是一个描述软件测试目标、范围、方法和重点的文档,用于验证软件产品的可接受性。其主要部分包括:
        1. 测试范围: 定义测试的软件包和依据文档。
        2. 测试环境: 描述测试地点、硬件配置、参与组织等。
        3. 测试细节: 包括测试标识、目标、类别、级别等。
        4. 测试计划: 包括准备、测试、错误修复和回归测试的时间估算。
      • 英文: 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:
        1. Scope of the Tests: Defines the software package and reference documents.
        2. Testing Environment: Describes test sites, hardware configurations, participating organizations, etc.
        3. Test Details: Includes test identification, objectives, class, level, etc.
        4. Test Schedule: Includes time estimates for preparation, testing, error correction, and regression tests.
  2. 问题: 为以下代码编写一个白盒测试用例,基于圈复杂度 (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
    • 参考答案:
      • 中文:
        • 圈复杂度分析: 圈复杂度 $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
          • 步骤:
            1. 创建 calculate 方法的实例。
            2. 输入测试数据 (a, b)。
            3. 调用 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:
            1. Create an instance of the calculate method.
            2. Input test data (a, b).
            3. 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
0%