国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) web前端 js教程 BDD在JavaScript:開始使用Cucumber和Gherkin

BDD在JavaScript:開始使用Cucumber和Gherkin

Feb 16, 2025 pm 01:09 PM

BDD in JavaScript: Getting Started with Cucumber and Gherkin

BDD in JavaScript: Getting Started with Cucumber and Gherkin

測(cè)試驅(qū)動(dòng)開發(fā) (TDD) 的好處已廣為人知,它能提升產(chǎn)品質(zhì)量和開發(fā)效率。每次編寫代碼測(cè)試時(shí),都能確保代碼的正確性,并能及時(shí)發(fā)現(xiàn)未來(lái)可能出現(xiàn)的代碼錯(cuò)誤。

行為驅(qū)動(dòng)開發(fā) (BDD) 在此基礎(chǔ)上更進(jìn)一步,它測(cè)試的是產(chǎn)品的行為,而非僅僅是代碼,確保產(chǎn)品行為符合預(yù)期。本文將介紹如何使用 Cucumber 框架編寫 BDD 風(fēng)格的自動(dòng)化驗(yàn)收測(cè)試。Cucumber 的優(yōu)勢(shì)在于,測(cè)試用例可以用簡(jiǎn)潔的自然語(yǔ)言編寫,方便項(xiàng)目中非技術(shù)人員理解。閱讀本文后,您可以判斷 Cucumber 是否適合您的團(tuán)隊(duì),并開始編寫自己的驗(yàn)收測(cè)試。準(zhǔn)備好了嗎?讓我們開始吧!

關(guān)鍵要點(diǎn)

  • BDD 在 TDD 的基礎(chǔ)上,測(cè)試的是產(chǎn)品的行為而非代碼,使其更易于被包括非技術(shù)人員在內(nèi)的更廣泛的利益相關(guān)者理解。
  • Cucumber 是一個(gè) BDD 框架,它使用 Gherkin(一種易于理解的語(yǔ)言)來(lái)定義測(cè)試用例,確保所有利益相關(guān)者都能理解并參與測(cè)試過(guò)程。
  • Gherkin 語(yǔ)法將測(cè)試結(jié)構(gòu)化為場(chǎng)景和特性,使用簡(jiǎn)單的 Given、When、Then 步驟來(lái)描述行為,而無(wú)需規(guī)定技術(shù)實(shí)現(xiàn)。
  • Cucumber.js 與 JavaScript 項(xiàng)目集成,運(yùn)行 Gherkin 定義的測(cè)試,并通過(guò)各種插件和配置支持異步操作和外部測(cè)試工具。
  • Cucumber.js 的設(shè)置包括通過(guò) npm 安裝模塊,配置它來(lái)查找特性文件和步驟定義,以及將其可選地集成到構(gòu)建腳本或任務(wù)運(yùn)行器(如 Grunt 或 Gulp)中。
  • 本文提供了一個(gè)基本的 Cucumber 測(cè)試示例,演示了為加法和乘法設(shè)置 Gherkin 場(chǎng)景,使用簡(jiǎn)單的斷言來(lái)驗(yàn)證這些操作的正確性。
  • 本文還概述了 Cucumber.js 的高級(jí)功能,例如對(duì)異步測(cè)試的支持、用于參數(shù)化測(cè)試的場(chǎng)景大綱以及用于設(shè)置前提條件和后置條件的鉤子,以增強(qiáng)測(cè)試能力。

BDD 與 TDD 的區(qū)別

主要體現(xiàn)在測(cè)試的結(jié)構(gòu)和編寫方式上。在 TDD 中,測(cè)試由編寫代碼的開發(fā)人員編寫、維護(hù)和理解。其他人可能根本不需要閱讀測(cè)試,這完全沒(méi)問(wèn)題。但在 BDD 中,測(cè)試需要被比編寫功能的開發(fā)人員多得多的人理解。許多利益相關(guān)者都關(guān)心產(chǎn)品行為是否正確,例如 QA 人員、產(chǎn)品分析師、銷售人員,甚至高層管理人員。這意味著,理想情況下,BDD 測(cè)試需要以任何理解產(chǎn)品的人都能理解的方式編寫。區(qū)別在于:

