35
Behat ve mink İle Davraniş odaklı Gelİştİrme Mustafa İLERİ Mayıs'14 PHP - IST

Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Embed Size (px)

DESCRIPTION

Davranis odakli gelistirmeye giris ve BDD testlerinin Behat ve Mink kullanilarak gelistirilmesi. BDD testlerinin cevik yazilim gelistirme metodolojilerindeki yeri.

Citation preview

Page 1: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Behat ve mink İle Davraniş odaklı

Gelİştİrme

Mustafa İLERİMayıs'14 PHP - IST

Page 3: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Behavior Driven

Development

Davranıs odaklı gelistirme, test odaklı gelistirmeye dayanarak ortaya çıkmıs bir yaılım gelistime sürecidir.

Dan North tarafından ortaya atıldı.

Amaç : Senaryoların önceden belirlenerek bunlara göre gelistirme yapmak.

Page 4: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

NASIL ORTAYA ÇIKTI ?

TDD gibi çevik yöntemler kullanan Dan North, hep aynı sorunlar ve yanlıs anlamalarla karsılasıyor.

Gelistiriciler tarafında problem olan ve cevap bekleyen sorular:

1. Nereden başlamalıyım?2. Neyi test etmeli veya neyi test etmemeliyim?3. Testleri nasıl adlandırmalıyım?...

Page 5: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

public class CustomerLookupTest extends TestCase { testFindsCustomerById() { ... } testFailsForDuplicateCustomers() { ... } ...}

CustomerLookup- finds customer by id- fails for duplicate customers- ...

TDD Testİ BDD Testİ

Kurgulanan İlk BDD TESTİ

Herşey Chris Stevenson'ın yadığı, yanıltıcı derecede basit jUnit testini daha anlasılır daha kısa hale getirmek ile basladı.

Page 6: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Test Odaklı Gelİştİrme

Birim Testler:Her bir birim için yapması gereken isi doğrulayan testler olmalı.

Entegrasyon Testleri:Parçalar birbirleri ile düzgün çalısabiliyor mu?...Genelde gelistirici tarafından gelistirme asamasındakoda yönelik testler yaılır.

BDD VS TDD

Page 7: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

BDD VS TDDDavranış Odaklı GELİŞTİRME

Fonksiyonel Testler:Uyulama üzerinde yer alan bilesenler doğru isi yapıyor mu?

Kullanıcı KabulTestleri:Uygulama ve bilesenler belirlenen kriterlere göre uygun ve düzgün çalısıyor mu?...Genelde is sahibi ve analistler tarafından anali sırasında davranısa yönelik testler yaılır.

Page 8: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

BDD VS TDD

Page 9: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

BDD testlerİ yazılıM ürünlerİnİzİn son kullanıcı ve kullanıcı kabul

testlerİ İçİn HARCANAN zamanı önemlİ ölçüde azaltır.

BDD testlerİ yazılıM ürünlerİnİzİn son kullanıcı ve kullanıcı kabul

testlerİ İçİn HARCANAN zamanı önemlİ ölçüde azaltır.

Page 10: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

BDD TESTLERİ Yenİ ÖzellİKlerİN analİZlerİNİN ve Yazılımın

sorumluluklarının daha net BİR şekİLDE GELİŞTİRİCİYE BİldİrİlmesİNİ SAĞLAR

BDD TESTLERİ Yenİ ÖzellİKlerİN analİZlerİNİN ve Yazılımın

sorumluluklarının daha net BİR şekİLDE GELİŞTİRİCİYE BİldİrİlmesİNİ SAĞLAR.

Page 11: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

ÇALIŞAN UYGULAMALAR GELİŞTİRİRSİNİZ VE GELİŞTİRDİĞİNİZ UYGULAMALARIN SÜRDÜRÜLEBİLİRLİĞİNDENEMİN OLURSUNUZ.

ÇALIŞAN UYGULAMALAR GELİŞTİRİRSİNİZ VE GELİŞTİRDİĞİNİZ UYGULAMALARIN SÜRDÜRÜLEBİLİRLİĞİNDENEMİN OLURSUNUZ.

Page 12: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

DÖKÜMANTASYONGELİŞTİRİLEN UYGULAMANIN DÖKÜMANTASYONUNUN SÜREKLİ GÜNCEL TUTULMASINI SAĞLAR.Testler normal İnsanların okuyabileceğİ şekİldedİr.

Page 13: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

BDD TERMİNOLOJİLERİ

Story: Olusan veya olusması muhtemel durumu bildirir.Scenario: Olusan veya olusması muhtemel durumlar için senaryoları bildirir.Role: Verilen senaryoyu hangi rolle gerçeklestireceğimii belirtir.

