SlideShare une entreprise Scribd logo
1  sur  34
Télécharger pour lire hors ligne
Behat in BDD
Piotr Pelczar
me@athlan.pl
MPZ, 17 gru 2014
BDD – Behaviour Driven Development
• TDD - Test-driven Design
• DDD - Domain-driven Design
• Grupa deweloperów i ludzi od biznesu mają te same
narzędzia do definiowania wymagań.
BDD
• Grupa deweloperów i ludzi od biznesu mają te same
narzędzia do definiowania wymagań.
Czyli pisanie scenariuszy:
Gherkin language
Potrzeba biznesowa
Feature: Homepage
In order to keep my notes organized
As an authenticated user
I need to be able to see my notebooks list
Potrzeba biznesowa
Feature: Homepage
In order to keep my notes organized
As an authenticated user
I need to be able to see my notebooks list
Potrzeba biznesowa
Feature: Homepage
In order to keep my notes organized
As an authenticated user
I need to be able to see my notebooks list
Potrzeba biznesowa
Feature: Homepage
In order to keep my notes organized
As an authenticated user
I need to be able to see my notebooks list
Potrzeba biznesowa
Feature: Homepage
In order to keep my notes organized
As an authenticated user
I need to be able to see my notebooks list
Potrzeba biznesowa - scenariusz
Scenario: Anonymous user should not be able to view
notebook list
Given I am anonymous user
When I click "Go to notebooks"
And I go to "/notebooks/"
Then I should be redirected to "/login"
Potrzeba biznesowa - scenariusz
Scenario: User should can update notebook
and be redirected to notebook tasks
Given I am authenticated as "Greg"
And I go to "/notebooks/"
And I follow "Edit Todo list"
And I fill in "notebook_name" with "Shopping list
edited"
And I press "Submit"
Then I should see success message "The notebook has
been updated successfully"
And should be redirected to "/notebooks/(.+)"
Potrzeba biznesowa – kilka scenariuszy
Background:
Given there are following users:
| username | password |
| Greg | a |
| Katie | a |
Gherkin - składnia
• Feature
• opis ogólny
• Tagi
• Background
• Given
• Zestaw Scenariuszy
• Given
• When
• Then
Zalety
• Forma czytelna dla człowieka biznesu
• Forma czytelna dla programistów
• Dokumentacja dla nowych osób w projekcie – profit!
Zalety
• Wszystko jest na papierze
• Scenariusze są powtarzalne
• Służą jako automatycznie wykonywane cylicznie testy
• Scenariusze są w postaci tekstowej, zatem można je
wersjonować, np. na git
Wady
• Narzut czasowy na produkowanie scenariuszy
• Tworzenie słownika pojęć (FeatureContext)
• Czas trwania testów
ale…
• zrównolegnienie wielowątkowe
• wykonywanie tylko pewnego podzbioru testów
• testy wykonywane asynchronicznie na serwerze CI
TDD i BDD w Scrum
• Można przyjąć jako kryterium akceptacji
• Może stanowić standard do każdej iteracji
• Trzeba dodatkowo szacować
Contineous Integration
• Automatyczne uruchamianie po każdym commicie na
serwerze Contineous Integration
• W przypadku błedu mail do wybranych osób z
powiadomieniem, kto popsuł 
• Eliminacja „u mnie działa”
• Narzędzia: Jenkins/Hudson
Behat
Behat - Uruchamianie
behat
behat --tags name
inaczej:
bin/behat
php behat.phar
Behat - Scenaiusze
• Scenariusze w plikach .feature
• Oznaczone tagiem @nazwatagu
Behat - FeatureContext
• Scenariusze są wykonywane w ramach kontekstów
FeatureContext
• FeatureContext to zbiór definicji Given/When/Then,
to tutaj dokonuje się interpretacja zdań na kod
Behat - FeatureContext
class MinkContext extends RawMinkContext implements
TranslatableContext
{
/**
* Opens specified page.
*
* @Given /^(?:|I )am on "(?P<page>[^"]+)"$/
* @When /^(?:|I )go to "(?P<page>[^"]+)"$/
*/
public function visit($page)
{
$this->visitPath($page);
}
Behat - FeatureContext
/**
* Clicks link with specified id|title|alt|text.
*
* @When /^(?:|I )follow
"(?P<link>(?:[^"]|")*)"$/
*/
public function clickLink($link)
{
$link = $this->fixStepArgument($link);
$this->getSession()->getPage()-
>clickLink($link);
}
Behat - FeatureContext
/**
* @Then /^(?:|I )should see "([^"]+)"
(heading|headline)$/
*/
public function iShouldSeeHeading($heading)
{
$this->assertSession()
->elementTextContains(
'xpath', '//h1 | //h2',
$this->fixStepArgument($heading));
}
Behat – FeatureContext - XPATH
/**
* @Then /^(?:|I )should see
(?P<type>[(error|success|info|warning)]+)
message "(?P<message>[^"]+)"$/
*/
public function iShouldSeeMessage($type,
$message)
{
$this->assertSession()
->elementTextContains('xpath',
'//div[@class="alert alert-' . $type .
'"]', $this->fixStepArgument($message));
}
Behat - Suites
• Scenariusze oraz FeatureContext w ramach których się
wykonują to suites definiowane w pliku głównym
behat.yml
Suites
Ścieżki z plikami .features
(lista)
FeatureContext’y
(lista)
Behat – Konfiguracja testowania
• Całkowicie poza aplikacją – klikanie po UI
• Wartość dodana: tekstowe Selenium
• Całkowicie w aplikacji
• Czyste DDD, prawie testy jednostkowe Core Domain
• Mieszane
• Największa wartość – co się dzieje w systemie, gdy klikam
po UI lub wysyłam requesty do API
Behat – Konfiguracja testowania
• Integracja z frameworkiem wymaga bardzo dużej
wiedzy technicznej odnośnie wykorzystywanego
narzędzia.
• Dependency Injection i Inversion of Control
• Sessions
• Repositories/Database/Serial buses
Behat – Konfiguracja testowania
• Integracja z frameworkiem
Przykład: Doctrine Fixtures
/**
* @BeforeScenario
*/
public function
loadFixturesBeforeScenarios() {
$paths = array();
foreach ($this->kernel->getBundles()
as $bundle) {
$paths[] = $bundle-
>getPath().'/DataFixtures/ORM';
}
$loader = new
DataFixturesLoader($this->getContainer());
foreach ($paths as $path) {
if (is_dir($path)) {
$loader-
>loadFromDirectory($path);
}
}
$em = $this->getContainer()-
>get('doctrine.orm.entity_manager');
$fixtures = $loader->getFixtures();
$purger = new ORMPurger($em);
//$purger->setPurgeMode($input-
>getOption('purge-with-truncate') ?
ORMPurger::PURGE_MODE_TRUNCATE :
ORMPurger::PURGE_MODE_DELETE);
$purger-
>setPurgeMode(ORMPurger::PURGE_MODE_DELETE
);
$executor = new ORMExecutor($em,
$purger);
$append = false;
$executor->execute($fixtures,
$append);
}
Behat – Architektura
• Napisany w PHP
• Uruchamiany z CLI
• Wykorzystuje abstrakcyjną przeglądarkę (wykorzystuje API):
• Selenium (obsługa Javascipt, CSS, AJAX)
• Mink (prosta, szybsza)
Behat – Alternatywy
• Do klikania można wykorzystać wszędzie
• Cucumber – Ruby (inspiracja)
http://cukes.info/
• Robot – Java
http://robotframework.org/
• SpecFlow - .NET
http://www.specflow.org/
Dzięki!
Q&A?
Piotr Pelczar
me@athlan.pl

