TDD 与 BDD - 详细指南
TDD 与 BDD
结论
作者:黛博拉·埃梅尼
TDD 与 BDD
软件测试在软件开发周期中至关重要,它确保开发的产品可靠且高质量。应用程序的质量对于提供令人满意的用户体验至关重要。在编写应用程序测试时,关注所使用的开发方法也很重要。
测试驱动开发 (TDD) 和行为驱动开发 (BDD) 是开发人员用来编写质量测试的两种流行且有效的方法,这些测试使开发人员、用户、产品经理和利益相关者受益。
在本文中,您将了解测试驱动开发 (TDD) 和行为驱动开发 (BDD),包括它们包含的内容、原理、优点、缺点、工作原理以及主要区别。
我们将介绍的步骤:
测试驱动开发概述
TDD 是一个基于敏捷开发方法的重复、连续的过程,涉及在开发应用程序的每个阶段创建测试用例以定义预期的代码行为。
在 TDD 中,开发人员首先创建一个单元测试用例,以展示代码的预期行为,然后再实际实现它。如果测试失败,他们会迭代编写新代码,直到成功通过。之后,他们会继续重构应用程序的源代码,这涉及在不引入新功能或损害应用程序原有功能的情况下重构代码。
为了有效地实施 TDD,该过程需要分解应用程序的功能并针对每个方面生成测试。这种方法可确保对组件进行系统而全面的测试和监控。
在应用程序中构建身份验证系统就是 TDD 的一个很好的例子。
根据上图,开发人员首先识别和定义身份验证系统的要求,包括身份验证方法(如 OAuth、用户名、密码等)。然后,开发人员编写测试来定义身份验证系统组件之一的预期行为(例如登录功能)。
之后,开发人员会运行测试,由于功能尚未实现,测试最初会失败。之后,开发人员会编写必要的代码以通过测试。
之后,测试会重新运行,并重构代码。重构后,再重新运行测试以确保测试继续通过。
验证登录功能后,将创建其他功能(例如帐户验证、注册和密码重置)的附加测试用例,并重复 TDD 过程。
TDD 的优缺点
TDD 有很多好处。不过,它也有一些缺点,如下所示:
-
更快的开发周期:TDD 支持持续交付软件更新,其架构使开发人员能够快速识别和修复代码中的错误。快速集成更新有助于加快开发速度并交付高质量的软件。
-
提高代码质量:在编写代码之前编写测试用例,使开发人员能够更好地理解所需的功能,并编写结构良好的代码。此外,使用 TDD 方法可以更轻松地重构代码片段,减少错误,而不会影响现有功能。
-
耗时:TDD 在实现功能之前需要花费更多的时间和精力来编写测试用例,这可能会减慢资源有限且期限紧迫的项目的开发进程。
-
僵化:在实现代码之前编写测试的 TDD 方法是僵化的,因为它不适合需求不断变化的复杂项目。
TDD 实现的分步演示示例
让我们通过构建一个简单的应用程序来了解 TDD 在实践中是如何运作的。
先决条件
要继续本教程,请确保您具备以下条件:
- Nodejs安装
- JavaScript基础知识
- 终端
- 代码编辑器(Visual Studio Code 编辑器)
首先,通过在终端中运行以下命令在系统上创建项目目录:
mkdir tdd-project
接下来,运行以下命令进入目录:
cd tdd-project
在代码编辑器中打开项目,然后在项目目录中运行以下命令来初始化新的 Node.js 项目:
npm init
接下来,您需要安装一个测试框架,用于在项目中执行单元测试。根据用于创建应用程序的编程语言,有几种测试框架可供选择。例如,JUnit通常用于 Java 应用程序,Pytest用于 Python 应用程序,NUnit用于 .NET 应用程序,Jest用于 JavaScript 应用程序等等。由于我们使用的是 JavaScript,因此在本教程中我们将使用 Jest 框架。
要将 Jest 测试框架作为开发依赖项安装到项目目录中,只需运行以下命令:
npm install jest --save-dev
安装成功后,jest 将被安装并添加到你的package.json文件中。将你的测试脚本替换为以下内容:
"test": "jest"
您的package.json文件应如下所示:
使用 TDD 方法构建应用程序需要首先编写测试。在tdd 项目的根目录中创建一个名为sub.test.js的文件,用于包含测试。Jest 使用.test.js命名规范,因此请确保您的文件具有该扩展名。
现在,您可以开始编写测试了。假设您要创建一个小型计算器应用,并且要实现的第一个功能是减法函数。Jest 框架有其独特的测试编写方式,具体定义在文档中。
Jest 使用一个test()
函数,它接受一个描述作为第一个参数,您可以在其中描述您想要测试的行为,以及一个回调,您可以在其中使用一个expect()
函数和一个toBe()
匹配器,它可以让您定义代码的预期行为并检查行为是否符合这些预期。
让我们看看test()
实际应用中的函数。在你的sub.test.js 文件中,添加以下测试,它将定义使用你稍后将在代码中定义的 subtract 方法进行减法的行为:
const Calc = require('./calc');
test('subtraction', () => {
const calc = new Calc();
const sub = calc.subtract(20, 10);
expect(sub).toBe(10);
});
接下来,我们将尝试运行测试,由于您尚未编写功能,因此测试可能会失败。然而,这是至关重要的一步,因为测试失败表明测试正在测试行为。
使用以下命令运行测试:
npm test
运行该命令后,您的终端中将显示以下内容:
接下来,让我们编写实现该功能的代码。在项目的根目录中,创建一个名为calc.js的文件,并添加以下代码:
class Calc {
subtract(x, y) {
return x - y;
}
}
module.exports = Calc;
这里,我们创建一个名为 的类,并为测试用例中定义的值Calc
添加一个方法。然后,我们导出该类,以便在模块外部使用。subtract()
现在,您可以使用以下命令重新运行测试:
npm test
如果您正确实现了减法方法,那么测试应该会通过,如下所示:
您已成功为应用程序中的一项功能编写了第一个测试用例。如果测试用例失败,您可以更正并重构代码。然后,您可以为其他功能(例如求和、求平均值、除法等)编写并运行更多测试用例。
接下来,我们将了解行为驱动开发(BDD)
面向专业 Web 开发人员的开源企业应用平台
refine.new使您能够在浏览器中创建基于 React 的无头 UI 企业应用程序,您可以立即预览、调整和下载。
🚀 通过可视化地组合您首选的 ✨ React 平台、✨ UI 框架、✨ 后端连接器和 ✨ 身份验证提供程序的选项,您可以在几秒钟内为您的项目创建量身定制的架构。感觉就像触手可及数千个项目模板,让您从中选择最符合您需求的那个!
行为驱动开发概述
BDD 是另一种基于敏捷的开发流程,用于创建测试,以根据用户的期望描述应用程序的预期行为。与 TDD 相比,BDD 更注重满足业务需求和用户需求,而不仅仅是通过测试。
借助 BDD,开发人员可以根据用户与产品的交互,创建专注于满足用户需求的产品。BDD 方法鼓励产品经理(通常负责定义产品需求)、开发人员和测试人员之间的协作。
在 BDD 中,开发人员可以使用Cucumber、SpecFlow、Behave等测试工具,使用一种称为Gherkin的语言来规划和编写测试,这有助于使用人类可读语法中的关键字以结构化格式定义产品的业务需求或规范。
请参阅下面的 BDD 工作流程图:
如上所示,BDD 工作流程由几个阶段组成,下面分别进行说明:
-
识别用户功能:这是 BDD 的第一阶段,在此阶段识别需要开发的功能。这些功能将根据用户的期望进行描述。
-
创建功能文件:此阶段需要创建文件以结构化格式记录应用程序的功能,以便开发人员、产品团队和测试人员可以使用 Gherkin 语言理解。
-
编写场景:在此阶段,测试用例在功能文件中定义,并附上描述该功能预期行为的示例。Gherkin 语言具有定义测试用例的语法。
-
团队评估:在此阶段,开发人员、产品团队和测试人员协作评估前几个阶段创建和定义的功能文件和场景。进行评估是为了确保定义的场景符合业务需求和用户期望。
-
编写步骤实现:此时,Gherkin 语言描述的场景的实现开始。开发人员使用依赖于 BDD 框架的特定编程语言(例如 JavaScript 或 Java)编写代码,将场景中的每个步骤映射到必须执行的相应操作。
-
测试自动化:在实现场景中定义的步骤之后,通过模拟用户与应用程序的交互并确定行为是否符合场景中的规范来编写自动化测试来运行场景。
-
测试验证和报告:在此阶段,运行自动化测试,并记录场景的结果(无论失败还是通过)以供开发人员、产品团队和测试人员审查。
-
持续开发:当开发人员从用户或产品团队收到新的需求时,会对功能文件和场景进行更新,并重复整个周期(即之前的 BDD 阶段),直到实现预期的行为。
BDD 的优缺点
BDD 有其优点和缺点。以下列举一些:
-
构建以客户为中心的产品:使用 BDD 方法开发的产品以客户为中心,因为大多数功能的实现都基于客户反馈。因此,BDD 确保产品符合并满足客户的期望。
-
促进协作和透明度:BDD 方法为开发人员、产品团队和测试人员提供了透明度,以便他们协作并理解所定义的功能,确保它们符合业务需求和用户期望。
-
基于反馈:BDD 依赖于用户和开发人员之间清晰有效的沟通。当沟通渠道中断时,功能开发过程会因用户和开发人员之间缺乏协作而受到阻碍。
BDD 实现的分步演示示例
在此示例中,您将学习如何使用 BDD 方法创建测试。
先决条件
要学习本教程,您需要以下内容:
- 代码编辑器(Visual Studio Code 编辑器)
- 终端
- JavaScript基础知识
- Nodejs安装
让我们首先为项目创建一个目录。打开终端并运行以下命令来创建一个名为bdd-project的文件夹:
mkdir bdd-project
在代码编辑器中打开项目。在根项目的目录中,运行以下命令来初始化新的 Node.js 项目:
npm init -y
Cucumber.js与 Node.js 兼容,并以 npm 模块的形式提供,因此您可以将其用作测试框架。在项目目录中,运行以下命令将 Cucumber.js 安装为开发依赖项:
npm install --save-dev @cucumber/cucumber
接下来,创建一个名为features的文件夹,其中包含一个名为auth.feature的文件(.feature扩展名是必需的),该文件将包含您将要定义的场景。
在auth.feature文件中,您将使用Gherkin 语法提供的关键字从用户的角度描述登录应用程序的行为,如下所示:
Feature: Login feature
As a customer
I would like to log into the application
So that I can gain access to my account
Scenario: Successful login
Given I am at the login page
When I type in my correct username and password
And click the "Login" button
Then I should be redirected to my home page
上面用到的关键词解释如下:
- 特征:特征关键字是短文中描述该特征的第一个关键字。
- 场景:此场景关键字定义描述登录功能特定行为的具体测试用例。
- Given:Given关键字指定场景的初始状态。
- 时间:When关键字描述用户在登录功能上执行的操作。
- And:And关键字为场景添加了更多步骤,描述用户执行的操作
- 然后:Then关键字指定了此场景中执行完前面步骤后的预期结果
到目前为止,您已经在功能文件中定义了步骤,接下来需要将这些步骤映射到相应的代码实现。为此,请创建一个名为step_implement.js的文件并粘贴以下代码:
const { Given, When, Then, And } = require('@cucumber/cucumber');
Given('I am at the login page', function () {
// write code that navigates to the login page
});
When('I type in my correct username and password', function () {
// write code to enter valid user credentials
});
When('click the {string} button', function (buttonText) {
// write code to click on the specified button
});
Then('I should be redirected to my home page', function () {
// write code to verify the redirection to the home page
});
您正在从安装的 Cucumber npm 模块中导入Given
、、和关键字When
,并编写代码来实现场景中定义的所有步骤和操作。Then
And
要执行功能文件中定义的步骤,请创建另一个名为 configure.js 的文件,其中将包含 Cucumber.js 配置:
module.exports = {
default: '--format-options \'{"snippetInterface": "synchronous"}\'',
};
您在此处通过将 Cucumber 生成的输出格式指定为同步来配置 Cucumber.js 测试运行器的默认选项。
在您的package.json文件中,将您的测试脚本设置为:
"test": "cucumber-js"
然后,使用以下命令运行测试:
npx cucumber-js
运行该命令后,结果将显示在终端中,如下所示:
一旦您添加适当的代码来实现场景,测试就会通过。
TDD 与 BDD 的比较
到目前为止,您已经了解了 TDD 和 BDD 的含义、它们包含的内容以及它们的工作原理。让我们看看它们在各个方面有何不同,如下表所示:
结论
终于,您读完了本文,了解了测试驱动开发 (TDD) 和行为驱动开发 (BDD),包括它们的含义、原理、优缺点以及区别。您还在一个演示应用程序中体验了 TDD 和 BDD 的实际应用。
鏂囩珷鏉ユ簮锛�https://dev.to/refine/tdd-vs-bdd-a-detailed-guide-1f07