Page 14: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

ScrumHızlı Bakış

Page 15: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Yaılım Mühendisliği'nde bir uygulama gelistirme yöntemidir. Bu gelistirme yönteminin temel özelliği gözlemci, gelistirmeci ve tekrara dayalı olmasıdır.

Scrum Ken Schwaber ve Jef Sutherland tarafından 1990'ların başında gelistirildi ve temel fkirleri Schwaber (Schwaber 2004) tarafından ortaya konmustur.

SCRUM' A HIZLI BAKIŞ

Scrum MasterÜrün SahibiTakım* Kullanıcı* Yönetici

ROLLER toplantilarSprint Planlama ToplantılarıGünlük ScrumSprint DeğerlendirmesiRetropektif

Hikayeler belirlenir, davranıssal testler ile yaılım ekibine iletilir.

Davranıssal testler çalıstırılarak,Yayına alınmaya haır hikayeler belirlenir

Page 16: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

As a <role>,I want <something>So that <benefit>

Page 17: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

ProductOwner

DevelopmentTeam

ProductBacklog

SprintBacklog

ProductH

ikay

eleri

ve d

avra

nıss

al te

stler

i olu

sturu

r

Takım tarafından belirleniyor.

Gelis

tirm

eyi y

apar

Testleri çalıstırarak ürünün uygulnluğunu test eder

1

2

3

4

Page 18: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

GHERKINGHERKINHerkes tarafından anlasılabilen ve yaılabilen test ayırıstırıcısı.

Page 19: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Feature: Some terse yet descriptive text of what is desiredTextual description of the business value of this featureBusiness rules that govern the scope of the featureAny additional information that will make the feature easier to understand

Scenario: Some determinable business situationGiven some preconditionAnd some other preconditionWhen some action by the actorAnd some other actionAnd yet another actionThen some testable outcome is achievedAnd something else we can check happens too

Scenario: A different situation...

Page 20: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Cucumber(Ruby)

jbehave(java)