Contenu connexe

Tendances

Zabezpiecz swoją stronę w Joomla!
Zabezpiecz swoją stronę w Joomla!Zabezpiecz swoją stronę w Joomla!
Zabezpiecz swoją stronę w Joomla!Wojciech Klocek
 
Testowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStackTestowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStackThe Software House
 
DynamoDB – podstawy modelowania danych dla opornych
DynamoDB – podstawy modelowania danych dla opornychDynamoDB – podstawy modelowania danych dla opornych
DynamoDB – podstawy modelowania danych dla opornychThe Software House
 
WordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyceWordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyceDawid Urbański
 
Xdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHPXdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHP3camp
 
OSGi, deklaratywnie
OSGi, deklaratywnieOSGi, deklaratywnie
OSGi, deklaratywnieCode-House
 
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótkaWebpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótkaMarcin Gajda
 
Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014Tomasz Dziuda
 
20 Joomlasztuczek, które mogą CI się przydać
20 Joomlasztuczek, które mogą CI się przydać20 Joomlasztuczek, które mogą CI się przydać
20 Joomlasztuczek, które mogą CI się przydaćWojciech Klocek
 
Debugowanie skryptow php za pomoca xdebug
Debugowanie skryptow php za pomoca xdebugDebugowanie skryptow php za pomoca xdebug
Debugowanie skryptow php za pomoca xdebugXSolve
 
AADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptAADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptJacek Okrojek
 
Intro do Domain Driven Design. ( PL )
Intro do Domain Driven Design. ( PL )Intro do Domain Driven Design. ( PL )
Intro do Domain Driven Design. ( PL )GOG.com dev team
 
Kubernetes (Canary) Deployments
Kubernetes (Canary) DeploymentsKubernetes (Canary) Deployments
Kubernetes (Canary) DeploymentsThe Software House
 
Czym jest złożoność ?
Czym jest złożoność ?Czym jest złożoność ?
Czym jest złożoność ?GOG.com dev team
 

Tendances (20)

PHP-PM. Hit czy kit?
PHP-PM. Hit czy kit?PHP-PM. Hit czy kit?
PHP-PM. Hit czy kit?
 
Zabezpiecz swoją stronę w Joomla!
Zabezpiecz swoją stronę w Joomla!Zabezpiecz swoją stronę w Joomla!
Zabezpiecz swoją stronę w Joomla!
 
Websockety w PHP
Websockety w PHPWebsockety w PHP
Websockety w PHP
 
Platforma Kontentowa
Platforma KontentowaPlatforma Kontentowa
Platforma Kontentowa
 
Testowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStackTestowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStack
 
DynamoDB – podstawy modelowania danych dla opornych
DynamoDB – podstawy modelowania danych dla opornychDynamoDB – podstawy modelowania danych dla opornych
DynamoDB – podstawy modelowania danych dla opornych
 
WordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyceWordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyce
 
Xdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHPXdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHP
 
OSGi, deklaratywnie
OSGi, deklaratywnieOSGi, deklaratywnie
OSGi, deklaratywnie
 
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótkaWebpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
 
Swoole w PHP. Czy to ma sens?
Swoole w PHP. Czy to ma sens?Swoole w PHP. Czy to ma sens?
Swoole w PHP. Czy to ma sens?
 
Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014
 
20 Joomlasztuczek, które mogą CI się przydać
20 Joomlasztuczek, które mogą CI się przydać20 Joomlasztuczek, które mogą CI się przydać
20 Joomlasztuczek, które mogą CI się przydać
 
Debugowanie skryptow php za pomoca xdebug
Debugowanie skryptow php za pomoca xdebugDebugowanie skryptow php za pomoca xdebug
Debugowanie skryptow php za pomoca xdebug
 
JavaScript, Moduły
JavaScript, ModułyJavaScript, Moduły
JavaScript, Moduły
 
AADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptAADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScript
 
