Skip to content

敏捷测试 - 方法

在现代敏捷测试 (Agile Testing) 中,方法论深深植根于“尽早测试 (Test Early)”和“持续测试 (Continuous Testing)”原则。重点在于通过协作实践来预防缺陷 (defect),即在代码开发之前或同时定义测试用例 (test case),更广泛地说,是测试场景 (test scenario) 和验收标准 (acceptance criteria)。这确保了从一开始就将质量内建到产品中,强调通过在开发生命周期的适当阶段和层级应用正确的测试类型来预防缺陷、快速检测和有效移除。

本章探讨了关键的敏捷测试方法:

  • 测试驱动开发 (Test-Driven Development, TDD)
  • 验收测试驱动开发 (Acceptance Test-Driven Development, ATDD)
  • 行为驱动开发 (Behavior-Driven Development, BDD)

Test-Driven Development (TDD) 是一种软件开发实践 (software development practice),开发人员在编写功能代码 (functional code) 之前编写自动化测试用例 (automated test case)。开发过程遵循一个简短、重复的循环:编写一个失败的测试,编写最少量的代码使测试通过,然后重构代码 (refactor the code)。这种方法确保了代码具备可测试性设计 (testable by design),并在细粒度级别上满足规定的需求 (specified requirement)。

TDD 循环,通常被称为“红-绿-重构 (Red-Green-Refactor)”,包括以下步骤:

  • 第一步:添加测试 - 为新的功能 (functionality) 或改进 (improvement) 编写一个简洁的自动化测试用例。由于功能尚不存在,这个测试最初会失败(红色)。
  • 第二步:运行所有测试 - 验证新测试失败,并且所有现有测试仍然通过。
  • 第三步:编写代码 - 编写使新测试通过的最简单的代码(绿色)。
  • 第四步:再次运行所有测试 - 确保所有测试,包括新测试,现在都能通过。
  • 第五步:重构代码 - 在不改变其外部行为的情况下,改进代码结构和设计(例如,消除重复、提高清晰度)。确保测试在重构后继续通过。
  • 第六步:重复 - 为下一个功能块重复此循环。

TDD 主要应用于单元测试 (unit test) 和集成测试 (integration test) 层面。它建立了一个强大的测试安全网,支持自信地进行重构以及代码库 (codebase) 的演进。流行的 TDD 框架包括 JUnit (Java)、NUnit (.NET)、PyTest (Python) 和 Jest (JavaScript)。有效的 TDD 依赖于持续沟通与协作,尤其是在开发人员之间。

TDD 的益处包括更好的代码设计 (code design)、降低缺陷率 (defect rate) 以及以测试形式存在的活文档 (executable documentation)。欲进一步学习,请探索关于“xUnit”框架和 Martin Fowler 关于 TDD 的文章等资源。

Acceptance Test-Driven Development (ATDD) 侧重于在开发开始之前从用户视角定义验收标准。它涉及业务干系人 (business stakeholder)(如产品负责人 - Product Owner)、开发人员和测试人员之间的协作,以创建关于软件应如何表现的具体示例 (concrete example)。然后将这些示例转化为自动化验收测试 (automated acceptance test)。

ATDD 流程通常包括:

  • 第一步:讨论 - 协作定义用户故事 (user story) 的验收标准,通常使用示例。这通常涉及“三剑客 (Three Amigos)”(产品负责人/业务分析师 - Product Owner/BA、开发人员、测试人员)。
  • 第二步:提炼 - 将这些示例形式化为可测试的验收测试。这些测试最初会失败。
  • 第三步:开发 - 编写代码来实现功能,目标是使验收测试通过。
  • 第四步:演示 - 演示实现的功能,展示它已通过验收测试并满足用户的需求。将这些测试自动化,以进行持续验证 (continuous validation)。

ATDD 确保开发与业务需求和用户期望一致。它有助于尽早明确需求,并提供跨团队的共享理解。诸如 Cucumber、SpecFlow 和 FitNesse 等工具支持 ATDD,允许以业务可读的格式编写验收测试。回归测试套件 (regression testing suite) 通常由这些自动化验收测试构建而成。

Behavior-Driven Development (BDD) 是 TDD 和 ATDD 的演进。它通过使用自然、领域特定的语言(通常是 Gherkin 语法 - Given-When-Then)描述软件行为,强调协作和共享理解。这使得测试场景 (test scenario) 对于非技术团队成员和干系人来说易于理解。

BDD 的关键方面:

  • 共享语言 (Shared Language):使用结构化的自然语言(例如,Gherkin)描述场景,促进业务、开发和测试之间的清晰沟通。
  • 由外而内的方法 (Outside-In Approach):专注于系统从用户视角看来的行为,驱动开发从特性 (feature) 到单元级别实现 (unit-level implementation)。
  • 活文档 (Living Documentation):BDD 场景充当可执行的规范 (executable specification),确保文档与系统的实际行为保持同步。

使用 Gherkin 语法的 BDD 场景示例:

Feature: User Login
Scenario: Successful login with valid credentials
Given the user is on the login page
When the user enters valid username and password
And clicks the login button
Then the user should be redirected to the dashboard

流行的 BDD 框架包括 Cucumber (Ruby, Java, JS, etc.)、SpecFlow (.NET) 和 Behave (Python)。BDD 有助于弥合沟通差距,确保特性交付真正的业务价值,并通过自动化场景支持持续测试 (continuous testing)。