const assert = require('assert');
const webdriver = require('selenium-webdriver');
const browser = new webdriver.Builder()
  .usingServer()
  .withCapabilities({'browserName': 'chrome' })
  .build();

browser.get('http://en.wikipedia.org/wiki/Wiki');
browser.findElements(webdriver.By.css('[href^="/wiki/"]'))
.then(function(links){
  assert.equal(19, links.length); // 假設(shè)的數(shù)字
  browser.quit();
});

以及:

const assert = require('assert');
const webdriver = require('selenium-webdriver');
const browser = new webdriver.Builder()
  .usingServer()
  .withCapabilities({'browserName': 'chrome' })
  .build();

browser.get('http://en.wikipedia.org/wiki/Wiki');
browser.findElements(webdriver.By.css('[href^="/wiki/"]'))
.then(function(links){
  assert.equal(19, links.length); // 假設(shè)的數(shù)字
  browser.quit();
});

這兩個(gè)測(cè)試執(zhí)行相同的操作,但一個(gè)是可讀的自然語(yǔ)言,另一個(gè)只能被了解 JavaScript 和 Selenium 的人理解。本文將向您展示如何使用 Cucumber.js 框架在 JavaScript 項(xiàng)目中實(shí)現(xiàn) BDD 測(cè)試,從而使您的產(chǎn)品受益于這種級(jí)別的測(cè)試。

什么是 Cucumber/Gherkin?

Cucumber 是一個(gè)用于行為驅(qū)動(dòng)開發(fā)的測(cè)試框架。它允許您以 Gherkin 格式定義測(cè)試,并通過(guò)將其與代碼綁定來(lái)使這些 Gherkin 可執(zhí)行。Gherkin 是一種領(lǐng)域特定語(yǔ)言 (DSL),用于編寫 Cucumber 測(cè)試。它允許以人類可讀的格式編寫測(cè)試腳本,然后可以在產(chǎn)品開發(fā)中的所有利益相關(guān)者之間共享。Gherkin 文件是包含用 Gherkin 語(yǔ)言編寫的測(cè)試的文件。這些文件通常具有 .feature 文件擴(kuò)展名。這些 Gherkin 文件的內(nèi)容通常簡(jiǎn)稱為“Gherkin”。

Gherkin

在 Gherkin 定義的測(cè)試中,您有特性場(chǎng)景的概念。它們類似于其他測(cè)試框架中的測(cè)試套件和測(cè)試用例,提供了一種清晰的測(cè)試結(jié)構(gòu)方式。場(chǎng)景只是一個(gè)單獨(dú)的測(cè)試。它應(yīng)該只測(cè)試應(yīng)用程序中的一個(gè)方面。特性是一組相關(guān)的場(chǎng)景。因此,它將測(cè)試應(yīng)用程序中許多相關(guān)的方面。理想情況下,Gherkin 文件中的特性將與應(yīng)用程序中的特性緊密映射——因此得名。每個(gè) Gherkin 文件都包含一個(gè)特性,每個(gè)特性都包含一個(gè)或多個(gè)場(chǎng)景。場(chǎng)景然后由步驟組成,這些步驟按特定順序排列:

  • Given – 這些步驟用于在執(zhí)行測(cè)試之前設(shè)置初始狀態(tài)
  • When – 這些步驟是實(shí)際要執(zhí)行的測(cè)試
  • Then – 這些步驟用于斷言測(cè)試結(jié)果

理想情況下,每個(gè)場(chǎng)景都應(yīng)該是一個(gè)單獨(dú)的測(cè)試用例,因此 When 步驟的數(shù)量應(yīng)該保持非常少。步驟是完全可選的。例如,如果您根本不需要設(shè)置任何內(nèi)容,則可能沒(méi)有 Given 步驟。Gherkin 文件旨在易于閱讀,并使參與產(chǎn)品開發(fā)的任何人都能受益。這包括非技術(shù)人員,因此 Gherkin 文件應(yīng)始終使用業(yè)務(wù)語(yǔ)言而不是技術(shù)語(yǔ)言編寫。這意味著,例如,您不引用單個(gè) UI 組件,而是描述您想要測(cè)試的產(chǎn)品概念。