Intro do Domain Driven Design. ( PL )
Intro do Domain Driven Design. ( PL )Intro do Domain Driven Design. ( PL )
Intro do Domain Driven Design. ( PL )
 
Torquebox
TorqueboxTorquebox
Torquebox
 
Kubernetes (Canary) Deployments
Kubernetes (Canary) DeploymentsKubernetes (Canary) Deployments
Kubernetes (Canary) Deployments
 
Czym jest złożoność ?
Czym jest złożoność ?Czym jest złożoność ?
Czym jest złożoność ?
 

En vedette

Acceptance & Integration Testing With Behat (PBC11)
Acceptance & Integration Testing With Behat (PBC11)Acceptance & Integration Testing With Behat (PBC11)
Acceptance & Integration Testing With Behat (PBC11)benwaine
 
I put on my mink and wizard behat (tutorial)
I put on my mink and wizard behat (tutorial)I put on my mink and wizard behat (tutorial)
I put on my mink and wizard behat (tutorial)xsist10
 
Behat - Beyond the Basics (2016 - SunshinePHP)
Behat - Beyond the Basics (2016 - SunshinePHP)Behat - Beyond the Basics (2016 - SunshinePHP)
Behat - Beyond the Basics (2016 - SunshinePHP)Jessica Mauerhan
 
Web Acceptance Testing with Behat
Web Acceptance Testing with BehatWeb Acceptance Testing with Behat
Web Acceptance Testing with BehatFabian Kiss
 
Behat bdd training (php) course slides pdf
Behat bdd training (php) course slides pdfBehat bdd training (php) course slides pdf
Behat bdd training (php) course slides pdfseleniumbootcamp
 

En vedette (6)

Acceptance & Integration Testing With Behat (PBC11)
Acceptance & Integration Testing With Behat (PBC11)Acceptance & Integration Testing With Behat (PBC11)
Acceptance & Integration Testing With Behat (PBC11)
 
I put on my mink and wizard behat (tutorial)
I put on my mink and wizard behat (tutorial)I put on my mink and wizard behat (tutorial)
I put on my mink and wizard behat (tutorial)
 
Behat - Beyond the Basics (2016 - SunshinePHP)
Behat - Beyond the Basics (2016 - SunshinePHP)Behat - Beyond the Basics (2016 - SunshinePHP)
Behat - Beyond the Basics (2016 - SunshinePHP)
 
Web Acceptance Testing with Behat
Web Acceptance Testing with BehatWeb Acceptance Testing with Behat
Web Acceptance Testing with Behat
 
Behat bdd training (php) course slides pdf
Behat bdd training (php) course slides pdfBehat bdd training (php) course slides pdf
Behat bdd training (php) course slides pdf
 
Behat 3.0 meetup (March)
Behat 3.0 meetup (March)Behat 3.0 meetup (March)
Behat 3.0 meetup (March)
 

Similaire à [BDD] Introduction to Behat (PL)

JSON, REST API
JSON, REST APIJSON, REST API
JSON, REST API3camp
 
Gherkin - jak zostać poetą w IT
Gherkin - jak zostać poetą w ITGherkin - jak zostać poetą w IT
Gherkin - jak zostać poetą w ITThe Software House
 
20060416 Azure Boot Camp 2016- Azure Data Lake Storage and Analytics
20060416   Azure Boot Camp 2016- Azure Data Lake Storage and Analytics20060416   Azure Boot Camp 2016- Azure Data Lake Storage and Analytics
20060416 Azure Boot Camp 2016- Azure Data Lake Storage and AnalyticsŁukasz Grala
 
Using Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationUsing Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationMariusz Koprowski
 
Błędy userów, niedoróbki koderów
Błędy userów, niedoróbki koderówBłędy userów, niedoróbki koderów
Błędy userów, niedoróbki koderówArkadiusz Stęplowski
 
