BDD और Gherkin
Behaviour-driven development (BDD) काम करने का एक तरीका है जिसमें business, development और testing के नज़रिए concrete examples पर बात करके तय करते हैं कि feature को कैसा behave करना चाहिए, तय हुए examples को Gherkin नाम की structured सादी भाषा में लिखते हैं, और फिर उन्हें automate करते हैं ताकि वे system को check करें। ISTQB Foundation syllabus BDD को ऐसा approach बताता है जो application के चाहे गए behaviour को natural language के सरल रूप में लिखे test cases से व्यक्त करता है जिन्हें stakeholders समझ सकें, आम तौर पर Given/When/Then format में, और फिर इन test cases को अपने-आप executable tests में बदला जाता है।
Checkout पर discount code का उदाहरण लें। एक छोटी बातचीत में team rule तय करती है "SAVE10 200.00 SAR या उससे ज़्यादा के subtotal पर 10% छूट देता है" और दो examples: 200.00 SAR के subtotal पर 180.00 देने होते हैं, और 199.99 SAR की कीमत वही रहती है। हर example एक feature file में Gherkin scenario बनता है, और step definitions scenario की हर line को automation code से जोड़ती हैं। तब वही text business की मंज़ूर की हुई specification भी है, हर build पर चलने वाला test भी, और rule का documentation भी।
यह क्यों ज़रूरी है
Business features के कई महँगे defects coding की चूक नहीं, बल्कि गलतफ़हमी होते हैं: developer ने "200.00 या ज़्यादा" को "200.00 से ज़्यादा" पढ़ा, या किसी ने तय ही नहीं किया कि expired code के साथ क्या होगा। BDD इस लागत को जड़ से पकड़ता है। Code लिखने से पहले concrete examples पर बातचीत अलग-अलग अर्थ और छूटे हुए rules तब सामने लाती है जब उन्हें ठीक करना सस्ता है, इसलिए यह team के पास static testing के सबसे शुरुआती रूपों में से एक है।
Tester के लिए BDD काम को आगे ले आता है: build के बाद gaps ढूँढने की बजाय आप वे examples गढ़ने में हिस्सा लेते हैं जो feature को परिभाषित करते हैं, और बाद में वही scenarios acceptance tests और regression tests दोनों का काम करते हैं। Reports business की भाषा बोलती हैं, इसलिए fail हुआ scenario बताता है कि कौन-सा rule टूटा। लेकिन इसकी कीमत भी है: step definitions की एक layer जिसे maintain करना पड़ता है। जो teams बातचीत के बिना सिर्फ़ tool अपनाती हैं, वे यह कीमत चुकाती हैं और बदले में कम पाती हैं।
BDD बातचीत से शुरू होता है: three amigos
सबसे जाने-माने BDD tools में से एक, Cucumber, रोज़ के BDD काम को तीन practices के रूप में बताता है जो हर छोटे बदलाव के लिए दोहराई जाती हैं। Discovery: team नए behaviour के concrete examples पर बात करके details पर सहमत होती है। Formulation: तय हुए examples Gherkin scenarios के रूप में लिखे जाते हैं, और जिन लोगों ने उन पर सहमति दी थी वे जाँचते हैं कि wording अब भी वही कहती है जो उनका मतलब था। Automation: scenarios को code से जोड़ा जाता है ताकि वे system पर चलें, बेहतर हो कि feature बनने से पहले ही, ताकि वे development को दिशा दें। संक्षेप में: system क्या कर सकता है, क्या करना चाहिए, और असल में क्या करता है।
Discovery आम तौर पर backlog refinement के दौरान हर story की एक छोटी meeting में होती है, development शुरू होने से पहले। कई teams इसे "three amigos" कहती हैं, क्योंकि इसमें तीन नज़रिए साथ आते हैं: business (product owner या business analyst, जिनके पास problem और rules हैं), development (जो जानते हैं कि इसे कैसे बनाया जा सकता है और technically क्या मुश्किल है) और testing (जो पूछते हैं कि क्या गलत हो सकता है और कौन-से examples यह दिखाएँगे)। मायने तीन नज़रियों के हैं, लोगों की गिनती के नहीं: कोई designer या दूसरा developer भी जुड़ सकता है।
इस meeting को चलाने का एक लोकप्रिय तरीका example mapping है, जिसका वर्णन Cucumber के BDD documentation में है। रंगीन cards से table पर एक map बनता है: story के लिए पीला card, हर rule के लिए नीला card, किसी rule के नीचे उसे समझाने वाले examples के लिए हरे cards, और उन सवालों के लिए लाल cards जिनका जवाब कमरे में कोई नहीं दे सकता। Map एक नज़र में readiness दिखाता है: बहुत से लाल cards का मतलब है कि story अभी बनाने लायक नहीं, और बहुत से नीले cards का मतलब अक्सर यह कि story बहुत बड़ी है और उसे बाँटना चाहिए। Story SHOP-31, "Checkout पर discount code लागू करना", का map यह है।
- Story (पीला): SHOP-31, checkout पर discount code लागू करना।
- Rule 1 (नीला): SAVE10 200.00 SAR या उससे ज़्यादा के subtotal पर 10% छूट देता है। Examples (हरे): 250.00 → 225.00 देने होंगे; 200.00 → 180.00 देने होंगे; 199.99 → code refuse, 199.99 देने होंगे।
- Rule 2 (नीला): expired code refuse होता है। Example (हरा): code 31 March 2027 को ख़त्म हुआ और 1 April 2027 को लागू किया गया, तो message आता है "यह code expire हो चुका है"।
- Rule 3 (नीला): हर order पर एक code। Example (हरा): SAVE10 लागू हुआ, फिर WELCOME5 डाला गया; नतीजा एक लाल card पर अटका है।
- सवाल (लाल): minimum delivery fee से पहले जाँचा जाता है या बाद में? दूसरा code पहले वाले की जगह लेता है या refuse होता है? Code लागू होने के बाद customer items हटा दे और subtotal 200.00 से नीचे चला जाए तो क्या होगा?
आज़माएँ: User Story → टेस्ट सिनेरियो आज़माएँ: बाउंड्री वैल्यू जनरेटर आज़माएँ: डिसीज़न टेबल जनरेटर
Gherkin syntax: feature file के हिस्से
Gherkin वह सादी भाषा वाला format है जिसे BDD tools पढ़ते हैं। Scenarios .feature extension वाली text files में रहते हैं, और हर non-blank line एक keyword से शुरू होती है, free-text descriptions को छोड़कर। Step keywords Given, When, Then, And और But, और Examples table वाला Scenario Outline, आप acceptance criteria वाले lesson से जानते हैं। पूरी feature file इनके चारों ओर structure जोड़ती है।
जब product owner ने पहले लाल card का जवाब दिया (minimum subtotal पर लागू होता है, delivery fee से पहले), तो team ने SHOP-31 के rules 1 और 2 को नीचे वाली file में formulate किया। हर नीला card एक Rule बना और हर हरा card एक Scenario। Gherkin reference हर scenario में तीन से पाँच steps की सलाह देता है; इससे ज़्यादा होने पर example specification की तरह पढ़ा नहीं जाता।
Feature: हर file में एक। इसका नाम और इसके नीचे का free-text description बताते हैं कि feature किस लिए है; description execute नहीं होता।Rule: एक business rule को समझाने वाले scenarios को group करता है, जैसे नीला card अपने हरे cards के साथ।Scenario, या उसका synonymExample: एक behaviour का एक concrete example।Background: Given steps जो file या rule के हर scenario में साझा हैं। यह हर scenario से पहले चलता है, किसी भीBeforehook के बाद (Cucumber के setup hooks, जैसे दूसरे runners मेंbeforeEach)। इसे छोटा रखें और इसमें सिर्फ़ वह context रखें जो scenarios समझने के लिए पाठक को चाहिए।- Data table: किसी step के नीचे
|pipes के बीच rows, जो उस step के code को एक argument के रूप में मिलती हैं। Doc string: दो"""lines के बीच multi-line text, जैसे email body या JSON payload के लिए। @smokeया@SHOP-31जैसे tags किसी feature, rule, scenario या examples table को label करते हैं ताकि आप चुन सकें कि क्या चलाना है। Tags inherit होते हैं: feature पर लगा tag उसके हर scenario पर लागू होता है।- Comments line की शुरुआत में
#से शुरू होते हैं। पहली line पर# language:header keywords को किसी दूसरी बोली जाने वाली भाषा में बदल देता है।
# Story SHOP-31. Rules example-mapping session में तय हुए।
@checkout
Feature: Checkout पर discount codes
Customer हर order पर एक discount code डाल सकता है।
छूट subtotal पर लगती है, delivery fee से पहले।
Background:
Given ये discount codes मौजूद हैं:
| code | percent | min_subtotal | valid_until |
| SAVE10 | 10 | 200.00 | 2027-03-31 |
Rule: Code सिर्फ़ अपने minimum subtotal से लागू होता है
Scenario: Minimum के बराबर subtotal पर छूट मिलती है
Given Huda के cart का subtotal 200.00 SAR है
When वह code "SAVE10" लागू करती है
Then delivery से पहले देय राशि 180.00 SAR है
Scenario: Minimum से ठीक नीचे वाले subtotal की कीमत वही रहती है
Given Huda के cart का subtotal 199.99 SAR है
When वह code "SAVE10" लागू करती है
Then code refuse होता है और message आता है "इस code के लिए 200.00 SAR ज़रूरी है"
And delivery से पहले देय राशि 199.99 SAR है
Rule: Expired code refuse होता है
@smoke
Scenario: End date के अगले दिन इस्तेमाल किया गया code
Given आज 1 April 2027 है
And Huda के cart का subtotal 250.00 SAR है
When वह code "SAVE10" लागू करती है
Then code refuse होता है और message आता है "यह code expire हो चुका है"Story SHOP-31 का rule 1, feature file में (अंश)
भाग 1:@checkout भाग 2:Feature: Discount codes at checkout भाग 3: A customer can enter one discount code per order. भाग 4: Background: Given these discount codes exist: भाग 5: | code | percent | min_subtotal | valid_until | | SAVE10 | 10 | 200.00 | 2027-03-31 | भाग 6: Rule: A code applies only from its minimum subtotal भाग 7: Scenario: A subtotal at the minimum gets the discount भाग 8: Given Huda has a cart with a subtotal of 200.00 SAR भाग 9: When she applies the code "SAVE10" भाग 10: Then the amount to pay before delivery is 180.00 SAR
- 4–5हर scenario से पहले चलता है
- 8–10Steps: हर line एक step definition से match होती है
- 1Tagपूरे feature को label करता है; हर scenario इसे inherit करता है, इसलिए एक run इन सबको चुन सकता है।
- 2Featureहर file में एक: वह capability जिसका scenarios वर्णन करते हैं।
- 3Descriptionपाठकों के लिए free text; runner इसे execute नहीं करता।
- 4Backgroundहर scenario का साझा context; हर scenario से पहले चलता है, किसी भी
Beforehook के बाद। - 5Data tableRows जो step के code को एक argument के रूप में मिलती हैं: वह discount code जिस पर scenarios निर्भर हैं।
- 6Ruleएक business rule, example map का नीला card; इसके scenarios हरे cards हैं।
- 7Scenarioएक behaviour का एक example; title outcome बताता है।
- 8Given: contextSystem को known state में रखता है;
{word}और{float}Huda और 200.00 पकड़ते हैं। - 9When: actionTest हो रहा एकमात्र action;
{string}SAVE10 पकड़ता है। - 10Then: outcomeदेखा जा सकने वाला outcome; इसकी step definition assert करती है कि page पर 180.00 दिखता है।
अच्छे और कमज़ोर scenarios
BDD में सबसे आम चूक ऐसी feature file है जो असल में test script है: हर click, field और URL Given/When/Then में लिखा हुआ। यह imperative style हर redesign के साथ टूटती है और rule को UI details के नीचे दबा देती है। Declarative style business की भाषा में बताती है कि क्या होता है, और कैसे होता है यह automation code पर छोड़ देती है। एक ही example के दो versions की तुलना करें।
पहले version में कुछ नहीं बताता कि 180.00 सही जवाब क्यों है: 200.00 SAR का subtotal, वह अकेला fact जिस पर rule निर्भर है, एक book की कीमत में छिपा है। इसका आख़िरी step एक database table check करता है जिसे कोई stakeholder नहीं देख सकता, और इसके steps कई actions को एक ही step में जोड़ते हैं ("टाइप करके ... click करता हूँ"), इसलिए उन्हें reuse नहीं किया जा सकता। दूसरा version product owner पढ़कर मंज़ूर कर सकता है, और checkout page के redesign के बाद भी यह बिना बदले बना रहता है।
- हर scenario में एक behaviour, और ऐसा title जो उसे बताए: "Minimum से ठीक नीचे वाले subtotal की कीमत वही रहती है", "Discount test 2" नहीं।
- Business शब्दों में declarative steps; clicks की जगह step definitions और page objects में है।
- सिर्फ़ वह data जो result बदलता है। Scenario की हर value rule के लिए मायने रखे, और जिस चीज़ पर rule निर्भर है वह छिपी न हो।
- हर Then में ऐसा outcome जिसे user या stakeholder देख सके, और इतना specific कि fail हो सके: "मुझे 180.00 दिखना चाहिए" यह नहीं बताता कि कहाँ।
- Independent और repeatable scenarios: हर scenario अपना context ख़ुद तैयार करता है और किसी भी क्रम में, किसी भी दिन, अकेले pass या fail होता है। Rule 1 के scenarios में कोई date नहीं है, इसलिए उनके automation को shop की clock एक तय date पर रखनी होगी, जैसे किसी
Beforehook में; वरना जिस दिन SAVE10 expire होगा, उसी दिन से वे fail होने लगेंगे। - पूरे project में एक idea के लिए एक phrase, जैसे हर जगह "subtotal", न कि एक file में "cart total" और दूसरी में "basket amount", ताकि steps वही definitions reuse करें।
# Imperative: scenario के कपड़ों में test script
Scenario: Discount test 2
Given मैं "https://shop.example/login" खोलता हूँ
And मैं "email" में "huda@example.com" टाइप करके "Sign in" click करता हूँ
And मैं "Desert Stars" के बगल में "Add to cart" click करता हूँ
And मैं "Checkout" click करता हूँ
When मैं "code" में "SAVE10" टाइप करके "Apply" click करता हूँ
Then मुझे "180.00" दिखना चाहिए
And discounts table में इस order की row है
# Declarative: business की भाषा में एक behaviour
Scenario: Minimum के बराबर subtotal पर छूट मिलती है
Given Huda के cart का subtotal 200.00 SAR है
When वह code "SAVE10" लागू करती है
Then delivery से पहले देय राशि 180.00 SAR हैScenarios automation से कैसे जुड़ते हैं
Cucumber जैसा BDD runner feature files पढ़ता है और हर step के लिए एक step definition ढूँढता है: एक function जो ऐसे pattern के साथ register होता है जिससे step text का match होना ज़रूरी है। Pattern आम तौर पर Cucumber Expression होता है, जिसमें {int}, {float}, {word} और {string} जैसे parameters text से values पकड़कर function को arguments के रूप में देते हैं; regular expressions भी काम करते हैं। Keyword match का हिस्सा नहीं है: एक ही text वाले Given और Then step एक ही definition को call करते हैं, इसलिए एक ही text दो जगह दो अलग मतलब नहीं रख सकता।
Step definitions glue code हैं और इन्हें पतला रहना चाहिए। ये business step को उस automation layer की calls में बदलती हैं जिसे आपने page object model और test automation architecture वाले lessons में देखा: API client किसी Given के लिए data तैयार करता है, page object When को user की तरह perform करता है, और Then result पढ़कर वह assertion करता है जो actual outcome को expected से मिलाता है। जो values एक step बाद वाले step के लिए बनाता है, जैसे Given का बनाया cart, वे एक context object में रखी जाती हैं। Cucumber for JavaScript में यह World है, जो step function के अंदर this के रूप में मिलता है (इसलिए steps function से लिखे जाते हैं, arrow functions से नहीं, क्योंकि उनका अपना this नहीं होता) और हर scenario के लिए नया बनता है, जिससे scenarios independent रहते हैं; API client और page objects भी आम तौर पर यहीं बनाए जाते हैं, ताकि हर step उन तक पहुँच सके।
हर step एक status के साथ ख़त्म होता है: passed, failed, skipped (failed, pending या undefined step के बाद वाले steps नहीं चलते), pending (definition अभी अधूरी है), undefined (कोई definition match नहीं करती; Cucumber शुरुआत के लिए code snippet print करता है) या ambiguous (एक से ज़्यादा definitions match करती हैं)। Report scenarios और steps को feature file के शब्दों में दिखाती है, इसलिए fail हुआ Then step उस rule का नाम बताता है जो टूटा। Tags तय करते हैं कि क्या चलेगा, जैसे pipeline में npx cucumber-js --tags "@smoke and not @wip"।
import { Given, When, Then } from "@cucumber/cucumber";
import assert from "node:assert/strict";
// Background step से match करता है; data table आख़िरी argument बनकर आती है
Given("ये discount codes मौजूद हैं:", async function (table) {
for (const row of table.hashes()) await this.api.createCode(row);
});
// Match करता है: Given Huda के cart का subtotal 200.00 SAR है
Given("{word} के cart का subtotal {float} SAR है",
async function (customer, subtotal) {
this.cart = await this.api.createCart(customer, subtotal);
});
// Match करता है: When वह code "SAVE10" लागू करती है
When("वह code {string} लागू करती है", async function (code) {
await this.checkout.open(this.cart);
await this.checkout.applyCode(code);
});
// दोनों को match करता है: Then delivery से पहले देय राशि ... और And ...
Then("delivery से पहले देय राशि {float} SAR है",
async function (expected) {
assert.equal(await this.checkout.amountBeforeDelivery(), expected);
});
Then("code refuse होता है और message आता है {string}",
async function (message) {
assert.equal(await this.checkout.codeMessage(), message);
});- Cucumber runner feature file पढ़ता है
- Step definitions glue code
- API client और page object automation layer
- Shop system under test
- 1 Cucumber runner आंतरिक रूप से: File parse करता है; hooks और Background चलाता है, फिर scenario
npx cucumber-js --tags @checkout - 2 Cucumber runner से Step definitions तक: Given step अपने expression से match होता है
{word}= Huda,{float}= 200 - 3 Step definitions से API client और page object तक: API client से cart बनाती है
api.createCart(customer, subtotal) - 4 API client और page object से Shop तक: Data API से तैयार करता है, screens से नहीं
- 5 Cucumber runner से Step definitions तक: When step:
{string}SAVE10 पकड़ता है - 6 Step definitions से API client और page object तक: Page object से code लागू करती है
checkout.applyCode(code) - 7 API client और page object से Shop तक: User की तरह code टाइप करके Apply चुनता है
- 8 Cucumber runner से Step definitions तक: Then step: इस text वाले हर Then या And के लिए एक ही definition
- 9 Step definitions से API client और page object तक: Page object से delivery से पहले की राशि माँगती है
checkout.amountBeforeDelivery() - 10 API client और page object से Step definitions तक: Checkout page से पढ़कर 180 लौटाता है जवाब
- 11 Step definitions आंतरिक रूप से: Assertion: actual 180, expected 180 के बराबर
assert.equal(actual, expected)पास
परिणाम: Scenario pass हुआ। Fail हुआ assertion अपने step को failed करता है, और उसके बाद वाले steps skip होते हैं। पास
आम गलतियाँ
- BDD को tool का चुनाव समझना: Cucumber install करके testers से development के बाद अकेले feature files लिखवाना। न discovery होती है, न साझा समझ, बस maintain करने के लिए एक extra layer।
- Clicks, field names और URLs से भरे imperative, UI-level scenarios लिखना, जो हर redesign के साथ टूटते हैं और rule को छिपा देते हैं।
- कई actions को "और" से जोड़ने वाले conjunction steps, और बार-बार When और Then के जोड़ों से कई behaviours टेस्ट करने वाले scenarios। इन्हें reuse नहीं किया जा सकता, और fail होने पर कोई नहीं जानता क्यों।
- ऐसे scenarios जो एक-दूसरे पर या किसी पिछले scenario के छोड़े data पर निर्भर हों। हर scenario को अपना context ख़ुद तैयार करना चाहिए।
- हर data combination को
Examplestable की rows में बदलते जाना, जब तक दर्जनों UI tests न बन जाएँ। Combinations को unit या API tests में नीचे ले जाएँ और rule समझाने वाले कुछ examples रखें। - Step definition layer को बेतरतीब बढ़ने देना: "cart total है" और "basket amount है" जैसी लगभग एक जैसी phrasings, हर एक की अपनी definition, या page objects और API clients की बजाय step definitions के अंदर logic।
QA का नज़रिया
Discovery में tester वह amigo है जो पूछता है "अगर ऐसा हो तो?"। आप boundary values (199.99 और 200.00), negative examples और state व timing के सवाल लाते हैं, और पक्का करते हैं कि हर rule का एक example उसे refuse करते हुए भी दिखाए, सिर्फ़ accept करते हुए नहीं। हर बिना जवाब वाले सवाल को अंदाज़ा लगाने की बजाय owner वाले लाल card में बदलें। Formulation में scenarios को वैसे review करें जैसे requirements को करते हैं: क्या product owner हर scenario पढ़कर उस पर सहमति दे सकता है, और क्या हर scenario observable outcome वाला एक ही behaviour है?
Automation में step definitions पर developer के साथ pair करें, approved step phrases की एक साझा list रखें, और traceability के लिए हर scenario पर उसकी story id का tag लगाएँ। जब pipeline में कोई scenario fail हो, तो fail हुआ step बताता है कि कौन-सा rule टूटा; उसे automation reporting वाले lesson की तरह debug करें। जब कोई rule बदले, तो पहले scenario बदलें, फिर code: living documentation तभी तक ज़िंदा रहता है जब तक scenarios सच बने रहें।
अभ्यास
Class-booking script को BDD scenarios में बदलें
एक gym app के पास नीचे दी गई story, product owner के notes, और एक draft feature file है जिसे team के एक सदस्य ने feature बनने के बाद लिखा। Notes को अपना discovery input मानें: rules, examples और खुले सवालों का map बनाएँ, फिर feature file दोबारा लिखें और उसकी step definitions की योजना बनाएँ।
जहाँ कोई value या message नहीं दिया गया, वहाँ ख़ुद तय करने की बजाय एक प्रस्ताव रखें और उसे product owner के लिए सवाल के रूप में चिह्नित करें।
GYM-12 Fitness class में जगह book करना
एक member के रूप में, मैं class में जगह book करना चाहता हूँ,
ताकि मेरी जगह पक्की रहे।
Product owner के notes: booking class शुरू होने से 7 दिन पहले खुलती है।
एक class में 20 जगहें हैं। Class भर जाने पर members waiting list में जुड़ सकते हैं।
Draft feature file:
Feature: Booking
Scenario: Test booking
Given मैं login page पर हूँ
And मैं अपना email और password डालकर "Log in" click करता हूँ
And मैं "Classes" click करके "Spinning, Monday 18:00" चुनता हूँ
When मैं "Book" click करता हूँ
Then मुझे हरा message दिखता है
When मैं "Yoga, Tuesday 09:00" के लिए "Book" click करता हूँ
Then bookings table में member 1187 की 2 rows हैं- Draft scenario की हर समस्या लिखें।
- Example map बनाएँ: rules, हर rule के लिए boundary values वाले examples, और वे सवाल जो आप पूछेंगे।
- हर business rule के लिए एक
Ruleऔर छोटे declarative scenarios के साथ feature file दोबारा लिखें। - हर step definition का Cucumber Expression लिखें और बताएँ कि कौन-से steps एक ही definition साझा करते हैं।
मॉडल उत्तर दिखाएँ
समस्याएँ: title किसी behaviour का नाम नहीं लेता; sign in, clicks और menu names imperative details हैं; दो steps कई actions को एक साथ जोड़ते हैं; When और Then के दो जोड़े दो behaviours टेस्ट करते हैं; "हरा message" कोई specific outcome नहीं है; आख़िरी Then एक database table check करता है जिसे कोई नहीं देख सकता; और न कोई rule है, न refusal, न boundary।
Example map। Rule 1: booking class शुरू होने से 7 दिन पहले खुलती है; examples: start से ठीक 7 दिन पहले booking accept, 7 दिन और 1 minute पहले booking refuse। Rule 2: class में 20 जगहें हैं; examples: 19 जगहें booked होने पर booking accept और कोई जगह नहीं बचती, 20 booked होने पर booking refuse और waiting list का विकल्प मिलता है। Rule 3: member भरी हुई class की waiting list में जुड़ सकता है; example: Sami जुड़ता है और list में number 1 है। सवाल: 7 दिन minute तक गिने जाते हैं या calendar days में? क्या member एक ही class दो बार book कर सकता है? जब कोई cancel करे, तो waiting list के पहले व्यक्ति की booking अपने-आप होती है या उसे सिर्फ़ सूचना मिलती है?
Rule 2 के लिए दोबारा लिखा गया: Feature: Class में जगह book करना। Rule: Class में 20 जगहें हैं। Scenario: आख़िरी जगह book हो सकती है, जिसमें Given class "Spinning, Monday 18:00" में 20 में से 19 जगहें booked हैं; When Sami class "Spinning, Monday 18:00" book करता है; Then booking confirm होती है; And class में 0 जगहें बची हैं। Scenario: भरी हुई class waiting list का विकल्प देती है, जिसमें Given class "Spinning, Monday 18:00" में 20 में से 20 जगहें booked हैं; When Sami class "Spinning, Monday 18:00" book करता है; Then booking refuse होती है और message आता है "यह class भर चुकी है"; And Sami को waiting list का विकल्प मिलता है। Rule 1 समय के एक पल के बारे में है, इसलिए उसकी boundary के लिए clock चाहिए: Scenario: Booking class से ठीक 7 दिन पहले खुलती है, जिसमें Given class "Yoga, Tuesday 09:00" "2026-11-10 09:00" पर शुरू होती है; And अभी का समय "2026-11-03 09:00" है; When Sami class "Yoga, Tuesday 09:00" book करता है; Then booking confirm होती है। दूसरा scenario समय "2026-11-03 08:59" रखता है और Then booking refuse होती है और message आता है "Booking class से 7 दिन पहले खुलती है" की उम्मीद करता है। Rule 3 को इसी तरह अपना Rule block मिलता है।
Cucumber Expressions के रूप में step definitions: class {string} में {int} में से {int} जगहें booked हैं; {word} class {string} book करता है; booking confirm होती है; class में {int} जगहें बची हैं; booking refuse होती है और message आता है {string}; {word} को waiting list का विकल्प मिलता है; और rule 1 के लिए class {string} {string} पर शुरू होती है और अभी का समय {string} है। Rule 2 के दोनों scenarios अलग values के साथ वही Given और When definitions reuse करते हैं, और rule 1, rule 2 की {word} class {string} book करता है, booking confirm होती है और booking refuse होती है और message आता है {string} definitions reuse करता है। Messages "यह class भर चुकी है" और "Booking class से 7 दिन पहले खुलती है" प्रस्ताव हैं जिनकी पुष्टि product owner करेगा।
अक्सर पूछे जाने वाले सवाल
क्या BDD और Gherkin में tests लिखना एक ही बात है?
नहीं। BDD collaboration है: business, development और testing के नज़रियों से concrete examples के ज़रिए behaviour खोजना, फिर उन examples को formulate और automate करना। Gherkin वह format है जिसमें examples लिखे जाते हैं। Code बन जाने के बाद testers की अकेले लिखी feature files एक extra layer वाली automated test scripts हैं: उनमें BDD की maintenance लागत तो है, पर उसका मुख्य फ़ायदा, साझा समझ, नहीं।
Step definitions कौन लिखता है?
यह team पर निर्भर है। अक्सर developers या automation engineers इन्हें लिखते हैं, कभी-कभी feature बनाते समय ही, और testers scenarios लिखते या review करते हैं और automation पर साथ काम करते हैं। ज़रूरी यह है कि scenario text business के साथ तय हो और step definitions पतली रहें, और बाकी test code वाले page objects और API clients को ही call करें।
क्या हर test Gherkin scenario होना चाहिए?
नहीं। Scenarios उस behaviour के लिए इस्तेमाल करें जिसकी business को परवाह है और जिसे वह पढ़ना चाहता है, हर rule के कुछ examples के साथ। Detailed input combinations, technical checks और ज़्यादातर negative cases Gherkin layer के बिना unit या API tests के रूप में सस्ते पड़ते हैं, test automation pyramid के अनुसार।
क्या Gherkin Arabic या Hindi में लिखा जा सकता है?
हाँ। Feature file की पहली line पर # language: header keywords को किसी दूसरी भाषा में बदल देता है, और Arabic और Hindi उपलब्ध translations में हैं। कई teams इसकी बजाय English keywords रखती हैं और step text अपनी भाषा में लिखती हैं। दोनों हालात में step definitions को step text से बिल्कुल match करना होता है, इसलिए wording एक बार तय करें और उसे reuse करें।
संदर्भ
- Gherkin Reference — Cucumberexecutable specifications के लिए Gherkin सिंटैक्स: Feature, Rule, Scenario, Given/When/Then steps, Background, Scenario Outline और Examples।
- Behaviour-Driven Development — CucumberBehaviour-Driven Development तीन अभ्यासों के रूप में — discovery, formulation और automation — जो business और technical लोगों द्वारा तय ठोस उदाहरणों पर आधारित हैं।
- ISTQB Certified Tester Foundation Level (CTFL) v4.0सॉफ़्टवेयर टेस्टिंग का फ़ाउंडेशन पाठ्यक्रम: टेस्ट स्तर और प्रकार, टेस्ट डिज़ाइन तकनीकें, टेस्ट प्रबंधन और टूल।
Mutqan tools से अभ्यास करें
किसी user story से Given/When/Then acceptance criteria और definition-of-done चेकलिस्ट जनरेट करें।
किसी user story से end-to-end टेस्ट सिनेरियो निकालें, वैकल्पिक और अपवाद flow सहित।
संख्यात्मक और लंबाई की constraints के लिए boundary value (min-1, min, min+1, nominal, max-1, max, max+1) जनरेट करें।
conditions और actions से decision table बनाएँ, सभी rule संयोजन जनरेट करें और असंभव संयोजनों को समेट दें।
रेगुलर एक्सप्रेशन को लाइव टेस्ट करें — मैच हाइलाइटिंग, कैप्चर ग्रुप और रिप्लेस प्रीव्यू के साथ।
और गहराई से
इस topic में आपकी प्रगति
प्रगति ट्रैक करने के लिए साइन इन करें
Topics पूर्ण चिह्नित करें, जहाँ छोड़ा था वहीं से जारी रखें और specialisation परीक्षाएँ खोलें।