C# 中的 BDD:当测试用业务语言说话
\n\n想象一下:你是一名 C# 开发者。产品负责人找到你说:“请实现一个功能:订单支付后,用户应收到一封邮件,但仅当金额超过 1000 卢布时。”你点头,开始写代码,实现逻辑并用单元测试覆盖。一周后,你展示成果。产品负责人看着代码,皱起眉头说:“我指的不是这个意思。”
\n\n熟悉吗?这是典型的业务与开发之间的脱节问题。而 C# 中的 BDD——Behaviour-Driven Development(行为驱动开发)——正是为了解决这个问题而生。
\n\n在本文中,我们将探讨什么是 BDD,它与 TDD 有何不同,以及最重要的是,如何通过 SpecFlow 和 xUnit 在 C# 项目中引入 BDD。你将看到真实的代码示例,学会用 Gherkin 编写场景,并将其转化为自动化测试。我们开始吧!
\n\n什么是 BDD,为什么需要它?
\n\nBDD(行为驱动开发)是一种开发方法论,它通过用户行为来描述系统需求。你不再编写枯燥的技术规格说明,而是用自然语言编写业务人员和开发人员都能理解的场景。
\n\nBDD 的核心思想是:“不要只检查代码是否运行。要检查系统的行为是否符合业务预期。”
\n\n与 TDD(测试驱动开发)不同,TDD 要求先编写单元测试再写代码,而 BDD 则聚焦于使用场景。BDD 测试不是测试某个方法或类,而是测试一个完整的用户场景。
\n\nBDD 的三大支柱
\n- \n
- 统一语言——项目中的所有参与者(产品负责人、分析师、测试人员、开发人员)使用同一种语言。通常是 Gherkin。 \n
- 场景——每个功能需求都通过 Given-When-Then(给定-当-那么)来描述。 \n
- 自动化——场景被转化为自动化测试,作为 CI/CD 的一部分运行。 \n
现在,让我们看看它在 C# 代码中是如何实现的。
\n\nC# 中 BDD 的工具
\n\n在 .NET 生态系统中实现 BDD 有两个主要工具:
\n\n- \n
- SpecFlow——C# 中最流行的 BDD 框架。它解析 Gherkin 场景并将其与代码绑定。 \n
- xUnit / NUnit / MSTest——执行 BDD 测试的测试运行器。 \n
我们将使用 SpecFlow + xUnit。安装很简单——通过 NuGet:
\n\ndotnet add package SpecFlow\ndotnet add package SpecFlow.xUnit\ndotnet add package xunit\ndotnet add package xunit.runner.visualstudio\n\n安装后,在项目中创建一个 Features 文件夹——你的 .feature 场景文件将存放在这里。
编写第一个 Gherkin BDD 场景
\n\nGherkin 是一种行为描述语言。它使用以下关键字:Feature、Scenario、Given、When、Then、And、But。
让我们描述一个简单的场景:用户尝试支付订单,如果金额超过 1000 卢布,用户将收到一封邮件。
\n\n在 Features 文件夹中创建文件 Payment.feature:
Feature: Payment Notification\n As a customer\n I want to receive an email after payment\n So that I have a confirmation of my purchase\n\nScenario: Successful payment over 1000 rubles sends notification\n Given a customer with balance 5000 rubles\n When the customer pays an order of 1500 rubles\n Then the customer should receive an email notification\n\nScenario: Payment under 1000 rubles does not send notification\n Given a customer with balance 5000 rubles\n When the customer pays an order of 500 rubles\n Then the customer should not receive any email notification\n\n请注意:这里