[PL] Jak programować aby nie zwariować
[PL] Jak programować aby nie zwariować[PL] Jak programować aby nie zwariować
[PL] Jak programować aby nie zwariowaćJakub Marchwicki
 
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław SobieckiPodstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław SobieckiGrzegorz Bartman
 
Motywy Wordpressa Historia Prawdziwa
Motywy Wordpressa Historia PrawdziwaMotywy Wordpressa Historia Prawdziwa
Motywy Wordpressa Historia PrawdziwaTomasz Dziuda
 
Antologia Webdevelopera (9.12.2006)
Antologia Webdevelopera (9.12.2006)Antologia Webdevelopera (9.12.2006)
Antologia Webdevelopera (9.12.2006)Wojtek Zając
 
Za darmo nie umarło - WordCamp Wrocław
Za darmo nie umarło - WordCamp WrocławZa darmo nie umarło - WordCamp Wrocław
Za darmo nie umarło - WordCamp WrocławTomasz Dziuda
 
(node.js) Web Development - prościej
(node.js) Web Development - prościej(node.js) Web Development - prościej
(node.js) Web Development - prościejMateusz Kwasniewski
 
Extjs & netzke
Extjs & netzkeExtjs & netzke
Extjs & netzkeGaldoMedia
 
4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...
4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...
4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...Bartłomiej Miś
 
Motywy dla WordPressa - historia prawdziwa - WordUp Warszawa
Motywy dla WordPressa - historia prawdziwa - WordUp WarszawaMotywy dla WordPressa - historia prawdziwa - WordUp Warszawa
Motywy dla WordPressa - historia prawdziwa - WordUp WarszawaTomasz Dziuda
 
Responsive Web Design - kto mało pyta, nie błądzi
Responsive Web Design - kto mało pyta, nie błądziResponsive Web Design - kto mało pyta, nie błądzi
Responsive Web Design - kto mało pyta, nie błądziJakub Wiśniewski
 
Tomasz Głogosz: SharePoint Framework - nowa jakość w client-side development
Tomasz Głogosz: SharePoint Framework - nowa jakość w client-side developmentTomasz Głogosz: SharePoint Framework - nowa jakość w client-side development
Tomasz Głogosz: SharePoint Framework - nowa jakość w client-side developmentSharePoint Saturday Warsaw
 
Zautomatyzuj swój proces wdrażania projektów SSIS
Zautomatyzuj swój proces wdrażania projektów SSISZautomatyzuj swój proces wdrażania projektów SSIS
Zautomatyzuj swój proces wdrażania projektów SSISBartosz Ratajczyk
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Cloudskraqa
 

Similaire à [BDD] Introduction to Behat (PL) (20)

JSON, REST API
JSON, REST APIJSON, REST API
JSON, REST API
 
Gherkin - jak zostać poetą w IT
Gherkin - jak zostać poetą w ITGherkin - jak zostać poetą w IT
Gherkin - jak zostać poetą w IT
 
20060416 Azure Boot Camp 2016- Azure Data Lake Storage and Analytics
20060416   Azure Boot Camp 2016- Azure Data Lake Storage and Analytics20060416   Azure Boot Camp 2016- Azure Data Lake Storage and Analytics
20060416 Azure Boot Camp 2016- Azure Data Lake Storage and Analytics
 
Using Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationUsing Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentation
 
Błędy userów, niedoróbki koderów
Błędy userów, niedoróbki koderówBłędy userów, niedoróbki koderów
Błędy userów, niedoróbki koderów
 
[PL] Jak programować aby nie zwariować
[PL] Jak programować aby nie zwariować[PL] Jak programować aby nie zwariować
[PL] Jak programować aby nie zwariować
 
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław SobieckiPodstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
 
Motywy Wordpressa Historia Prawdziwa
Motywy Wordpressa Historia PrawdziwaMotywy Wordpressa Historia Prawdziwa
Motywy Wordpressa Historia Prawdziwa
 