Gherkin 測(cè)試示例

以下是搜索 Google 的 Cucumber.js 的 Gherkin 示例:

Given I have opened a Web Browser
When I load the Wikipedia article on "Wiki"
Then I have "19" Wiki Links

我們可以立即看到,此測(cè)試告訴我們做什么,而不是如何做。它使用任何人都能理解的語(yǔ)言編寫,并且——重要的是——無(wú)論最終產(chǎn)品如何調(diào)整,它都最有可能保持正確。Google 可能會(huì)決定完全更改其 UI,但只要功能等效,則 Gherkin 仍然準(zhǔn)確。您可以在 Cucumber wiki 上閱讀更多關(guān)于 Given When Then 的信息。

Cucumber.js

在以 Gherkin 格式編寫測(cè)試用例后,您需要一種方法來(lái)執(zhí)行它們。在 JavaScript 世界中,有一個(gè)名為 Cucumber.js 的模塊允許您執(zhí)行此操作。它允許您定義 JavaScript 代碼,Cucumber.js 可以將其連接到 Gherkin 文件中定義的各種步驟。然后,它通過(guò)加載 Gherkin 文件并按正確的順序執(zhí)行與每個(gè)步驟關(guān)聯(lián)的 JavaScript 代碼來(lái)運(yùn)行測(cè)試。例如,在上面的示例中,您將擁有以下步驟:

const assert = require('assert');
const webdriver = require('selenium-webdriver');
const browser = new webdriver.Builder()
  .usingServer()
  .withCapabilities({'browserName': 'chrome' })
  .build();

browser.get('http://en.wikipedia.org/wiki/Wiki');
browser.findElements(webdriver.By.css('[href^="/wiki/"]'))
.then(function(links){
  assert.equal(19, links.length); // 假設(shè)的數(shù)字
  browser.quit();
});

不必過(guò)于擔(dān)心所有這些含義——稍后將詳細(xì)解釋。但本質(zhì)上,它定義了一些方法,Cucumber.js 框架可以使用這些方法將您的代碼綁定到 Gherkin 文件中的步驟。

(以下內(nèi)容與原文基本一致,略作調(diào)整以保持流暢性和可讀性,并對(duì)部分語(yǔ)句進(jìn)行同義詞替換)

將 Cucumber.js 包含在您的構(gòu)建中

將 Cucumber.js 包含在您的構(gòu)建中,只需將 cucumber 模塊添加到您的構(gòu)建中,然后配置它即可運(yùn)行。第一步如下所示:

Given I have opened a Web Browser
When I load the Wikipedia article on "Wiki"
Then I have "19" Wiki Links

第二步取決于您如何執(zhí)行構(gòu)建。

手動(dòng)運(yùn)行

手動(dòng)執(zhí)行 Cucumber 相對(duì)容易,最好先確保您可以這樣做,因?yàn)橐韵陆鉀Q方案都是自動(dòng)執(zhí)行相同操作的方法。安裝后,可執(zhí)行文件將是 ./node_modules/.bin/cucumber.js。運(yùn)行它時(shí),它需要知道在文件系統(tǒng)上的哪個(gè)位置可以找到所有必需的文件。這些文件既包括 Gherkin 文件,也包括要執(zhí)行的 JavaScript 代碼。按照慣例,所有 Gherkin 文件都將保存在 features 目錄中,如果您沒(méi)有指示它執(zhí)行其他操作,則 Cucumber 也將在同一目錄中查找要執(zhí)行的 JavaScript 代碼。但是,指示它查找這些文件的位置是一種明智的做法,這樣您可以更好地控制構(gòu)建過(guò)程。例如,如果您將所有 Gherkin 文件保存在 myFeatures 目錄中,并將所有 JavaScript 代碼保存在 mySteps 中,則可以執(zhí)行以下操作:

Given I have loaded Google
When I search for "cucumber.js"
Then the first result is "GitHub - cucumber/cucumber-js: Cucumber for JavaScript"