nbehave(c#)

specflow(c#)

freshen(python)

lettuce(python)

BEHAT(PHP)

Page 21: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

İs gelistirmenin beklentilerini test etmeye yarayan bir PHP çatısıdır.Konstantin Kudryashov tarafından gelistirildi.En güncel sürümü 3.0

BEHAT Nedİr?

{ "require": { "behat/behat": "2.4.*@stable" },

"config": { "bin-dir": "bin/" }}

KURULUM kullanımbin/behat –initvim features/your_first.feature-------------------------------------------

Feature: Your first feature In order to start using Behat As a manager or developer I need to try

Scenario: Successfully describing scenario Given there is something When I do something Then I should see something-------------------------------------------bin/behat

Page 22: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Test Projesi Olusturmak

Behat'ı yükledikten sonra test diini olusturulup test projesi için gerekli kod alt yapısı olusturulur.

cd ls_projectapp/behat –-init

+d features - place your *.feature files here+d features/bootstrap - place your context classes here+f features/bootstrap/FeatureContext.php - place your definitions, transformations and hooks here

Page 23: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Özellik Tanımlama(Feature)

Behat'ta istenilen özellik önce tanımlanır ve belirtilir sonrasında bu tanımlamaya göre implemente edilir.

# features/ls.featureFeature: ls In order to see the directory structure As a UNIX user I need to be able to list the current directory's contents

Page 24: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Senaryo Tanımlama(Scenario)

Bir sonraki adım, belirtilen özelliklerin senaryoları belirlenir.

Scenario: List 2 files in a directory Given I am in a directory "test" And I have a file named "foo" And I have a file named "bar" When I run "ls" Then I should get: """ bar foo """

Step Defnitions

Diyelim ki

Eğer kiO zaman

Page 25: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Adım Tanımları(Step Defnitons)

Senaryoda bulunan beklentileri anlatan anlamli cümleler ve bunların yapacağı isin tanımı.

1 scenario (1 undefined)5 steps (5 undefined)0m0.02s (9.55Mb)--- FeatureContext has missing steps. Define them with these snippets: /** * @Given I am in a directory :arg1 */ public function iAmInADirectory($arg1) { throw new PendingException(); }

/** * @Given I have a file named :arg1 */ public function iHaveAFileNamed($arg1) { throw new PendingException(); }

/** * @When I run :arg1 */ public function iRun($arg1) { throw new PendingException(); }

/** * @Then I should get: */ public function iShouldGet(PyStringNode $string) { throw new PendingException(); }

Page 26: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

<?php

use Behat\Behat\Context\BehatContext;use Behat\Gherkin\Node\PyStringNode;

class FeatureContext extends BehatContext{ private $output;

/** @Given /^I am in a directory "([^"]*)"$/ */ public function iAmInADirectory($dir) { if (!file_exists($dir)) { mkdir($dir); } chdir($dir); }

/** @Given /^I have a file named "([^"]*)"$/ */ public function iHaveAFileNamed($file) { touch($file); }

/** @When /^I run "([^"]*)"$/ */ public function iRun($command) { exec($command, $output); $this->output = trim(implode("\n", $output)); }

/** @Then /^I should get:$/ */ public function iShouldGet(PyStringNode $string) { if ((string) $string !== $this->output) { throw new Exception( "Actual output is:\n" . $this->output ); } }}

Page 27: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

MINKMINKPHP 5.3+ üzerinde çalısan web

uygulamalrı için kullanıcı kabul test çatısıdır.

Page 28: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Kurulum ve Hizli Konfİgürasyon{ "require": { "behat/behat": "2.4.*@stable", "behat/mink": "1.4.*@stable", "behat/mink-extension": "*", "behat/mink-goutte-driver": "*", "behat/mink-selenium2-driver": "*" }, "minimum-stability": "dev", "config": { "bin-dir": "bin/" }}

use Behat\MinkExtension\Context\MinkContext;

class FeatureContext extends MinkContext{

......

Page 29: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Mink Hazır Adım tanımlamalarıGiven /^(?:|I )am on (?:|the )homepage$/ When /^(?:|I )go to (?:|the )homepage$/Given /^(?:|I )am on "(?P<page>[^"]+)"$/ When /^(?:|I )go to "(?P<page>[^"]+)"$/ When /^(?:|I )reload the page$/ When /^(?:|I )move backward one page$/ When /^(?:|I )move forward one page$/ When /^(?:|I )press "(?P<button>(?:[^"]|\\")*)"$/ When /^(?:|I )follow "(?P<link>(?:[^"]|\\")*)"$/ When /^(?:|I )fill in "(?P<field>(?:[^"]|\\")*)" with "(?P<value>(?:[^"]|\\")*)"$/ When /^(?:|I )fill in "(?P<field>(?:[^"]|\\")*)" with:$/ When /^(?:|I )fill in "(?P<value>(?:[^"]|\\")*)" for "(?P<field>(?:[^"]|\\")*)"$/ When /^(?:|I )fill in the following:$/ When /^(?:|I )select "(?P<option>(?:[^"]|\\")*)" from "(?P<select>(?:[^"]|\\")*)"$/ When /^(?:|I )additionally select "(?P<option>(?:[^"]|\\")*)" from "(?P<select>(?:[^"]|\\")*)"$/ When /^(?:|I )check "(?P<option>(?:[^"]|\\")*)"$/ When /^(?:|I )uncheck "(?P<option>(?:[^"]|\\")*)"$/ When /^(?:|I )attach the file "(?P[^"]*)" to "(?P<field>(?:[^"]|\\")*)"$/ Then /^(?:|I )should be on "(?P<page>[^"]+)"$/ Then /^(?:|I )should be on (?:|the )homepage$/ Then /^the (?i)url(?-i) should match (?P<pattern>"([^"]|\\")*")$/ Then /^the response status code should be (?P<code>\d+)$/ Then /^the response status code should not be (?P<code>\d+)$/ Then /^(?:|I )should see "(?P<text>(?:[^"]|\\")*)"$/ Then /^(?:|I )should not see "(?P<text>(?:[^"]|\\")*)"$/ Then /^(?:|I )should see text matching (?P<pattern>"(?:[^"]|\\")*")$/

Page 30: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Mink Hazır Adım tanımlamaları Then /^(?:|I )should not see text matching (?P<pattern>"(?:[^"]|\\")*")$/ Then /^the response should contain "(?P<text>(?:[^"]|\\")*)"$/ Then /^the response should not contain "(?P<text>(?:[^"]|\\")*)"$/ Then /^(?:|I )should see "(?P<text>(?:[^"]|\\")*)" in the "(?P<element>[^"]*)" element$/ Then /^(?:|I )should not see "(?P<text>(?:[^"]|\\")*)" in the "(?P<element>[^"]*)" element$/ Then /^the "(?P<element>[^"]*)" element should contain "(?P<value>(?:[^"]|\\")*)"$/ Then /^the "(?P<element>[^"]*)" element should not contain "(?P<value>(?:[^"]|\\")*)"$/ Then /^(?:|I )should see an? "(?P<element>[^"]*)" element$/ Then /^(?:|I )should not see an? "(?P<element>[^"]*)" element$/ Then /^the "(?P<field>(?:[^"]|\\")*)" field should contain "(?P<value>(?:[^"]|\\")*)"$/ Then /^the "(?P<field>(?:[^"]|\\")*)" field should not contain "(?P<value>(?:[^"]|\\")*)"$/ Then /^the "(?P<checkbox>(?:[^"]|\\")*)" checkbox should be checked$/ Then /^the checkbox "(?P<checkbox>(?:[^"]|\\")*)" (?:is|should be) checked$/ Then /^the "(?P<checkbox>(?:[^"]|\\")*)" checkbox should not be checked$/ Then /^the checkbox "(?P<checkbox>(?:[^"]|\\")*)" should (?:be unchecked|not be checked)$/ Then /^the checkbox "(?P<checkbox>(?:[^"]|\\")*)" is (?:unchecked|not checked)$/ Then /^(?:|I )should see (?P<num>\d+) "(?P<element>[^"]*)" elements?$/ Then /^print current URL$/ Then /^print last response$/ Then /^show last response$/