Antologia Webdevelopera (9.12.2006)
Antologia Webdevelopera (9.12.2006)Antologia Webdevelopera (9.12.2006)
Antologia Webdevelopera (9.12.2006)
 
Za darmo nie umarło - WordCamp Wrocław
Za darmo nie umarło - WordCamp WrocławZa darmo nie umarło - WordCamp Wrocław
Za darmo nie umarło - WordCamp Wrocław
 
(node.js) Web Development - prościej
(node.js) Web Development - prościej(node.js) Web Development - prościej
(node.js) Web Development - prościej
 
Extjs & netzke
Extjs & netzkeExtjs & netzke
Extjs & netzke
 
4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...
4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...
4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...
 
Motywy dla WordPressa - historia prawdziwa - WordUp Warszawa
Motywy dla WordPressa - historia prawdziwa - WordUp WarszawaMotywy dla WordPressa - historia prawdziwa - WordUp Warszawa
Motywy dla WordPressa - historia prawdziwa - WordUp Warszawa
 
Responsive Web Design - kto mało pyta, nie błądzi
Responsive Web Design - kto mało pyta, nie błądziResponsive Web Design - kto mało pyta, nie błądzi
Responsive Web Design - kto mało pyta, nie błądzi
 
Tomasz Głogosz: SharePoint Framework - nowa jakość w client-side development
Tomasz Głogosz: SharePoint Framework - nowa jakość w client-side developmentTomasz Głogosz: SharePoint Framework - nowa jakość w client-side development
Tomasz Głogosz: SharePoint Framework - nowa jakość w client-side development
 
Wydajny frontend 2023
Wydajny frontend 2023Wydajny frontend 2023
Wydajny frontend 2023
 
StronySłownik
StronySłownikStronySłownik
StronySłownik
 
Zautomatyzuj swój proces wdrażania projektów SSIS
Zautomatyzuj swój proces wdrażania projektów SSISZautomatyzuj swój proces wdrażania projektów SSIS
Zautomatyzuj swój proces wdrażania projektów SSIS
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 

Plus de Piotr Pelczar

Pragmatic Monolith-First, easy to decompose, clean architecture
Pragmatic Monolith-First, easy to decompose, clean architecturePragmatic Monolith-First, easy to decompose, clean architecture
Pragmatic Monolith-First, easy to decompose, clean architecturePiotr Pelczar
 
Elasticsearch - SEARCH & ANALYZE DATA IN REAL TIME
Elasticsearch - SEARCH & ANALYZE DATA IN REAL TIMEElasticsearch - SEARCH & ANALYZE DATA IN REAL TIME
Elasticsearch - SEARCH & ANALYZE DATA IN REAL TIMEPiotr Pelczar
 
Asynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsAsynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsPiotr Pelczar
 
How NOT to write in Node.js
How NOT to write in Node.jsHow NOT to write in Node.js
How NOT to write in Node.jsPiotr Pelczar
 
Liquibase - database structure versioning
Liquibase - database structure versioningLiquibase - database structure versioning
Liquibase - database structure versioningPiotr Pelczar
 

Plus de Piotr Pelczar (7)

Pragmatic Monolith-First, easy to decompose, clean architecture
Pragmatic Monolith-First, easy to decompose, clean architecturePragmatic Monolith-First, easy to decompose, clean architecture
Pragmatic Monolith-First, easy to decompose, clean architecture
 
Elasticsearch - SEARCH & ANALYZE DATA IN REAL TIME
Elasticsearch - SEARCH & ANALYZE DATA IN REAL TIMEElasticsearch - SEARCH & ANALYZE DATA IN REAL TIME
Elasticsearch - SEARCH & ANALYZE DATA IN REAL TIME
 
Asynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsAsynchronous programming done right - Node.js
Asynchronous programming done right - Node.js
 
How NOT to write in Node.js
How NOT to write in Node.jsHow NOT to write in Node.js
How NOT to write in Node.js
 
