ה-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 ….
לכל אחד מהנושאים הללו יש מספיק חומרים באינטרנט שתוכלו לחקור, להבין ולהתנסות
בהצלחה