Behaviour Driven Development - BDD

Behaviour Driven Development (BDD)

1. Kaynaklar

2. BDD Nedir?

BDD = Behavioral Driven Development

Teknik ve teknik olmayan kişiler(müşteri, iş analisti, yazılımcı) arasında ortak bir dil ile iletişim kurulması amaçlanır. 2009 yılında ortaya çıkmıştır. Aşağıdaki resimde de görüldüğü gibi TDD yaklaşımı üzerine basit syntax yapıları ile olayların tanımlandığı bir katman olarak düşünülebilir. TDD yaklaşımındaki gibi öncelikle test olayları yazılır, daha sonra programlama dili ile olaylar kodlanır.

BDD yaklaşımı; Unit Test, System Test, UI Test gibi farklı test seviyelerinde kullanılabilir.

BDD Avantajları

  • Yazılımcı, test developer, iş analisti vb. arasında iletişimi güçlendirir.

  • Gherkin isminde basit bir dil kullanıldığı için öğrenilmesi kolaydır.

  • Programlama dili ile kod yazılmadan önce davranışlar yazıldığı için, geriye dönük dökümantasyon açısından yararlıdır. Davranışlarda değişiklik olduğunda testler çalışmaz, kodun düzeltilmesi gerekir.

  • Öncelik programlama dili ile yazılan test kodu değil, Gherkin ile yazılan davranışlardır.

3. Gherkin Nedir?

Gherkin, BDD yaklaşımının uygulanabilmesi için bir yazım standardıdır. İş davranışlarını programlama dillerindeki gibi ayrıntılara girmeden basit, sade tanımlamanıza yardımcı olur. Yazılanlar ile otomatik testlerinizin dökümantasyonunun oluşturulması ve iskeletinin oluşturulması sağlanır.

70 adet dil desteği vardır. (Türkçe desteği de var.)

Aşağıda müşteri, yazılımcı ve iş analisti arasında geçen bir diyalog gösterilmiştir. 2. resimde Gherkin dili ile üçünün ortak bir dilden konuştuğu görülmüştür.

4. BDD Tool'ları Nelerdir? (SpecFlow Nedir?)

BDD yaklaşımını uygulayabilmek için bir tool seçmeniz gerekir. Araç sayesinde Gherkin dili ile yazılan kodlar C#, Java, Ruby vb. programlama diline dönüştürülür.

BDD tool'larından ilk geliştirileni ve en çok bilineni open source olan Cucumber'dir. Resmi olarak Java, Ruby, JS desteği bulunmaktadır. C#, Php, Go, Python gibi dillerde desteği bulunmadığı için farklı topluluklar/firmalar tarafından tool'lar geliştirilmiştir. SpecFlow, İsviçreli bir firma tarafından C# dili ile BDD yaklaşımını kullanabilmek için geliştirilmiş tool'dur. SpecFlow(open source) ve SpecFlow+(ücretli) olarak iki ürünü bulunmaktadır. SpecFlow+'da excelden veri okuma, gelişmiş raporlama gibi özellikler bulunmaktadır.

Farklı platformlar ve programlama dilleri için çeşitli BDD Araçları kullanılmaktadır. BDD yaklaşımında kullanılan tool'ların listesi aşağıdadır;

5. SpecFlow Kurulum

-VS Extension

  • SpecFlow for Visual Studio 2019

- NuGet Packages (SpecFlow için):

  • Specflow

  • Specflow Nunit

  • Specflow MsBuild.Generation (Kurulmazsa .feature dosyasını .cs 'ye çeviremediği için hata veriyor.)

- NuGet Packages (Selenium kullanılacak ise):

  • Selenium

  • Selenium Support

  • Selenium Chrome

- NuGet Packages (Diğer):

  • FluentAssertion

6. Gherkin Dili Kullanımı

  • Birim testlerinde kullanılan Arrange/Act/Assert (AAA) yöntemi; Gherkin'de Given/When/Then (GWT) yöntemi kullanılır.

  • Her satır anahtar kelime ile başlar ve bir test adımını gösterir.

  • Dosya uzantıları .feature dır.

Örnek Gherkin Yazımı

Feature: LoginTest
    FooBar tests successful login with username and password on login page.

@login
Scenario: FooBar Login Test
    Given I have navigate to FooBar
    And I have entered <userName>  and <password> into the login screen
    When I press login button
    Then the result should be see navMenu

Examples: 
| userName | password |
| admin    | admin    |

Örnek: Generate edilmiş hali (C#)

using FluentAssertions;
using System.Threading;
using TechTalk.SpecFlow;

namespace SpecFlow
{
    [Binding]
    public class SpecFlowFeature1Steps : Base
    {
        [Given(@"I have navigate to FooBar")]
        public void GivenIHaveNavigateToFooBar()
        {
            driver = GetWebDriver();
            driver.Navigate().GoToUrl("http://foo.domain.local" + "/Account/LogOn?ReturnUrl=%2f");
        }

        [Given(@"I have entered (.*)  and (.*) into the login screen")]
        public void GivenIHaveEnteredAndIntoTheLoginScreen(string p0, string p1)
        {
            GetElementById("LoginName").SendKeys(p0);
            GetElementById("UserPassword").SendKeys(p1);
        }

        [When(@"I press login button")]
        public void WhenIPressLoginButton()
        {
            ClickElement(GetButtonElementBeClickableById("btnLogOn"));
        }

        [Then(@"the result should be see navMenu")]
        public void ThenTheResultShouldBeSeeNavMenu()
        {
            GetElementById("LeftPanel.Administration").Text.Should().Contain("Administration");
        }
    }
}

Gherkin'de Kullanılan Önemli Terimler

  • Feature

  • Background

  • Scenario

  • Given

  • When

  • Then

  • And

  • But

  • Scenario Outline Examples

Given

Sistemin hazır hale getirildiği aşamadır.

When

Eylemin gerçekleştirildiği aşamadır.

Then

İşlem sonucunun incelendiği aşamadır.

@Tag

Testleri kategorilere ayırmak için kullanılır. (NUnit'deki Category gibi düşünülebilir)

Önemli Konular

Paralel Çalıştırma

AssemblyInfo.cs içerisinde aşağıdaki tanımlama yapılarak paralel çalışacak test sayısı yazılır.

[assembly: Parallelizable(ParallelScope.Fixtures)]
[assembly: LevelOfParallelism(4)]

Hook Attributes

[BeforeTestRun] [AfterTestRun]

Tüm testler çalıştırılmadan önce ve çalıştırıldıktan sonra(NUnit [OneTimeSetUp],[OneTimeTearDown] gibi düşünülebilir)

[BeforeFeature] [AfterFeature]

Her feature çalıştırılmadan önce/sonra çalıştırılması (NUnit [SetUp], [TearDown] gibi düşünülebilir)

[BeforeScenario] or [Before] / [AfterScenario] or [After]

Her scenario çalıştırılmadan önce/sonra çalıştırılması

[BeforeStep] [AfterStep]

Her scenario adımının yürütülmesinden önce / sonra çalıştırılması

Last updated