Liquibase - database structure versioning
Liquibase - database structure versioningLiquibase - database structure versioning
Liquibase - database structure versioning
 
CQRS
CQRSCQRS
CQRS
 
Scalable Web Apps
Scalable Web AppsScalable Web Apps
Scalable Web Apps
 

[BDD] Introduction to Behat (PL)

  • 1. Behat in BDD Piotr Pelczar me@athlan.pl MPZ, 17 gru 2014
  • 2. BDD – Behaviour Driven Development • TDD - Test-driven Design • DDD - Domain-driven Design • Grupa deweloperów i ludzi od biznesu mają te same narzędzia do definiowania wymagań.
  • 3. BDD • Grupa deweloperów i ludzi od biznesu mają te same narzędzia do definiowania wymagań. Czyli pisanie scenariuszy:
  • 5. Potrzeba biznesowa Feature: Homepage In order to keep my notes organized As an authenticated user I need to be able to see my notebooks list
  • 6. Potrzeba biznesowa Feature: Homepage In order to keep my notes organized As an authenticated user I need to be able to see my notebooks list
  • 7. Potrzeba biznesowa Feature: Homepage In order to keep my notes organized As an authenticated user I need to be able to see my notebooks list
  • 8. Potrzeba biznesowa Feature: Homepage In order to keep my notes organized As an authenticated user I need to be able to see my notebooks list
  • 9. Potrzeba biznesowa Feature: Homepage In order to keep my notes organized As an authenticated user I need to be able to see my notebooks list
  • 10. Potrzeba biznesowa - scenariusz Scenario: Anonymous user should not be able to view notebook list Given I am anonymous user When I click "Go to notebooks" And I go to "/notebooks/" Then I should be redirected to "/login"
  • 11. Potrzeba biznesowa - scenariusz Scenario: User should can update notebook and be redirected to notebook tasks Given I am authenticated as "Greg" And I go to "/notebooks/" And I follow "Edit Todo list" And I fill in "notebook_name" with "Shopping list edited" And I press "Submit" Then I should see success message "The notebook has been updated successfully" And should be redirected to "/notebooks/(.+)"
  • 12. Potrzeba biznesowa – kilka scenariuszy Background: Given there are following users: | username | password | | Greg | a | | Katie | a |
  • 13. Gherkin - składnia • Feature • opis ogólny • Tagi • Background • Given • Zestaw Scenariuszy • Given • When • Then
  • 14. Zalety • Forma czytelna dla człowieka biznesu • Forma czytelna dla programistów • Dokumentacja dla nowych osób w projekcie – profit!
  • 15. Zalety • Wszystko jest na papierze • Scenariusze są powtarzalne • Służą jako automatycznie wykonywane cylicznie testy • Scenariusze są w postaci tekstowej, zatem można je wersjonować, np. na git
  • 16. Wady • Narzut czasowy na produkowanie scenariuszy • Tworzenie słownika pojęć (FeatureContext) • Czas trwania testów ale… • zrównolegnienie wielowątkowe • wykonywanie tylko pewnego podzbioru testów • testy wykonywane asynchronicznie na serwerze CI
  • 17. TDD i BDD w Scrum • Można przyjąć jako kryterium akceptacji • Może stanowić standard do każdej iteracji • Trzeba dodatkowo szacować
  • 18. Contineous Integration • Automatyczne uruchamianie po każdym commicie na serwerze Contineous Integration • W przypadku błedu mail do wybranych osób z powiadomieniem, kto popsuł  • Eliminacja „u mnie działa” • Narzędzia: Jenkins/Hudson
  • 19. Behat
  • 20. Behat - Uruchamianie behat behat --tags name inaczej: bin/behat php behat.phar
  • 21. Behat - Scenaiusze • Scenariusze w plikach .feature • Oznaczone tagiem @nazwatagu
  • 22. Behat - FeatureContext • Scenariusze są wykonywane w ramach kontekstów FeatureContext • FeatureContext to zbiór definicji Given/When/Then, to tutaj dokonuje się interpretacja zdań na kod
  • 23. Behat - FeatureContext class MinkContext extends RawMinkContext implements TranslatableContext { /** * Opens specified page. * * @Given /^(?:|I )am on "(?P<page>[^"]+)"$/ * @When /^(?:|I )go to "(?P<page>[^"]+)"$/ */ public function visit($page) { $this->visitPath($page); }
  • 24. Behat - FeatureContext /** * Clicks link with specified id|title|alt|text. * * @When /^(?:|I )follow "(?P<link>(?:[^"]|")*)"$/ */ public function clickLink($link) { $link = $this->fixStepArgument($link); $this->getSession()->getPage()- >clickLink($link); }
  • 25. Behat - FeatureContext /** * @Then /^(?:|I )should see "([^"]+)" (heading|headline)$/ */ public function iShouldSeeHeading($heading) { $this->assertSession() ->elementTextContains( 'xpath', '//h1 | //h2', $this->fixStepArgument($heading)); }
  • 26. Behat – FeatureContext - XPATH /** * @Then /^(?:|I )should see (?P<type>[(error|success|info|warning)]+) message "(?P<message>[^"]+)"$/ */ public function iShouldSeeMessage($type, $message) { $this->assertSession() ->elementTextContains('xpath', '//div[@class="alert alert-' . $type . '"]', $this->fixStepArgument($message)); }
  • 27. Behat - Suites • Scenariusze oraz FeatureContext w ramach których się wykonują to suites definiowane w pliku głównym behat.yml Suites Ścieżki z plikami .features (lista) FeatureContext’y (lista)
  • 28. Behat – Konfiguracja testowania • Całkowicie poza aplikacją – klikanie po UI • Wartość dodana: tekstowe Selenium • Całkowicie w aplikacji • Czyste DDD, prawie testy jednostkowe Core Domain • Mieszane • Największa wartość – co się dzieje w systemie, gdy klikam po UI lub wysyłam requesty do API
  • 29. Behat – Konfiguracja testowania • Integracja z frameworkiem wymaga bardzo dużej wiedzy technicznej odnośnie wykorzystywanego narzędzia. • Dependency Injection i Inversion of Control • Sessions • Repositories/Database/Serial buses
  • 30. Behat – Konfiguracja testowania • Integracja z frameworkiem Przykład: Doctrine Fixtures
  • 31. /** * @BeforeScenario */ public function loadFixturesBeforeScenarios() { $paths = array(); foreach ($this->kernel->getBundles() as $bundle) { $paths[] = $bundle- >getPath().'/DataFixtures/ORM'; } $loader = new DataFixturesLoader($this->getContainer()); foreach ($paths as $path) { if (is_dir($path)) { $loader- >loadFromDirectory($path); } } $em = $this->getContainer()- >get('doctrine.orm.entity_manager'); $fixtures = $loader->getFixtures(); $purger = new ORMPurger($em); //$purger->setPurgeMode($input- >getOption('purge-with-truncate') ? ORMPurger::PURGE_MODE_TRUNCATE : ORMPurger::PURGE_MODE_DELETE); $purger- >setPurgeMode(ORMPurger::PURGE_MODE_DELETE ); $executor = new ORMExecutor($em, $purger); $append = false; $executor->execute($fixtures, $append); }
  • 32. Behat – Architektura • Napisany w PHP • Uruchamiany z CLI • Wykorzystuje abstrakcyjną przeglądarkę (wykorzystuje API): • Selenium (obsługa Javascipt, CSS, AJAX) • Mink (prosta, szybsza)
  • 33. Behat – Alternatywy • Do klikania można wykorzystać wszędzie • Cucumber – Ruby (inspiracja) http://cukes.info/ • Robot – Java http://robotframework.org/ • SpecFlow - .NET http://www.specflow.org/