ה-Cucumber הינו פריימוורק אוטומציה המממש את שיטת ה-BDD, או בהרחבה ה-Behavior Driven Development.

זהו פריימוורק שנכתב במקורו בשפת Ruby וכותבים איתו כיום במגוון של שפות תכנות, ה-Cucumber הוא המקביל ל-SpecFlow שחי בעולם ה-NET.

אך לפני שנצלול אל נבכי הפריימוורק והקוד, בואו נבין קודם כל מה זה בכלל אומר Behavior Driven Development ?

ה-BDD הינה מתודולוגיה של פיתוח שהגיעה בעקבות תהליך אחר שנקרא – TDD (שזה אומר – Test Driven Development): תהליך שחי בעולם ה-Agile (פיתוח תוכנה זריז עם מחזורים קצרים של פיתוח ובדיקות) בעיקר, בו כותבים את הטסטים לפני שכותבים את קוד המוצר.

הרעיון המרכזי של מתודולוגיית ה-BDD הינו להגדיר בדיקות \ פעולות במוצר על ידי תהליכים עסקיים שנכתבים על ידי מנהלי פרוייקטים \ מנהלי מוצר \ אנליסטים \ אנשי מכירות \ אנשי בדיקות \ או כל סוג של מנהלים מי יותר ומי פחות בעל יכולות טכניות.

 

למעשה ה-BDD בא לשפר את התקשורת בין קבוצות שונות באירגון שאחראיות לשחרר את המוצר ללקוח על הצד הטוב ביותר, ע"י מתודולוגיה זו אותם מנהלי פרוייקט למשל יכולים לוודא כי כל תהליך עסקי במוצר מכוסה ע"י צוות הפיתוח וצוות הבדיקות.

בעולם ה-BDD, דוגמאות שמייצגות תהליכים עסקיים נקראים – Scenarios (מושג שמוכר לנו אנשי הבדיקות הרבה יותר), ה-Scenarios נכתבים בשפה עם פורמט מיוחד שנקרא: Gherkin (באנגלית זהו מלפפון חמוץ, שהגיע כקונטרה ל-Cucumber).

ה-Scenarios באים לתאר התנהגות של פיצ'ר מסויים במוצר במצבים מסויימים ובהינתן רשימה של פרמטרים שונים. תיאור זה נקרא גם: Specification

ה-BDD, שנכתב ע"י Dan North מגיע כ-FollowUp של בדיקות היחידה (Unit Testing) ומודל ה-AAA שמייצג: Arrange, Act, Assert

שפת ה-Gherkin שהיא שלמעשה היא סוג של DSL, ואותה הזכרתי מקודם, בנויה ממילים שמורות כמו:

Given – מתאר סיטואציה בהינתן של מצב מסויים

When – מתאר מצב שבו אני עושה פעולה מסויימת

Then – מתאר את התנהגות המערכת שבאה בעקבות אותה פעולה שהגדרתי תחת ה-When

And – מילת קישור בה אשתמש כשארצה לשרשר כמה פעולות

But – מילת השלילה אשר ניתן בה לבדוק אי קיום של תנאים

דוגמא לכתיבת Scenario שבודק מכונה אוטומטית למכירת קפה:

Feature: Serve coffee

Coffee should not be served until paid for

Coffee should not be served until the button has been pressed

If there is no coffee left then money should be refunded

Scenario: Buy last coffee

Given there are 1 coffees left in the machine

And I have deposited 1$

When I press the coffee button

Then I should be served a coffee

 

כשעובדים עם BDD ישנם עוד כמה מושגים שאנחנו צריכים להכיר:

FeatureFile – אותו מסמך Spec שבא לתאר את התנהגות המערכת, בקובץ זה אנו נכתוב את שפת ה-Gherkin עם ה-Feature, עם ה-Scenarios ועם המילים השמורות הכתובות מעלה.

Step Definitions – מחלקה או אוסף של מחלקות בהן אנו מתרגמים את שפת ה-Gherkin לשפה הקוד שקוראות לפעולות האוטומטיות על המוצר הנבדק

 

יופי, הבנו מה זה BDD, איך ה-Cucumber נכנס כאן לתמונה ?

כפי שכתבתי בתחילת הפוסט, ה-Cucumber הינו פריימוורק אוטומציה שמממש את מתודולוגיית ה-BDD, בואו קודם נראה כיצד מתקינים את הפריימוורק.

תחילה נצטרך להוריד ולהתקין אותו דרך הורדת ה-dependencies ב-Maven:

 

כך בניתי את הפרוייקט, שימו לב ליצרית ספריית ה-resources שם יצרתי את ה- FeatureFiles , ה-StepDefinitions וה-runners שנדבר עליהם עוד מעט

 

במקרה הבדיקה שלנו, ניכנס לאתר של וויקיפדיה , נזין בחיפוש שלנו את הערך "Selenium WebDriver"

 

ונוודא כי אין תוצאות חיפוש לערך זה

 

אז ה-Feature File יהיה כתוב כך:

@RegressionTests
Scenario: WikiSearch
Given user is on wikipedia page
When user search for "Selenium WebDriver"
Then user can not find Reference

וה-StepDefinitions אממש כך:

@Given("user is on wikipedia page")
public void userWikiPage()
{
	session();
	driver.get("http://wikipedia.org");
}

@When("user search for \"([^\"]*)")
public void userSearch(String searchVlue)
{
	session();
	driver.findElement(By.id("searchInput")).sendKeys(searchVlue);
	driver.findElement(By.xpath("//*[@id=\"search-form\"]/fieldset/button")).click();
}

@Then("user can not find Reference")
public void userNoFindReference()
{
	session();
	assertTrue(driver.findElement(By.className("mw-search-createlink")).getText().contains("does not exist"));	
	driver.quit();
}

מחלקה זו יורשת ממחלקה אחרת – baseSteps שם הגדרתי את ה-דרייבר ואת איתחולו תחת פונקציית Session :

public class baseSteps
{
	static WebDriver driver;
	static boolean initFlag = false;

	public void session()
	{
		if(!initFlag)
		{
			System.setProperty("webdriver.chrome.driver", "C:/Projects/Drivers/chromedriver.exe"); 
			driver = new ChromeDriver(); 
			driver.manage().window().maximize();
			driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
			initFlag = true;
		}
	}
}

 

עבודה עם Cucumber ו-BDD מכילה עוד המון נושאים שלא אכסה אותם בפוסט זה (בכל זאת, זהו רק מבוא), כמו:

Tags, Data Tables, Arguments, Scenario Outline, Hook Methods, Dependency Injection ….

לכל אחד מהנושאים הללו יש מספיק חומרים באינטרנט שתוכלו לחקור, להבין ולהתנסות

בהצלחה

 

השאר הערה\הודעה