QA Fest 2014. Анна Гаврилюк. Cool as сucumber

Q
COOL AS A CUCUMBER
QA FEST
2014
04.11.2014 / 2
Gherkin COBOL
(COmmon Business-Oriented Language)
WHAT IS IT?
04.11.2014 / 3
Gherkin
04.11.2014 / 4
Feature: Short summary title
As a common user
I want to be able to do something
So that I have a profit
Scenario: Particular case
Given some precondition
And some other precondition
When some action is done by user
And some other action
And yet another action
Then some testable outcome is achieved
And something else we can check happens too
Prepare Act Assert
Step Definitions & Runners
04.11.2014 / 5
package myprecious.tests.cucumber.steps;
public class CertainSteps {
@Given("^some precondition$")
public void step_definition() {
... //My code here
}
@When("^some action is done by user$")
public void some_action_is_done {
... //Some Selenium here
}
...
package myprecious.tests.cucumber.runners;
@RunWith(Cucumber.class)
@Cucumber.Options(
tags = {"~@skipped", "~@inProgress", "~@current"},
strict = true,
format = { "json:target/cukes.json"},
monochrome = true,
glue = {"myprecious.tests.cucumber.steps",
" myprecious.tests.cucumber.hooks"})
public class LetTehTestsOut {
}
regular expressions
only informative role
locations for test parts
“features” is separate one
@runMe
~@dontRunMe
reporting options
@tag
Scenario: Particular case
Given some precondition
WHAT CAN
A SCENARIO
DO?
04.11.2014 / 6
Hooks
04.11.2014 / 7
Feature: Payment operations
@ui
Scenario: Make payment using current card
Given I have logged
And I have selected card
...
@service
Scenario: Get internal payment info
Given I have submitted payment :
...
public class TaggedHooks {
@Before("@ui")
public void startUpUi() {
//open browser ...
}
@After("@ui")
public void clearUi(Scenario scenario) {
if (scenario.getStatus().equals("failed")) {
byte[] screenshot = ((TakesScreenshot)driver).
getScreenshotAs(OutputType.BYTES);
scenario.embed(screenshot, "image/png");
}
OR (“@ui, @service”)
AND ({“@ui”, “@service”})
only scenario status
if few, executed in backward order
~ works
here too
Feature: Card operations
Scenario: Change PIN successfully
Given I am on account main page
And I select my card from list
And I enter the correct PIN
When I change the PIN to 9876
Then the system should know my new PIN is 9876
Scenario: Transaction list
Given I am on account main page
And I select my card from list
And I enter the correct PIN
And card was used at least once
When I click info panel
Then list of transactions is shown
Scenario: Print card information
Given I am on account main page
And I select my card from list
And I enter the correct PIN
When I click print button
Then page with card information is shown
And it contains card account number
Background
04.11.2014 / 8
Feature: Card operations
Background: User selected a card
Given I am on account main page
And I select my card from list
And I enter the correct PIN
Scenario: Change PIN successfully
When I change the PIN to 9876
Then the system should know my new PIN is 9876
Scenario: Transaction list
Given card was used at least once
When I click info panel
Then list of transactions is shown
Scenario: Print card information
When I click print button
Then page with card information is shown
And it contains card account number
Examples
04.11.2014 / 9
Feature: User registration
Scenario: Tooltips for email registration
Given I am on quick registration form
When I fill "Email" field with ""
And I click somewhere else
Then I should see error message "Email cannot be blank"
When I fill "email" field with "darth.vader"
And I click somewhere else
Then I should see error message "Please input valid Email address"
When I fill "email" field with "admin@domain.com"
And I click somewhere else
Then I should see error message "Email has already been taken"
When I fill "password" field with ""
And I click somewhere else
Then I should see error message "Password cannot be blank"
When I fill "password" field with "asdf"
And I click somewhere else
Then I should see error message "Password is too short"
Feature: User registration
Scenario Outline: Tooltips for email registration
Given I am on quick registration form
When I fill "<field_name>" field with "<value>"
And I click somewhere else
Then I should see error tooltip "<error_message>"
Examples:
| field_name | value | error_message |
| Email | | Email cannot be blank |
| Email | luke.skywalker | Please input valid Email address |
| Email | admin@domain.com | Email has already been taken |
| Password | | Password cannot be blank |
| Password | asdf | Password is too short |
WHAT CAN
A STEP DEFINITION
DO?
04.11.2014 / 10
Usual variables
04.11.2014 / 11
When I select 28 as a "delivery date"
@When("^I select (d+) as a "(.+)"$")
public void stepDefA(int number, String controlName){
Given months "September,July,March" are checked
@Given("^months "(.+)" are checked$")
public void stepDefB(List<String> monthNames){
Given delivery date is “28-02-2014"
@Given("^delivery date is "(d{2}-d{2}-d{4})"$")
public void stepDefC(@Format("dd-MM-yyyy") Date today) {
Then payment is updated in DB2 database
@Then("^payment is updated in (DB2|Oracle) database$")
public void stepDefD(String dbName){
Then error dialog is shown again
@When("^error dialog is shown(?: again)?$")
public void stepDefE(){
Multiline text
04.11.2014 / 12
Then informational message is shown:
"""
Welcome to the Cosa Nostra card activation system.
=======
If you would like us to take care of these losers before they cause you
any trouble, please proceed to payment card information menu.
"""
Given I have a user account "Test Testersen"
When it is granted <Role> rights
And I submit a support request
Then I should receieve an email:
"""
Dear T. Testersen,
Unfortunately all our specialists are busy.
Please <Action> <Person> in order to get further help
with Your issue.
Thank You for using our service.
"""
Examples:
| Role | Action | Person |
| customer | call | customer support team |
| customer support | email | service operations team |
| service operations | brace | yourself |
@Then("^informational message is shown:$")
public void info_message_shown(String messageText) {
Data tables
04.11.2014 / 13
Given following accounts already exist in DB:
| debitorName | debtorAddress1 | debtorPostCd | updateDate |
| "Anakin Skywalker" | "Sand str 8, 2" | "Tatooine" | <current> +1d |
| "R2D2" | "MISTY JUNGLE 1" | "DAGOBAH" | <current> -1d |
| "Qui-Gon Jinn" | "Shrine, apt. 63" | "Yavin 4" | <current> -3d |
| "Padme Amidala" | "Theed Royal Palace" | "Naboo" | <current> -3d |
| "Luke Skywalker" | "Misty Jungle 1" | "Dagobah" | <current> -1d |
| "Lando Calrissian" | "Building 2A, room 45" | "Bespin" | <current> -1d |
| "Han Solo" | "Deck 06A, 12" | "Hoth" | <current> +3d |
| "Leia Organa" | "Laser str. 13" | "Alderaan" | <current> -1d |
@Then("^following accounts already exist in DB:$")
public void stepDefA(DataTable accounts) {
@Then("^following accounts already exist in DB:$")
public void stepDefB(List<Map<String>> accounts) {
@Then("^following accounts already exist in DB:$")
public void stepDefC(List<AccountClass> accounts) {
@Then("^following accounts already exist in DB:$")
public void stepDefD(List<List<String>> accounts) {
HOW CAN WE MAKE IT BETTER?
04.11.2014 / 14
Integrate
04.11.2014 / 15
Maven failsafe plugin to launch the tests.
Test reports passed in json to Jenkins Cucumber report plugin.
Use the power
04.11.2014 / 16
Backgrounds, examples, regexps …
Given I am on the advanced search page
And I select "Endocrinology" from "Specialty"
And I choose "Yes" within "Accepts Insurance"
And I fill in "ZIP Code" with "90010"
And I select "5 miles" from "Search Radius"
When I press "Search"
When I search for a provider with the criteria:
| Provider Type | Doctor |
| Specialty | Endocrinology |
| Accepts Insurance | Yes |
| ZIP | 90010 |
| Search Radius | 5 miles |
When I search for a provider with the default criteria and:
| Specialty | Endocrinology |
| Accepts Insurance | No |
...
When I search for a provider with the default criteria
Then the search criteria should include:
| Provider Type | Doctor |
| Specialty | General |
| Accepts Insurance | Yes |
| ZIP | 90010 |
| Search Radius | 5 miles |
Use the power … of regexps?
04.11.2014 / 17
When I use email (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-
9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[x01-x08x0bx0cx0e-x1fx21x23-x5bx5d-x7f]|[x01-
x09x0bx0cx0e-x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-
9](?:[a-z0-9-]*[a-z0-9])?|[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-
9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-
9]:(?:[x01-x08x0bx0cx0e-x1fx21-x5ax53-x7f]|[x01-x09x0bx0cx0e-x7f])+)])
When I am logged in
...
When I am logged in as "Joda"
@Then("^I am logged in$")
.* Anything or nothing
.+ Something
d* none or more digits
d+ some digits
"[^"]*" Something in quotes
an? Something optional
...
@When("^(?:I am logged|I log) in as an? "([^"]*)"$")
@Then("^(?:receipt has )?following payment (?:information|info) :$")
Choose your domain
04.11.2014 / 18
Scenario: User with valid credentials
Given an unauthenticated user
When the user tries to navigate to the welcome page
Then they should be redirected to the login page
When the user enters a valid name in the Name field
And the user enters the corresponding password in the Password field
And the user presses the Login button
Then they should be directed to the welcome page
• Security domain, user authentication
• Password based authentication domain
• UI widgets domain
• Domain of web assets
Scenario: User with valid credentials
Given an unauthenticated user
When the user tries to access a restricted asset
Then they should be directed to a login page
When the user submits valid credentials
Then they should be redirected back to the restricted content
• “WHAT”  User authentication domain
• “HOW” Web based security domain
Declarative vs. Imperative
04.11.2014 / 19
How exactly to do it ?What should be done?
Scenario: Successful login
Given a user "Smith" with password "qwerty"
And I am on the login page
And I fill in "User name" with "Smith"
And I fill in "Password" with "qwerty"
When I press "Log in"
Then I should see "Welcome, Smith"
Background:
Scenario: Successful login
Given a user "Smith" with password "qwerty"
And I am on the login page
And I fill in "User name" with "Smith"
And I fill in "Password" with "qwerty"
When I press "Log in"
Then I should see "Welcome, Smith"
Scenario: User is greeted upon login
Given the user "Smith" has an account
When he logs in
Then he should see "Welcome, Smith"
Background: The user is logged in
Given a logged in user
Feature: The System
Scenario: Everything Works
Given the system exists
When I use it
Then it should work, perfectly
WHEN DO WE
NEED IT?
04.11.2014 / 20
04.11.2014 / 21
Don’t use Cucumber unless you live in the magic kingdom
of non-programmers-writing-tests (and send me a bottle of
fairy dust if you’re there!)
~ David Heinemeier Hansson
1. Non-developers are involved too
 Product owner
 Test engineer
? Test automation engineer
2. Executable specification
3. BDD, TDD
 Specification, not script
 Abstract, declarative
 Shared language
 Key examples
Collaboration tool
Jira (Behave Plug-in), Cucumber Pro, Relish . . .
 Developer
Useful links and sources
Web
• github.com/cucumber/cucumber-jvm
• cukes.info/ – project page
• dannorth.net/archives/ – creator of BDD
• aslakhellesoy.com/ – framework creator
• agileforall.com/blog/ – usage examples
• cucumber.pro/ – Cucumber Pro + blog
Books
• The Cucumber Book – Wynne M, Hellesøy A, 2012
04.11.2014 / 22
04.11.2014 / 23
anna.gavriluk@iteraconsulting.com
Skype: angavriluk
THANKS FOR TRYING
TO STAY AWAKE
1 of 24

Recommended

Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need by
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needDutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needKacper Gunia
50.4K views140 slides
Chapter 11 by
Chapter 11Chapter 11
Chapter 11Terry Yoast
493 views41 slides
The IoC Hydra by
The IoC HydraThe IoC Hydra
The IoC HydraKacper Gunia
3.3K views124 slides
Michael Colon Portfolio by
Michael Colon PortfolioMichael Colon Portfolio
Michael Colon Portfoliomichael_colon
453 views17 slides
2310 b 10 by
2310 b 102310 b 10
2310 b 10Krazy Koder
993 views34 slides
Building a Pyramid: Symfony Testing Strategies by
Building a Pyramid: Symfony Testing StrategiesBuilding a Pyramid: Symfony Testing Strategies
Building a Pyramid: Symfony Testing StrategiesCiaranMcNulty
2.7K views64 slides

More Related Content

What's hot

Aesthetics and the Beauty of an Architecture by
Aesthetics and the Beauty of an ArchitectureAesthetics and the Beauty of an Architecture
Aesthetics and the Beauty of an ArchitectureTom Scott
1.9K views40 slides
Beyond php - it's not (just) about the code by
Beyond php - it's not (just) about the codeBeyond php - it's not (just) about the code
Beyond php - it's not (just) about the codeWim Godden
1.9K views69 slides
Clojure workshop by
Clojure workshopClojure workshop
Clojure workshopAlf Kristian Støyle
555 views126 slides
TYCS Ajax practicals sem VI by
TYCS Ajax practicals sem VI TYCS Ajax practicals sem VI
TYCS Ajax practicals sem VI yogita kachve
555 views19 slides
Graphql, REST and Apollo by
Graphql, REST and ApolloGraphql, REST and Apollo
Graphql, REST and ApolloChristoffer Noring
1.7K views48 slides
Using Change Streams to Keep Up with Your Data by
Using Change Streams to Keep Up with Your DataUsing Change Streams to Keep Up with Your Data
Using Change Streams to Keep Up with Your DataMongoDB
880 views48 slides

What's hot(6)

Aesthetics and the Beauty of an Architecture by Tom Scott
Aesthetics and the Beauty of an ArchitectureAesthetics and the Beauty of an Architecture
Aesthetics and the Beauty of an Architecture
Tom Scott1.9K views
Beyond php - it's not (just) about the code by Wim Godden
Beyond php - it's not (just) about the codeBeyond php - it's not (just) about the code
Beyond php - it's not (just) about the code
Wim Godden1.9K views
TYCS Ajax practicals sem VI by yogita kachve
TYCS Ajax practicals sem VI TYCS Ajax practicals sem VI
TYCS Ajax practicals sem VI
yogita kachve555 views
Using Change Streams to Keep Up with Your Data by MongoDB
Using Change Streams to Keep Up with Your DataUsing Change Streams to Keep Up with Your Data
Using Change Streams to Keep Up with Your Data
MongoDB880 views

Similar to QA Fest 2014. Анна Гаврилюк. Cool as сucumber

Mock Servers - Fake All the Things! by
Mock Servers - Fake All the Things!Mock Servers - Fake All the Things!
Mock Servers - Fake All the Things!Atlassian
20.3K views129 slides
OpenERP e l'arte della gestione aziendale con Python by
OpenERP e l'arte della gestione aziendale con PythonOpenERP e l'arte della gestione aziendale con Python
OpenERP e l'arte della gestione aziendale con PythonPyCon Italia
919 views24 slides
Behat: Beyond the Basics by
Behat: Beyond the BasicsBehat: Beyond the Basics
Behat: Beyond the BasicsJessica Mauerhan
2K views87 slides
When Cukes go sour... by
When Cukes go sour...When Cukes go sour...
When Cukes go sour...Leonard Fingerman
50 views15 slides
Rails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine by
Rails-like JavaScript Using CoffeeScript, Backbone.js and JasmineRails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript Using CoffeeScript, Backbone.js and JasmineRaimonds Simanovskis
19.5K views62 slides
Introduce cucumber by
Introduce cucumberIntroduce cucumber
Introduce cucumberBachue Zhou
1.5K views32 slides

Similar to QA Fest 2014. Анна Гаврилюк. Cool as сucumber(20)

Mock Servers - Fake All the Things! by Atlassian
Mock Servers - Fake All the Things!Mock Servers - Fake All the Things!
Mock Servers - Fake All the Things!
Atlassian20.3K views
OpenERP e l'arte della gestione aziendale con Python by PyCon Italia
OpenERP e l'arte della gestione aziendale con PythonOpenERP e l'arte della gestione aziendale con Python
OpenERP e l'arte della gestione aziendale con Python
PyCon Italia919 views
Rails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine by Raimonds Simanovskis
Rails-like JavaScript Using CoffeeScript, Backbone.js and JasmineRails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine
Raimonds Simanovskis19.5K views
Introduce cucumber by Bachue Zhou
Introduce cucumberIntroduce cucumber
Introduce cucumber
Bachue Zhou1.5K views
Writing Sensible Code by Anis Ahmad
Writing Sensible CodeWriting Sensible Code
Writing Sensible Code
Anis Ahmad249 views
Testing ASP.net Web Applications using Ruby by Ben Hall
Testing ASP.net Web Applications using RubyTesting ASP.net Web Applications using Ruby
Testing ASP.net Web Applications using Ruby
Ben Hall2.2K views
Let's build a parser! by Boy Baukema
Let's build a parser!Let's build a parser!
Let's build a parser!
Boy Baukema11.1K views
ES3-2020-06 Test Driven Development (TDD) by David Rodenas
ES3-2020-06 Test Driven Development (TDD)ES3-2020-06 Test Driven Development (TDD)
ES3-2020-06 Test Driven Development (TDD)
David Rodenas63 views
Nine Ways to Use Network-Side Scripting by Lori MacVittie
Nine Ways to Use Network-Side ScriptingNine Ways to Use Network-Side Scripting
Nine Ways to Use Network-Side Scripting
Lori MacVittie947 views
jQuery: Tips, tricks and hints for better development and Performance by Jonas De Smet
jQuery: Tips, tricks and hints for better development and PerformancejQuery: Tips, tricks and hints for better development and Performance
jQuery: Tips, tricks and hints for better development and Performance
Jonas De Smet3.5K views
Do more with less code in a serverless world by jeromevdl
Do more with less code in a serverless worldDo more with less code in a serverless world
Do more with less code in a serverless world
jeromevdl137 views

More from QAFest

QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилин by
QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилинQA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилин
QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилинQAFest
979 views44 slides
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The Future by
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The FutureQA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The Future
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The FutureQAFest
931 views44 slides
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe... by
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...QAFest
322 views131 slides
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и... by
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...QAFest
336 views92 slides
QA Fest 2019. Никита Галкин. Как зарабатывать больше by
QA Fest 2019. Никита Галкин. Как зарабатывать большеQA Fest 2019. Никита Галкин. Как зарабатывать больше
QA Fest 2019. Никита Галкин. Как зарабатывать большеQAFest
389 views40 slides
QA Fest 2019. Сергей Пирогов. Why everything is spoiled by
QA Fest 2019. Сергей Пирогов. Why everything is spoiledQA Fest 2019. Сергей Пирогов. Why everything is spoiled
QA Fest 2019. Сергей Пирогов. Why everything is spoiledQAFest
342 views33 slides

More from QAFest(20)

QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилин by QAFest
QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилинQA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилин
QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилин
QAFest979 views
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The Future by QAFest
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The FutureQA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The Future
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The Future
QAFest931 views
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe... by QAFest
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...
QAFest322 views
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и... by QAFest
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...
QAFest336 views
QA Fest 2019. Никита Галкин. Как зарабатывать больше by QAFest
QA Fest 2019. Никита Галкин. Как зарабатывать большеQA Fest 2019. Никита Галкин. Как зарабатывать больше
QA Fest 2019. Никита Галкин. Как зарабатывать больше
QAFest389 views
QA Fest 2019. Сергей Пирогов. Why everything is spoiled by QAFest
QA Fest 2019. Сергей Пирогов. Why everything is spoiledQA Fest 2019. Сергей Пирогов. Why everything is spoiled
QA Fest 2019. Сергей Пирогов. Why everything is spoiled
QAFest342 views
QA Fest 2019. Сергей Новик. Между мотивацией и выгоранием by QAFest
QA Fest 2019. Сергей Новик. Между мотивацией и выгораниемQA Fest 2019. Сергей Новик. Между мотивацией и выгоранием
QA Fest 2019. Сергей Новик. Между мотивацией и выгоранием
QAFest249 views
QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н... by QAFest
QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...
QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...
QAFest338 views
QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV... by QAFest
QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...
QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...
QAFest227 views
QA Fest 2019. Иван Крутов. Bulletproof Selenium Cluster by QAFest
QA Fest 2019. Иван Крутов. Bulletproof Selenium ClusterQA Fest 2019. Иван Крутов. Bulletproof Selenium Cluster
QA Fest 2019. Иван Крутов. Bulletproof Selenium Cluster
QAFest282 views
QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе... by QAFest
QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе...QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе...
QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе...
QAFest251 views
QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз... by QAFest
QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз...QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз...
QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз...
QAFest301 views
QA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automation by QAFest
QA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automationQA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automation
QA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automation
QAFest225 views
QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в... by QAFest
QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в...QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в...
QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в...
QAFest243 views
QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa... by QAFest
QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa...QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa...
QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa...
QAFest376 views
QA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях IT by QAFest
QA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях ITQA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях IT
QA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях IT
QAFest209 views
QA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложении by QAFest
QA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложенииQA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложении
QA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложении
QAFest607 views
QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр... by QAFest
QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр...QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр...
QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр...
QAFest321 views
QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр... by QAFest
QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр...QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр...
QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр...
QAFest296 views
QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22 by QAFest
QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22
QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22
QAFest164 views

Recently uploaded

Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ... by
Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ...Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ...
Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ...ShapeBlue
119 views17 slides
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue by
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlueShapeBlue
147 views23 slides
Business Analyst Series 2023 - Week 4 Session 8 by
Business Analyst Series 2023 -  Week 4 Session 8Business Analyst Series 2023 -  Week 4 Session 8
Business Analyst Series 2023 - Week 4 Session 8DianaGray10
123 views13 slides
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f... by
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...TrustArc
170 views29 slides
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue by
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlueVNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlueShapeBlue
203 views54 slides
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or... by
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...ShapeBlue
198 views20 slides

Recently uploaded(20)

Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ... by ShapeBlue
Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ...Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ...
Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ...
ShapeBlue119 views
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue by ShapeBlue
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue
ShapeBlue147 views
Business Analyst Series 2023 - Week 4 Session 8 by DianaGray10
Business Analyst Series 2023 -  Week 4 Session 8Business Analyst Series 2023 -  Week 4 Session 8
Business Analyst Series 2023 - Week 4 Session 8
DianaGray10123 views
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f... by TrustArc
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...
TrustArc170 views
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue by ShapeBlue
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlueVNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue
ShapeBlue203 views
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or... by ShapeBlue
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...
ShapeBlue198 views
Digital Personal Data Protection (DPDP) Practical Approach For CISOs by Priyanka Aash
Digital Personal Data Protection (DPDP) Practical Approach For CISOsDigital Personal Data Protection (DPDP) Practical Approach For CISOs
Digital Personal Data Protection (DPDP) Practical Approach For CISOs
Priyanka Aash158 views
Extending KVM Host HA for Non-NFS Storage - Alex Ivanov - StorPool by ShapeBlue
Extending KVM Host HA for Non-NFS Storage -  Alex Ivanov - StorPoolExtending KVM Host HA for Non-NFS Storage -  Alex Ivanov - StorPool
Extending KVM Host HA for Non-NFS Storage - Alex Ivanov - StorPool
ShapeBlue123 views
The Role of Patterns in the Era of Large Language Models by Yunyao Li
The Role of Patterns in the Era of Large Language ModelsThe Role of Patterns in the Era of Large Language Models
The Role of Patterns in the Era of Large Language Models
Yunyao Li85 views
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue by ShapeBlue
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlueMigrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue
ShapeBlue218 views
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue by ShapeBlue
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlueCloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue
ShapeBlue138 views
DRBD Deep Dive - Philipp Reisner - LINBIT by ShapeBlue
DRBD Deep Dive - Philipp Reisner - LINBITDRBD Deep Dive - Philipp Reisner - LINBIT
DRBD Deep Dive - Philipp Reisner - LINBIT
ShapeBlue180 views
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R... by ShapeBlue
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...
ShapeBlue173 views
"Surviving highload with Node.js", Andrii Shumada by Fwdays
"Surviving highload with Node.js", Andrii Shumada "Surviving highload with Node.js", Andrii Shumada
"Surviving highload with Node.js", Andrii Shumada
Fwdays56 views
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda... by ShapeBlue
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...
ShapeBlue161 views
Future of AR - Facebook Presentation by Rob McCarty
Future of AR - Facebook PresentationFuture of AR - Facebook Presentation
Future of AR - Facebook Presentation
Rob McCarty64 views
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T by ShapeBlue
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&TCloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T
ShapeBlue152 views

QA Fest 2014. Анна Гаврилюк. Cool as сucumber

  • 1. COOL AS A CUCUMBER QA FEST 2014
  • 2. 04.11.2014 / 2 Gherkin COBOL (COmmon Business-Oriented Language)
  • 4. Gherkin 04.11.2014 / 4 Feature: Short summary title As a common user I want to be able to do something So that I have a profit Scenario: Particular case Given some precondition And some other precondition When some action is done by user And some other action And yet another action Then some testable outcome is achieved And something else we can check happens too Prepare Act Assert
  • 5. Step Definitions & Runners 04.11.2014 / 5 package myprecious.tests.cucumber.steps; public class CertainSteps { @Given("^some precondition$") public void step_definition() { ... //My code here } @When("^some action is done by user$") public void some_action_is_done { ... //Some Selenium here } ... package myprecious.tests.cucumber.runners; @RunWith(Cucumber.class) @Cucumber.Options( tags = {"~@skipped", "~@inProgress", "~@current"}, strict = true, format = { "json:target/cukes.json"}, monochrome = true, glue = {"myprecious.tests.cucumber.steps", " myprecious.tests.cucumber.hooks"}) public class LetTehTestsOut { } regular expressions only informative role locations for test parts “features” is separate one @runMe ~@dontRunMe reporting options @tag Scenario: Particular case Given some precondition
  • 7. Hooks 04.11.2014 / 7 Feature: Payment operations @ui Scenario: Make payment using current card Given I have logged And I have selected card ... @service Scenario: Get internal payment info Given I have submitted payment : ... public class TaggedHooks { @Before("@ui") public void startUpUi() { //open browser ... } @After("@ui") public void clearUi(Scenario scenario) { if (scenario.getStatus().equals("failed")) { byte[] screenshot = ((TakesScreenshot)driver). getScreenshotAs(OutputType.BYTES); scenario.embed(screenshot, "image/png"); } OR (“@ui, @service”) AND ({“@ui”, “@service”}) only scenario status if few, executed in backward order ~ works here too
  • 8. Feature: Card operations Scenario: Change PIN successfully Given I am on account main page And I select my card from list And I enter the correct PIN When I change the PIN to 9876 Then the system should know my new PIN is 9876 Scenario: Transaction list Given I am on account main page And I select my card from list And I enter the correct PIN And card was used at least once When I click info panel Then list of transactions is shown Scenario: Print card information Given I am on account main page And I select my card from list And I enter the correct PIN When I click print button Then page with card information is shown And it contains card account number Background 04.11.2014 / 8 Feature: Card operations Background: User selected a card Given I am on account main page And I select my card from list And I enter the correct PIN Scenario: Change PIN successfully When I change the PIN to 9876 Then the system should know my new PIN is 9876 Scenario: Transaction list Given card was used at least once When I click info panel Then list of transactions is shown Scenario: Print card information When I click print button Then page with card information is shown And it contains card account number
  • 9. Examples 04.11.2014 / 9 Feature: User registration Scenario: Tooltips for email registration Given I am on quick registration form When I fill "Email" field with "" And I click somewhere else Then I should see error message "Email cannot be blank" When I fill "email" field with "darth.vader" And I click somewhere else Then I should see error message "Please input valid Email address" When I fill "email" field with "admin@domain.com" And I click somewhere else Then I should see error message "Email has already been taken" When I fill "password" field with "" And I click somewhere else Then I should see error message "Password cannot be blank" When I fill "password" field with "asdf" And I click somewhere else Then I should see error message "Password is too short" Feature: User registration Scenario Outline: Tooltips for email registration Given I am on quick registration form When I fill "<field_name>" field with "<value>" And I click somewhere else Then I should see error tooltip "<error_message>" Examples: | field_name | value | error_message | | Email | | Email cannot be blank | | Email | luke.skywalker | Please input valid Email address | | Email | admin@domain.com | Email has already been taken | | Password | | Password cannot be blank | | Password | asdf | Password is too short |
  • 10. WHAT CAN A STEP DEFINITION DO? 04.11.2014 / 10
  • 11. Usual variables 04.11.2014 / 11 When I select 28 as a "delivery date" @When("^I select (d+) as a "(.+)"$") public void stepDefA(int number, String controlName){ Given months "September,July,March" are checked @Given("^months "(.+)" are checked$") public void stepDefB(List<String> monthNames){ Given delivery date is “28-02-2014" @Given("^delivery date is "(d{2}-d{2}-d{4})"$") public void stepDefC(@Format("dd-MM-yyyy") Date today) { Then payment is updated in DB2 database @Then("^payment is updated in (DB2|Oracle) database$") public void stepDefD(String dbName){ Then error dialog is shown again @When("^error dialog is shown(?: again)?$") public void stepDefE(){
  • 12. Multiline text 04.11.2014 / 12 Then informational message is shown: """ Welcome to the Cosa Nostra card activation system. ======= If you would like us to take care of these losers before they cause you any trouble, please proceed to payment card information menu. """ Given I have a user account "Test Testersen" When it is granted <Role> rights And I submit a support request Then I should receieve an email: """ Dear T. Testersen, Unfortunately all our specialists are busy. Please <Action> <Person> in order to get further help with Your issue. Thank You for using our service. """ Examples: | Role | Action | Person | | customer | call | customer support team | | customer support | email | service operations team | | service operations | brace | yourself | @Then("^informational message is shown:$") public void info_message_shown(String messageText) {
  • 13. Data tables 04.11.2014 / 13 Given following accounts already exist in DB: | debitorName | debtorAddress1 | debtorPostCd | updateDate | | "Anakin Skywalker" | "Sand str 8, 2" | "Tatooine" | <current> +1d | | "R2D2" | "MISTY JUNGLE 1" | "DAGOBAH" | <current> -1d | | "Qui-Gon Jinn" | "Shrine, apt. 63" | "Yavin 4" | <current> -3d | | "Padme Amidala" | "Theed Royal Palace" | "Naboo" | <current> -3d | | "Luke Skywalker" | "Misty Jungle 1" | "Dagobah" | <current> -1d | | "Lando Calrissian" | "Building 2A, room 45" | "Bespin" | <current> -1d | | "Han Solo" | "Deck 06A, 12" | "Hoth" | <current> +3d | | "Leia Organa" | "Laser str. 13" | "Alderaan" | <current> -1d | @Then("^following accounts already exist in DB:$") public void stepDefA(DataTable accounts) { @Then("^following accounts already exist in DB:$") public void stepDefB(List<Map<String>> accounts) { @Then("^following accounts already exist in DB:$") public void stepDefC(List<AccountClass> accounts) { @Then("^following accounts already exist in DB:$") public void stepDefD(List<List<String>> accounts) {
  • 14. HOW CAN WE MAKE IT BETTER? 04.11.2014 / 14
  • 15. Integrate 04.11.2014 / 15 Maven failsafe plugin to launch the tests. Test reports passed in json to Jenkins Cucumber report plugin.
  • 16. Use the power 04.11.2014 / 16 Backgrounds, examples, regexps … Given I am on the advanced search page And I select "Endocrinology" from "Specialty" And I choose "Yes" within "Accepts Insurance" And I fill in "ZIP Code" with "90010" And I select "5 miles" from "Search Radius" When I press "Search" When I search for a provider with the criteria: | Provider Type | Doctor | | Specialty | Endocrinology | | Accepts Insurance | Yes | | ZIP | 90010 | | Search Radius | 5 miles | When I search for a provider with the default criteria and: | Specialty | Endocrinology | | Accepts Insurance | No | ... When I search for a provider with the default criteria Then the search criteria should include: | Provider Type | Doctor | | Specialty | General | | Accepts Insurance | Yes | | ZIP | 90010 | | Search Radius | 5 miles |
  • 17. Use the power … of regexps? 04.11.2014 / 17 When I use email (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0- 9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[x01-x08x0bx0cx0e-x1fx21x23-x5bx5d-x7f]|[x01- x09x0bx0cx0e-x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0- 9](?:[a-z0-9-]*[a-z0-9])?|[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0- 9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0- 9]:(?:[x01-x08x0bx0cx0e-x1fx21-x5ax53-x7f]|[x01-x09x0bx0cx0e-x7f])+)]) When I am logged in ... When I am logged in as "Joda" @Then("^I am logged in$") .* Anything or nothing .+ Something d* none or more digits d+ some digits "[^"]*" Something in quotes an? Something optional ... @When("^(?:I am logged|I log) in as an? "([^"]*)"$") @Then("^(?:receipt has )?following payment (?:information|info) :$")
  • 18. Choose your domain 04.11.2014 / 18 Scenario: User with valid credentials Given an unauthenticated user When the user tries to navigate to the welcome page Then they should be redirected to the login page When the user enters a valid name in the Name field And the user enters the corresponding password in the Password field And the user presses the Login button Then they should be directed to the welcome page • Security domain, user authentication • Password based authentication domain • UI widgets domain • Domain of web assets Scenario: User with valid credentials Given an unauthenticated user When the user tries to access a restricted asset Then they should be directed to a login page When the user submits valid credentials Then they should be redirected back to the restricted content • “WHAT”  User authentication domain • “HOW” Web based security domain
  • 19. Declarative vs. Imperative 04.11.2014 / 19 How exactly to do it ?What should be done? Scenario: Successful login Given a user "Smith" with password "qwerty" And I am on the login page And I fill in "User name" with "Smith" And I fill in "Password" with "qwerty" When I press "Log in" Then I should see "Welcome, Smith" Background: Scenario: Successful login Given a user "Smith" with password "qwerty" And I am on the login page And I fill in "User name" with "Smith" And I fill in "Password" with "qwerty" When I press "Log in" Then I should see "Welcome, Smith" Scenario: User is greeted upon login Given the user "Smith" has an account When he logs in Then he should see "Welcome, Smith" Background: The user is logged in Given a logged in user Feature: The System Scenario: Everything Works Given the system exists When I use it Then it should work, perfectly
  • 20. WHEN DO WE NEED IT? 04.11.2014 / 20
  • 21. 04.11.2014 / 21 Don’t use Cucumber unless you live in the magic kingdom of non-programmers-writing-tests (and send me a bottle of fairy dust if you’re there!) ~ David Heinemeier Hansson 1. Non-developers are involved too  Product owner  Test engineer ? Test automation engineer 2. Executable specification 3. BDD, TDD  Specification, not script  Abstract, declarative  Shared language  Key examples Collaboration tool Jira (Behave Plug-in), Cucumber Pro, Relish . . .  Developer
  • 22. Useful links and sources Web • github.com/cucumber/cucumber-jvm • cukes.info/ – project page • dannorth.net/archives/ – creator of BDD • aslakhellesoy.com/ – framework creator • agileforall.com/blog/ – usage examples • cucumber.pro/ – Cucumber Pro + blog Books • The Cucumber Book – Wynne M, Hellesøy A, 2012 04.11.2014 / 22
  • 24. THANKS FOR TRYING TO STAY AWAKE

Editor's Notes

  1. Что общего между корнишонами** и мейнфреймами**? Наверное все таки ничего. Но если вспомнить корнишон это Gherkin**, а с мейнфреймами тесно связан язык COBOL** то мы получим два языка которые разделяет пятьдесят пять лет и которые были созданы с очень похожими целями. Как и COBOL, а именно COmmon Business-Oriented Language, язык Gherkin был создан для того что бы заполнить нишу между knowledge-holder’ами и разработчиками. Сложно судить получилось ли это у COBOL, за время своего существования язык сталкивался со множеством проблем (отсутствие модульности, структурности, нецелевое использование)
  2. Подготовка – Действие – Проверка Precondition (Условие) – Input – Output Язык для определения спецификац ий используется практически во всех BDD Фреймворках Ruby - Cucubmer Java – Cucumber-jvm, Jbehave Python – Behave PHP – Behat SpecFlow – C# В общем всё что угодно что бы поработить мир и использоваться на проекте
  3. Есть тест кейс с определённым шагом-действием Для него в каком то классе есть аннотированный метод Step Definition И все это дела запускает раннер
  4. Всем понятно
  5. Also scalar transformations Cucumber-JVM's built-in scalar types are numbers, enums, java.util.Date, java.util.Calendar and arbitrary types that have a single-argument constructor that is either a String or an Object
  6. Если помните есть такие Examples, так вот
  7. Screenshots are embedded in json as Base64 byte array Cucumber tests are ran nightly or by launching the Jenkins job. Bamboo (plugin), TeamCity (formatter) , TFS (SpecFlow uses Nunit)
  8. Регекспы такое дело, можно такого сделать что захочется застрелиться В какой степени использовать их решать вам (автоматизаторам), потому что им же их потом в основном и поддерживать
  9. + от password-based к OpenID, или centralized authentication system (CAS) model, или email ? + name выбирается DDL, radio buttons ? + обойти welcome page и попасть на дэшборд? Разные stakeholder’ы для каждого домена, каждый меняется, сценарий _хрупкий_ Должно быть 2 домена: - домен ЧТО, название, требование -- ЦЕЛЬ - домен КАК , шаги, реализация -- желаемое ПОВЕДЕНИЕ приложения 2 человека для которых мы это пишем: Тот кому необходима эта функиональность Тот кто её реализует
  10. Boring scenarios = bored stakeholders
  11. Ханссон, Давид Хейнемейер ---Back to COBOL One of the design goals for COBOL was to make it possible for non-programmers such as supervisors, managers and users, to read and understand COBOL code. As a result, COBOL contains such English-like structural elements as verbs, clauses, sentences, sections and divisions. As it happens, this design goal was not realized.  ---- TDD, but where to start? BDD and PO will help The idea was to combine automated acceptance tests, functional requirements and software documentation into one format that would be understandable by non-technical people as well as testing tools. ------ Outside-In Your features should drive your implementation, not reflect it.
  12. Aslak Hellesøy 2003 DN jBehave  DN Rbehave  DN Rspec  2008 AH Cucumber Richard Lawrence  Cuke4Nuke (.Net) Pragmatic bookshelf