」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Cucumber.js:行為驅動測試的完整指南

Cucumber.js:行為驅動測試的完整指南

發佈於2024-11-09
瀏覽:435

Cucumber.js: A Complete Guide to Behavior-Driven Testing
Cucumber.js 是一种流行的工具,用于运行以简单语言编写的自动化测试,允许开发人员和非开发人员协作进行测试。它在行为驱动开发 (BDD) 中特别有用,因为利益相关者之间的清晰沟通是关键。通过使用人类可读的语言,Cucumber js 使产品所有者、测试人员和开发人员能够确保软件按预期运行,同时提高应用程序的整体质量。
了解行为驱动开发 (BDD)
Cucumber.js 围绕行为驱动开发 (BDD) 原则构建,这是一种鼓励技术和非技术利益相关者之间沟通的软件开发方法。在 BDD 中,测试是用共享语言编写的,以便所有团队成员都可以为理解需求做出贡献。通过关注行为而不是技术细节,BDD 确保每个人(从业务分析师到开发人员)对软件应如何运行都有相同的理解。
BDD 通常遵循“给定、何时、然后”的格式来描述场景:
• 给定:定义初始上下文(例如,“假设用户已登录”)。
• 何时:描述操作或事件(例如,“当用户单击提交按钮时”)。
• 然后:指定预期结果(例如,“然后提交表单”)。
Cucumber.js 使用此格式来启用自然语言测试。
安装和设置 Cucumber.js
要开始使用 Cucumber.js,您需要安装必要的 npm 包并配置您的项目。 Cucumber.js 作为 Node.js 包提供,您可以通过 npm 轻松安装它。以下是在 Node.js 项目中设置它的方法:

  1. 安装 Cucumber.js: 巴什 复制代码 npm install --save-dev @cucumber/cucumber
  2. 配置您的项目:为您的功能文件和步骤定义创建文件夹结构。例如: 珀尔 复制代码 ├── 特点 │ ├── 步骤_定义 │ └── my-feature.feature 安装后,您就可以编写第一个功能文件并创建相应的步骤定义。 编写您的第一个功能文件 Cucumber.js 的一个关键元素是功能文件,其中测试是使用 Gherkin 语法以简单的英语编写的。功能文件描述了从用户角度编写的场景中应用程序的行为。以下是测试登录功能的简单功能文件示例: 功能:登录功能

场景:使用有效凭据成功登录
假设用户位于登录页面
当用户输入有效凭据时
然后用户被重定向到仪表板
每个场景代表软件必须支持的特定用例。目标是以技术和非技术团队成员都能轻松理解的方式编写这些测试。
Cucumber.js 中的步骤定义
步骤定义是将特征文件中的自然语言步骤映射到可执行 JavaScript 代码的地方。每个步骤(例如,“假设用户位于登录页面”)对应于步骤定义文件中的一个方法。
以下是如何定义登录功能步骤的示例:
const { 给定、何时、然后 } = require('@cucumber/cucumber');

Given('用户位于登录页面', function () {
// 导航到登录页面的代码
});

When('用户输入有效凭据', function () {
// 输入有效用户名和密码的代码
});

Then('用户被重定向到仪表板', function () {
// 验证仪表板重定向的代码
});
Give、When 和 Then 函数来自 Cucumber.js 包,每个函数都将场景中的一个步骤映射到实现必要逻辑的 JavaScript 函数。
运行 Cucumber.js 测试
一旦您的功能文件和步骤定义准备就绪,您就可以运行 Cucumber.js 来执行测试并查看结果。在您的终端中,只需运行以下命令:
npx 黄瓜-js
Cucumber.js 将解析您的功能文件,将步骤与其相应的步骤定义进行匹配,并执行测试。输出将显示哪些场景通过或失败,让您清楚地了解应用程序的行为。
将 Cucumber.js 与其他测试工具集成
Cucumber.js 可以与 Mocha 或 Chai 等流行的测试框架集成,以增强测试套件的功能和结构。通过将 Cucumber.js 与这些框架相结合,您可以使用强大的断言库和测试功能来提高测试的深度。
例如,您可以在步骤定义中使用 Chai 进行断言:
const { 期望 } = require('chai');