-r 標(biāo)志是一個(gè)包含 JavaScript 文件的目錄,Cucumber 會(huì)自動(dòng)加載這些文件用于測(cè)試。還有一些其他標(biāo)志可能也很有趣——只需閱讀幫助文本即可了解它們的工作方式:$ ./node_modules/.bin/cucumber.js --help。這些目錄會(huì)遞歸掃描,因此您可以根據(jù)具體情況將文件嵌套得淺或深。

npm 腳本

手動(dòng)運(yùn)行 Cucumber 后,將其添加到構(gòu)建中作為 npm 腳本是一個(gè)簡(jiǎn)單的情況。您只需將以下命令(無(wú)需完全限定路徑,因?yàn)?npm 會(huì)為您處理)添加到您的 package.json 中,如下所示:

Given('I have loaded Google', function() {});
When('I search for {stringInDoubleQuotes}', function() {});
Then('the first result is {stringInDoubleQuotes}', function() {});

完成后,您可以執(zhí)行:

$ npm install --save-dev cucumber

它將完全按照您之前所做的那樣執(zhí)行 Cucumber 測(cè)試。

Grunt

確實(shí)存在一個(gè)用于執(zhí)行 Cucumber.js 測(cè)試的 Grunt 插件。不幸的是,它已經(jīng)過(guò)時(shí)了,并且不適用于更新版本的 Cucumber.js,這意味著如果您使用它,您將錯(cuò)過(guò)許多改進(jìn)。相反,我更喜歡的方法是簡(jiǎn)單地使用 grunt-shell 插件以與上述完全相同的方式執(zhí)行命令。安裝后,配置它只需將以下插件配置添加到您的 Gruntfile.js 中:

const assert = require('assert');
const webdriver = require('selenium-webdriver');
const browser = new webdriver.Builder()
  .usingServer()
  .withCapabilities({'browserName': 'chrome' })
  .build();

browser.get('http://en.wikipedia.org/wiki/Wiki');
browser.findElements(webdriver.By.css('[href^="/wiki/"]'))
.then(function(links){
  assert.equal(19, links.length); // 假設(shè)的數(shù)字
  browser.quit();
});

現(xiàn)在,和以前一樣,您可以通過(guò)運(yùn)行 grunt shell:cucumber 來(lái)執(zhí)行測(cè)試。

Gulp

Gulp 與 Grunt 的情況完全相同,因?yàn)楝F(xiàn)有的插件已經(jīng)過(guò)時(shí),并且將使用舊版本的 Cucumber 工具。同樣,在這里您可以使用 gulp-shell 模塊像在其他場(chǎng)景中一樣執(zhí)行 Cucumber.js 命令。設(shè)置它很簡(jiǎn)單:

Given I have opened a Web Browser
When I load the Wikipedia article on "Wiki"
Then I have "19" Wiki Links

現(xiàn)在,和以前一樣,您可以通過(guò)運(yùn)行 gulp cucumber 來(lái)執(zhí)行測(cè)試。

您的第一個(gè) Cucumber 測(cè)試

請(qǐng)注意,本文中的所有代碼示例都可以在 GitHub 上找到。

現(xiàn)在我們知道了如何執(zhí)行 Cucumber,讓我們實(shí)際編寫一個(gè)測(cè)試。在這個(gè)示例中,我們將做一些相當(dāng)人為的事情,只是為了展示系統(tǒng)的工作原理。實(shí)際上,您會(huì)做更復(fù)雜的事情,例如直接調(diào)用您正在測(cè)試的代碼、對(duì)正在運(yùn)行的服務(wù)進(jìn)行 HTTP API 調(diào)用或控制 Selenium 來(lái)驅(qū)動(dòng) Web 瀏覽器以測(cè)試您的應(yīng)用程序。我們的簡(jiǎn)單示例將證明數(shù)學(xué)仍然有效。我們將有兩個(gè)特性——加法和乘法。首先,讓我們進(jìn)行設(shè)置。

Given I have loaded Google
When I search for "cucumber.js"
Then the first result is "GitHub - cucumber/cucumber-js: Cucumber for JavaScript"

您如何執(zhí)行測(cè)試完全取決于您。在這個(gè)示例中,為了簡(jiǎn)單起見(jiàn),我將手動(dòng)執(zhí)行它。在一個(gè)真實(shí)的項(xiàng)目中,您將使用上述選項(xiàng)之一將其集成到您的構(gòu)建中。

