«خیار ریز» را پاس بداریم

تاریخ انتشار نسخه اصلی 19 دسامبر, 2016در پست قبلی در مورد روش BDD در توسعه نرم افزار و علت به وجود آمدنش نوشتم. اینکه این روش دنبال کننده روش TDD است و به زبانی برای مستند سازی مجهز است که افراد مرتبط به یک پروژه نرم افزاری شامل مشتری، مدیر نرم افزار، برنامه نویس و تست کننده میتوانند به وسیله آن با یکدیگرارتباط داشته باشند. زبانی که میبایست از یک سو اصطلاحات یک حوزه کسب و کار بتوان در آن استفاده کرد و هم آنقدر ساده و منطقی باشد که بتوان آن را براحتی تبدیل به کد برنامه نویسی کرد. در این پست به معرفی Gherkin و SpecFlow به عنوان ابزارهای لازم برای پیاده سازی این روش در dotNet میپدازیم. اولین گروهی که به طور گسترده به پیاده سازی روش BDD و مستندسازی آن همت کردند، تیمی از برنامه نویسان Ruby بودند. آنها ابتدا Cucumber (خیار) و Gherkin (خیار ریز) را به ترتیب عنوان framework و زبان ارتباطی فراگیر(ubiquitous language) معرفی و سپس مشابه Cubumber را برای زبانهای دیگر پیاده سازی کردند:این framework ها امکان آن را میدهند که سناریوهای تست که به زبان Gherkin نوشته و در فایلهایی بنام feature ذخیره شده اند را به صورت binding با کد تست یا step definition که میتواند به زبانهای مختلف باشد، پیوند زد و به وسیله Test Runner ها اجرا کرد.در Gherkin برای نوشتن سناریوهای تست، کلید واژهایی است که در ابتدای هر جمله میایند و سپس آن جمله را میتوان به یک function در کد تست bind کرد. علاوه بر این، پارامترهای تست را نیز میتوان از طریق این جملات به کد تست منتقل کرد. در زیر نمونه یک feature فایل شامل دو سناریو برای امکان login را مشاهده میکنید:Feature: LogIn_Feature In order to access my account As a user of the website I want to log into the website Scenario: Successful Login with Valid Credentials Given User is at the Home Page And Navigate to LogIn Page When User enter and And Click on the LogIn button Then Successful LogIN message should display Examples: | username | password | | testuser_1 | Test@123 | | testuser_2 | Test@153 | Scenario: Successful LogOut When User LogOut from the Application Then Successful LogOut message should displayدر SpecFlow که پیاده سازی Cucumber برای dotNet است، این feature فایل را میتوان به صورت اتوماتیک به فایل step definition تبدیل کرد و سپس در هر کدام از function های تولید شده، کد تست که در اینجا Selenium است را اضافه کرد.namespace SpecFlowDemo.Steps { [Binding] public class LogIn_Steps { public IWebDriver driver; [Given(@&quotUser is at the Home Page&quot)] public void GivenUserIsAtTheHomePage() { driver = new FirefoxDriver(); driver.Url = &quothttp://www.store.demoqa.com&quot } [Given(@&quotNavigate to LogIn Page&quot)] public void GivenNavigateToLogInPage() { driver.FindElement(By.XPath(&quot.//*[@id='account']/a&quot)).Click(); } [When(@&quotUser enter (.*) and (.*)&quot)] public void WhenUserEnterAnd(string username, string password) { driver.FindElement(By.Id(&quotlog&quot)).SendKeys(username); driver.FindElement(By.Id(&quotpwd&quot)).SendKeys(password); } [When(@&quotClick on the LogIn button&quot)] public void WhenClickOnTheLogInButton() { driver.FindElement(By.Id(&quotlogin&quot)).Click(); } [When(@&quotUser LogOut from the Application&quot)] public void WhenUserLogOutFromTheApplication() { ScenarioContext.Current.Pending(); } [Then(@&quotSuccessful LogIN message should display&quot)] public void ThenSuccessfulLogINMessageShouldDisplay() { //This Checks that if the LogOut button is displayed true.Equals(driver.FindElement(By.XPath(&quot.//*[@id='account_logout']/a&quot)).Displayed); } [Then(@&quotSuccessful LogOut message should display&quot)] public void ThenSuccessfulLogOutMessageShouldDisplay() { ScenarioContext.Current.Pending(); } } }همانطور که مشاهده میکنید feature فایل که به زبان Gherkin نوشته شده است میتواند محلی باشد برای بحث، تصمیم گیری و مستند سازی نیازمندیهای مشتری. فایلی که میتواند مورد استفاده برنامه نویس و تست کننده هم قرار گیرد و به این صورت از دوباره کاری جلوگیری شود. امروزه استفاده از BDD در شیوه های Agile رو به گسترش است و این را میتوان از گسترش Cucumber برای زبانهای مختلف، قوی تر شدن فروم های آن و نیاز به آن در آگهی های شغلی متوجه شد.