Then('用户被重定向到仪表板', function () {
Expect(currentPage).to.equal('仪表板');
});
集成其他工具使您能够将 Cucumber.js 扩展到基本 BDD 场景之外,使其成为整体测试策略的灵活部分。
编写可维护的 BDD 测试的最佳实践
为了确保您的 Cucumber.js 测试保持可维护性和可扩展性,在编写测试时遵循某些最佳实践非常重要:

  1. 编写小型、独立的场景:每个场景都应该测试特定的行为,并且不应依赖于其他场景。这使您的测试更易于理解和维护。
  2. 避免过于复杂的步骤定义:步骤定义应保持重点和简洁。如果某个步骤需要太多逻辑,请考虑将其分解为更小的步骤或重构代码。
  3. 跨场景重用步骤:在可能的情况下,跨不同场景重用步骤定义,以减少重复并提高一致性。
  4. 保持功能文件易于理解:以开发人员和非技术团队成员都可以轻松理解的方式编写功能文件。清晰且描述性的场景可以改善整个团队的沟通。 结论 Cucumber.js 通过提供简单且易于理解的测试编写格式,提供了一种强大的方法来弥合开发人员、测试人员和利益相关者之间的差距。通过在 BDD 框架中使用 Cucumber.js,您可以确保您的测试与业务需求紧密结合,并且所有团队成员都对应用程序的行为方式有共同的理解。无论您是测试小型组件还是复杂的工作流程,Cucumber.js 都可以帮助您编写更清晰、更有效的测试,从而有助于您的软件项目的成功。