Given('I have loaded Google', function() {});
When('I search for {stringInDoubleQuotes}', function() {});
Then('the first result is {stringInDoubleQuotes}', function() {});

現(xiàn)在,讓我們編寫我們的第一個(gè)實(shí)際特性。這將放在 features/addition.feature 中:

$ npm install --save-dev cucumber

非常簡(jiǎn)單,非常易于閱讀。它準(zhǔn)確地告訴我們正在做什么,而沒(méi)有告訴我們?nèi)绾稳プ?。讓我們嘗試一下:

(以下內(nèi)容與原文基本一致,略作調(diào)整以保持流暢性和可讀性,并對(duì)部分語(yǔ)句進(jìn)行同義詞替換)

然后讓我們編寫我們的第一個(gè)步驟文件。這將簡(jiǎn)單地按照 Cucumber 輸出告訴我們的方式實(shí)現(xiàn)步驟,這不會(huì)做任何有用的事情,但會(huì)整理輸出。這將放在 steps/maths.js 中:

const assert = require('assert');
const webdriver = require('selenium-webdriver');
const browser = new webdriver.Builder()
  .usingServer()
  .withCapabilities({'browserName': 'chrome' })
  .build();

browser.get('http://en.wikipedia.org/wiki/Wiki');
browser.findElements(webdriver.By.css('[href^="/wiki/"]'))
.then(function(links){
  assert.equal(19, links.length); // 假設(shè)的數(shù)字
  browser.quit();
});

defineSupportCode 鉤子是 Cucumber.js 的一種方法,允許您提供它將用于各種不同情況的代碼。所有這些都將被涵蓋,但本質(zhì)上,任何時(shí)候您想要編寫 Cucumber 將直接調(diào)用的代碼,它都需要在這些塊中的一個(gè)內(nèi)部。您會(huì)注意到,此處的示例代碼定義了三個(gè)不同的步驟——每個(gè) Given、When 和 Then 一個(gè)。每個(gè)塊都給出一個(gè)字符串(或者如果您需要的話,是一個(gè)正則表達(dá)式),該字符串與特性文件中的步驟匹配,以及在該步驟匹配時(shí)執(zhí)行的函數(shù)。占位符可以放在步驟字符串中(或者如果您使用的是正則表達(dá)式,則使用捕獲表達(dá)式代替),這些占位符將被提取出來(lái)并作為參數(shù)提供給您的函數(shù)。執(zhí)行此操作將提供更簡(jiǎn)潔的輸出,同時(shí)仍然實(shí)際上什么也不做:

(以下內(nèi)容與原文基本一致,略作調(diào)整以保持流暢性和可讀性,并對(duì)部分語(yǔ)句進(jìn)行同義詞替換)

現(xiàn)在讓我們讓它全部工作。我們只需要在我們步驟定義中實(shí)現(xiàn)代碼即可。我們還將進(jìn)行一些整理,以使閱讀更容易。這實(shí)際上消除了對(duì)回調(diào)參數(shù)的需求,因?yàn)槲覀儧](méi)有做任何異步操作。之后,我們的 steps/maths.js 將如下所示:

Given I have opened a Web Browser
When I load the Wikipedia article on "Wiki"
Then I have "19" Wiki Links

執(zhí)行它看起來(lái)像這樣:

(以下內(nèi)容與原文基本一致,略作調(diào)整以保持流暢性和可讀性,并對(duì)部分語(yǔ)句進(jìn)行同義詞替換)

就這樣,我們得到了一個(gè)非常易于擴(kuò)展的測(cè)試套件,它證明了數(shù)學(xué)是正確的。作為一個(gè)練習(xí),為什么不嘗試擴(kuò)展它以支持減法呢?如果您遇到困難,可以在評(píng)論中尋求幫助。

(以下內(nèi)容與原文基本一致,略作調(diào)整以保持流暢性和可讀性,并對(duì)部分語(yǔ)句進(jìn)行同義詞替換,并對(duì)部分章節(jié)進(jìn)行合并和簡(jiǎn)化)

更高級(jí)的 Cucumber.js技巧

這都很好,但是 Cucumber 可以做一些更高級(jí)的事情,這將使我們的生活更輕松。

