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

זהו פריימוורק שנכתב בשפת #C ועובדים איתו לרוב כהרחבה ל-Visual Studio, ה-SpecFlow הוא המקביל ל-Cucumber שחי בעולם ה-Java.

אך לפני שנצלול אל נבכי הפריימוורק והקוד, בואו נבין קודם כל מה זה בכלל אומר 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, איך ה-SpecFlow נכנס כאן לתמונה ?

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

תחילה נצטרך להוריד ולהתקין Extension ב-VS של SpecFlow:

 

אח"כ נכנס לNuget Package Manager ונתקין משם SpecFlow:

 

ניצור פרוייקט חדש ונבחר את הקבצים Feature File , Step Definition

 

כעת נוכל להתחיל לכתוב Scenarios ב-Feature File.

הדוגמא שבחרתי להראות לכם היא דווקא פחות פופולרית ממה שתראו בכל שאר המדריכים באינטרנט, וזה בכדי להראות לכם ש-SpecFlow זהו פריימוורק עוטף לאוטומציה בכלל ולא רק לסלניום \ אפיום שכולם כבר מכירים. בחרתי בדוגמא זו להשתמש ב-WinAppDriver כמנוע ולבצע בדיקה על אפליקצית Desktop בשם StikyNotes שיש לכל מערכת הפעלה windows 10.

כך בניתי את הפרוייקט, שימו לב לחלוקת הספריות של FeatureFiles ו-StepDefinitions

 

הבדיקה עצמה מאוד פשוטה, אותה ניתן לראות כאן בתוך ה-Feature File:

@mytag

Scenario: StickyNotes

Given I Go To Menu

When I Click on All Notes

Then The search field should be displayed

 

כך ה-StepDefinitions יראה בו אנו ממשים את ה Feature File לפעולות של ה-WinAppDriver:

[Binding]
public sealed class StepDefinition1 : Base
{
	[Given(@"I Go To Menu")]
	public void ClickElementContent()
	{
		initExecution();
		driver.FindElementByAccessibilityId("ContentElement").Click();
		driver.FindElementByAccessibilityId("NoteMenuButton").Click();
                ScenarioContext.Current.Pending();
	}

	[When(@"I Click on All Notes")]
	public void IClickonAllNotes()
	{
		driver.FindElementByAccessibilityId("NotesListText").Click();
		ScenarioContext.Current.Pending();
	}

	[Then(@"The search field should be displayed")]
	public void SeachFieldSHouldBeDisplayed()
	{
		Assert.True(driver.FindElementByAccessibilityId("TextBox").Displayed);
		ScenarioContext.Current.Pending();
	}
}

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

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

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

בהצלחה

 

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