Page 31: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Örnek UygulamaFeature: php-ist 2014 etkinlik bilgilerini kontrol eder Bu test etkinligin tarih yer ve konusmaci bilgilerini kontrol eder.

Background: Given I am on homepage

Scenario: Etkinligin "3rd May 2014" tarihinde olup olmadigini kontrol edelim. Then I should see "3rd May 2014"

Scenario: Konusmacilari test edelim. Then I follow "Speakers" Then I should see "Mehmet Karcı" Then I should see "Osman Üngür" Then I should see "Hugo Hamon" Then I should see "Mustafa İleri" Then I should see "Lemi Orhan Ergin" Then I should see "Ramazan Korkmaz" Then I should see "Hugo Hamon" Then I should see "Alvaro Videla" Then I should see "Suat İmamoğlu" Then I should not see "Fatih Gürsoy"

@javascript Scenario: Google sayfa testi Then I search on google with "php ist" Then I should see "php-ist PHP Conference 2014"

@javascript Scenario: Mekan kisminda google maps haritasini kontrol edelim Then check maps on venue

Page 32: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Örnek Uygulama<?phpuse Behat\MinkExtension\Context\MinkContext;

class FeatureContext extends MinkContext{ /** * @Then /^I search on google with "([^"]*)"$/ */ public function iSearchOnGoogleWith($arg1) { $this->getSession()->visit('http://www.google.com.tr'); $page = $this->getSession()->getPage(); $page->find('css', 'input[type=text]')->setValue($arg1); $page->find('css', 'button')->click(); $this->getSession()->wait(500); }

/** * @Then /^check maps on venue$/ */ public function checkMapsOnVenue() { $page = $this->getSession()->getPage(); $page->findLink('Venue')->click(); $this->assertElementOnPage(

'html body div div#schedule.section section#venue.section div.inner div.content div#map_canvas div.gm-style');

}

}

Page 33: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Örnek Uygulamalar

https://github.com/phpistorg/behat-testleri

https://github.com/phpistorg/behat-mink-testleri

Page 34: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Jıra EklentİSİJira eklentisi, BDD testlerinin uygun formatta yaılarak bu testlerin gelistiriciye is olarak gelmesini sağlar.

Eğer testler basarılı olursa is cozulerek kapatılır.Aksi durumda basarısız olma nedeni isin içine yaılır.

http://etensions.behat.org/jira-etension/

Page 35: Davranis Odakli Gelistirmeye Giris, Behat ve Mink

Kaynakça

http://dannorth.net/introducing-bdd/http://en.wikipedia.org/wiki/Behavior-driven_developmenthttp://behat.org/http://www.slideshare.net/mhelmich/t3con13?qid=bf6b3e7d-560d-4a03-8f60-20683c7cc2cb&v=qf1&b=&from_search=3http://www.slideshare.net/davidcontavalli1/zf2-bdd?qid=bf6b3e7d-560d-4a03-8f60-20683c7cc2cb&v=qf1&b=&from_search=1http://www.slideshare.net/nyccamp/behat-by-seth-cohnhttp://www.slideshare.net/headrevision/web-acceptance-testing-with-behat?qid=6021a166-eac0-435d-bf66-ee08d4c7bdef&v=qf1&b=&from_search=7http://selimober.com/blog/2013/07/19/bdd-ye-giris/http://www.mountaingoatsofware.com/blog/the-forgotten-layer-of-the-test-automation-pyramidhttp://watirmelon.com/2011/06/10/yet-another-sofware-testing-pyramid/http://martinfowler.com/bliki/TestPyramid.htmlhttp://mink.behat.org/http://www.mustafaileri.com/pot/60579550214/behat-ve-mink-ile-bdd-testleri-eski-ya