異步步驟定義

到目前為止,我們只編寫了同步步驟定義。但是,在 JavaScript 世界中,這通常不夠好。JavaScript 中的很多東西都需要異步,因此我們需要一些方法來(lái)處理它。謝天謝地,Cucumber.js 有幾種內(nèi)置的方法來(lái)處理這個(gè)問(wèn)題,這取決于您的喜好。上面暗示過(guò)的方法,這是處理異步步驟的更傳統(tǒng)的 JavaScript 方法,是使用回調(diào)函數(shù)。如果您指定步驟定義應(yīng)該將回調(diào)函數(shù)作為其最后一個(gè)參數(shù),則只有在觸發(fā)此回調(diào)后,才認(rèn)為步驟已完成。在這種情況下,如果回調(diào)使用任何參數(shù)被觸發(fā),則這被認(rèn)為是一個(gè)錯(cuò)誤,并且步驟將失敗。如果它在沒(méi)有任何參數(shù)的情況下被觸發(fā),則認(rèn)為步驟已成功。但是,如果根本沒(méi)有觸發(fā)回調(diào),則框架最終會(huì)超時(shí)并使步驟失敗。故事的寓意?如果您接受回調(diào)參數(shù),請(qǐng)確保調(diào)用它。例如,使用回調(diào)進(jìn)行 HTTP API 調(diào)用的步驟定義可能如下所示。這是使用 Request 編寫的,因?yàn)樗陧憫?yīng)上使用回調(diào)。

(以下內(nèi)容與原文基本一致,略作調(diào)整以保持流暢性和可讀性,并對(duì)部分語(yǔ)句進(jìn)行同義詞替換)

另一種方法,也是更優(yōu)選的方法是通過(guò)返回類型。如果您從步驟返回一個(gè) Promise,則只有當(dāng) Promise 完成時(shí),才認(rèn)為步驟已完成。如果 Promise 被拒絕,則步驟將失??;如果 Promise 被 fulfilled,則步驟將成功?;蛘?,如果您返回的內(nèi)容不是 Promise,則步驟將立即被認(rèn)為已成功。這包括返回 undefined 或 null。這意味著您可以在步驟執(zhí)行期間選擇是否需要返回 Promise,并且框架將根據(jù)需要進(jìn)行調(diào)整。例如,使用 Promises 進(jìn)行 HTTP API 調(diào)用的步驟定義可能如下所示。這是使用 Fetch API 編寫的,因?yàn)樗陧憫?yīng)上返回一個(gè) Promise。

(以下內(nèi)容與原文基本一致,略作調(diào)整以保持流暢性和可讀性,并對(duì)部分語(yǔ)句進(jìn)行同義詞替換,并對(duì)部分章節(jié)進(jìn)行合并和簡(jiǎn)化)

特性背景、場(chǎng)景大綱、數(shù)據(jù)表、鉤子、事件和世界

這些高級(jí)特性,例如特性背景、場(chǎng)景大綱、數(shù)據(jù)表,以及鉤子函數(shù)(Before, After, BeforeStep, AfterStep等)和事件處理機(jī)制,都能夠極大地提高測(cè)試效率和可讀性。通過(guò)合理運(yùn)用這些功能,可以編寫更簡(jiǎn)潔、更易維護(hù)的BDD測(cè)試。 World 對(duì)象允許在不同的步驟定義之間共享數(shù)據(jù)和狀態(tài),從而簡(jiǎn)化測(cè)試邏輯。

(以下內(nèi)容與原文基本一致,略作調(diào)整以保持流暢性和可讀性,并對(duì)部分語(yǔ)句進(jìn)行同義詞替換)

總結(jié)