版本聲明 本文轉載於:https://dev.to/keploy/cucumberjs-a-complete-guide-to-behavior-driven-testing-12h1?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何從具有不同數組長度的字典創建 Pandas DataFrame?
    如何從具有不同數組長度的字典創建 Pandas DataFrame?
    從條目長度不均勻的字典建立 DataFrame在 Python 中,可以從每個條目保存一個 Numpy 陣列的字典建立 DataFrame。然而,當條目之間的數組長度不同時,就會出現挑戰。預設情況下,Pandas 需要統一長度的數組,從而導致類似“ValueError: arrays must al...
    程式設計 發佈於2024-11-09
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-09
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-09
  • 為什麼在 Java 中使用相同的種子時會得到相同的隨機數?
    為什麼在 Java 中使用相同的種子時會得到相同的隨機數?
    具有固定種子的Java隨機數:為什麼輸出相同? 在您的程式碼中,您定義了一種使用以下命令產生隨機數的方法指定的種子。但是,您會注意到,當您提供相同的種子時,所有 100 個產生的數字都是相同的。 此行為是預期的,因為在 Random 建構函式中使用相同的種子會產生可預測的數字序列。種子是初始化隨機數...
    程式設計 發佈於2024-11-09
  • jQuery Chaining 如何簡化開發並提高程式碼效率?
    jQuery Chaining 如何簡化開發並提高程式碼效率?
    理解 jQuery 中的物件和方法連結在 jQuery 中,連結允許在單一語句中串聯多個 jQuery 方法。這使開發人員能夠簡化程式碼並輕鬆執行複雜的操作。 連結的基本原理涉及每個 jQuery 方法的回傳值。當呼叫 jQuery 方法時,它通常會傳回一個表示所選元素的 jQuery 物件。這允許...
    程式設計 發佈於2024-11-09
  • Hono.js 基準測試:Node.js、Deno 和 Bun — 哪個最快?
    Hono.js 基準測試:Node.js、Deno 和 Bun — 哪個最快?
    Deno 2.0 剛剛發布,並聲稱比 Bun 和 Node.js 更快,同樣,Bun 也聲稱更快。這引起了我的興趣,所以我決定測試它們的性能,看看它們在現實場景中的比較。 為了公平比較,我需要選擇一個與所有三種 JavaScript 執行時間環境(Node.js、Deno 和 Bun)相容的框架。...
    程式設計 發佈於2024-11-09
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-09
  • 何時應該使用 Tkinter 的 Entry Get 函數來有效檢索輸入?
    何時應該使用 Tkinter 的 Entry Get 函數來有效檢索輸入?
    Tkinter Entry 的Get 函數:深入探討其功能和用法在Tkinter 中,Entry 小部件通常用於收集用戶輸入以進一步收集使用者輸入然而,與Entry 關聯的get() 函數通常無法產生所需的結果,這可能會讓開發人員感到困惑。本文深入探討 get() 的概念,全面了解其執行與應用。 理...
    程式設計 發佈於2024-11-09
  • 如何克服 PHP 中日期表示的 2038 限制?
    如何克服 PHP 中日期表示的 2038 限制?
    PHP 中的日期表示:克服2038 年限制雖然PHP 的原生日期函數在2038 年有一個截止日期,但還有其他方法處理超出此限制的日期。其中一種方法是僅儲存年、月和日,而忽略小時、分鐘、秒和毫秒部分。 透過丟棄這些附加時間部分,可以顯著擴展可表示日期的範圍。這是因為這些元件中的每一個都佔用了 PHP ...
    程式設計 發佈於2024-11-09
  • 如何在 Go (Gorilla) 中向特定客戶端發送有針對性的 Websocket 更新?
    如何在 Go (Gorilla) 中向特定客戶端發送有針對性的 Websocket 更新?
    在Go (Gorilla) 中向特定客戶端發送Websocket 更新儘管是Go 新手,但您尋求有關實現Websocket 通信的指導您的預輸入項目。您已嘗試利用 Gorilla 的 GitHub 儲存庫中的範例,但在理解如何識別特定客戶端並針對 websocket 更新進行定位方面遇到了挑戰。 要...
    程式設計 發佈於2024-11-09
  • 使用swoole作為基於ESP6的腳本可程式控制器的雲端物聯網閘道框架
    使用swoole作為基於ESP6的腳本可程式控制器的雲端物聯網閘道框架
    腳本可程式控制器的本機功能基本上已完成,開始實現遠端相關功能。 遠端系統整體架構如下: 使用ESP8266的SDK實作tcp伺服器和tcp客戶端。 在tcp伺服器的基礎上編寫http協議解析程式碼,設計簡單的http伺服器,處理與瀏覽器的資料交互,包括內建網頁的下載,並使用ajax技術獲取狀態並...
    程式設計 發佈於2024-11-09
  • 為什麼在 Java 的 Random 類別中設定種子會傳回相同的數字?
    為什麼在 Java 的 Random 類別中設定種子會傳回相同的數字?
    Java隨機數產生:為什麼設定種子會回傳相同的數字? 儘管將Random類別的種子設定為特定值,但隨機數產生器始終會傳回相同的數字。讓我們探討一下可能導致此問題的原因。 了解 Random 類別和種子初始化Java Random 類別旨在產生偽隨機數。預設情況下,它使用其內部時鐘作為種子值,使其產生...
    程式設計 發佈於2024-11-09
  • 如何克服使用反射設定結構體欄位值時 SetCan() 總是傳回 False 的問題?
    如何克服使用反射設定結構體欄位值時 SetCan() 總是傳回 False 的問題?
    使用結構體的 SetString 探索反射反射提供了動態操作 Go 結構的強大工具。在此範例中,我們在嘗試使用反射來設定結構體欄位的值時遇到一個常見問題:CanSet() 始終傳回 false。這種障礙阻止了字段修改,使我們陷入困境。 識別陷阱提供的程式碼片段突顯了兩個基本錯誤:傳遞值而非指標: ...
    程式設計 發佈於2024-11-09
  • 為什麼 MySQL 中帶有子查詢的「IN」查詢很慢,如何提升效能?
    為什麼 MySQL 中帶有子查詢的「IN」查詢很慢,如何提升效能?
    MySQL 中帶有子查詢的緩慢「IN」查詢當使用子查詢時,使用「IN」運算子的MySQL查詢可能會表現出顯著的效能下降檢索「IN」子句的值很複雜。在這種情況下,用明確值取代子查詢結果會顯著縮短執行時間。 要了解此行為的原因,需要注意的是,每次評估「IN」查詢時,MySQL 都會執行子查詢。在提供的範...
    程式設計 發佈於2024-11-09
  • 如何使用WinAPI取得螢幕解析度?
    如何使用WinAPI取得螢幕解析度?
    使用 WinAPI 取得螢幕解析度在 WinAPI 中,存在多個函數來決定目前螢幕解析度。適當的選擇取決於具體要求。 檢索顯示尺寸檢索顯示尺寸檢索顯示尺寸 主監視器:使用GetSystemMetrics(SM_CXSCREEN) 和GetSystemMetrics( SM_CYCYSEN) 取得主顯...
    程式設計 發佈於2024-11-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3