行為驅(qū)動(dòng)開發(fā)是一種確保產(chǎn)品具有正確行為的絕佳方法,而 Cucumber 作為一種工具,是一種非常強(qiáng)大的方法,可以實(shí)現(xiàn)這一點(diǎn),以便產(chǎn)品的每個(gè)利益相關(guān)者都能閱讀、理解甚至編寫行為測(cè)試。本文只是觸及了 Cucumber 能夠?qū)崿F(xiàn)的皮毛,因此我鼓勵(lì)您自己嘗試一下,以了解其強(qiáng)大功能。Cucumber 還擁有一個(gè)非?;钴S的社區(qū),他們的郵件列表和 Gitter 頻道是尋求幫助的好方法,如果您需要的話。您是否已經(jīng)在使用 Cucumber?本文是否鼓勵(lì)您嘗試一下?無(wú)論哪種方式,我都想在下面的評(píng)論中聽到您的聲音。本文由 Jani Hartikainen 進(jìn)行了同行評(píng)審。感謝所有 SitePoint 的同行評(píng)審者,使 SitePoint 內(nèi)容達(dá)到最佳狀態(tài)!

(以下內(nèi)容與原文基本一致,略作調(diào)整以保持流暢性和可讀性,并對(duì)部分語(yǔ)句進(jìn)行同義詞替換)

關(guān)于使用 Cucumber 和 Gherkin 的 JavaScript 中 BDD 的常見(jiàn)問(wèn)題 (FAQ)

(以下內(nèi)容與原文基本一致,略作調(diào)整以保持流暢性和可讀性,并對(duì)部分語(yǔ)句進(jìn)行同義詞替換)

以上是BDD在JavaScript:開始使用Cucumber和Gherkin的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語(yǔ)言,各自適用于不同的應(yīng)用場(chǎng)景。Java用于大型企業(yè)和移動(dòng)應(yīng)用開發(fā),而JavaScript主要用于網(wǎng)頁(yè)開發(fā)。

JavaScript評(píng)論:簡(jiǎn)短說(shuō)明 JavaScript評(píng)論:簡(jiǎn)短說(shuō)明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

如何在JS中與日期和時(shí)間合作? 如何在JS中與日期和時(shí)間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時(shí)間處理需注意以下幾點(diǎn):1.創(chuàng)建Date對(duì)象有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設(shè)置時(shí)間信息可用get和set方法,注意月份從0開始;3.手動(dòng)格式化日期需拼接字符串,也可使用第三方庫(kù);4.處理時(shí)區(qū)問(wèn)題建議使用支持時(shí)區(qū)的庫(kù),如Luxon。掌握這些要點(diǎn)能有效避免常見(jiàn)錯(cuò)誤。

為什么要將標(biāo)簽放在的底部? 為什么要將標(biāo)簽放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript與Java:開發(fā)人員的全面比較 JavaScript與Java:開發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

什么是在DOM中冒泡和捕獲的事件? 什么是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個(gè)階段,捕獲是從頂層向下到目標(biāo)元素,冒泡是從目標(biāo)元素向上傳播到頂層。1.事件捕獲通過(guò)addEventListener的useCapture參數(shù)設(shè)為true實(shí)現(xiàn);2.事件冒泡是默認(rèn)行為,useCapture設(shè)為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委托,提高動(dòng)態(tài)內(nèi)容處理效率;5.捕獲可用于提前攔截事件,如日志記錄或錯(cuò)誤處理。了解這兩個(gè)階段有助于精確控制JavaScript響應(yīng)用戶操作的時(shí)機(jī)和方式。

JavaScript:探索用于高效編碼的數(shù)據(jù)類型 JavaScript:探索用于高效編碼的數(shù)據(jù)類型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數(shù)字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

如何減少JavaScript應(yīng)用程序的有效載荷大?。? />
								</a>
								<a href=如何減少JavaScript應(yīng)用程序的有效載荷大??? Jun 26, 2025 am 12:54 AM

如果JavaScript應(yīng)用加載慢、性能差,問(wèn)題往往出在payload太大,解決方法包括:1.使用代碼拆分(CodeSplitting),通過(guò)React.lazy()或構(gòu)建工具將大bundle拆分為多個(gè)小文件,按需加載以減少首次下載量;2.移除未使用的代碼(TreeShaking),利用ES6模塊機(jī)制清除“死代碼”,確保引入的庫(kù)支持該特性;3.壓縮和合并資源文件,啟用Gzip/Brotli和Terser壓縮JS,合理合并文件并優(yōu)化靜態(tài)資源;4.替換重型依賴,選用輕量級(jí)庫(kù)如day.js、fetch

See all articles