Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
BDD girls battle
JBehave vs Cucumber
1
Герои битвы
‣ JBEHAVE
‣ Чернышева Анна
‣ CUCUMBER
‣ Ковалева Юлия
2
Процессы разработки и тестирования
в Альфа Лаборатории
‣ BDD
‣ парное программирование
‣ небольшие SCRUM команды
‣ стремле...
Стоит ли переписывать
готовый фреймворк на новый
ради нескольких преимуществ?
4
‣ Как решать похожие проблемы?
Нужно ли решать?
‣ А если ничего не предпринимать?
‣ Наши решения и выводы - это не
панацея...
Selenium
JUnit
JAVA
HttpClient
Serenity
JBehave
Maven
6
Selenium
JUnit
JAVA
HttpClient
Serenity
JBehave
Maven
7
Selenium Selenide
JAVA
HttpClient
Serenity
JBehave
Maven Gradle
Rest Assured
Cucumber
JUnit
8
9
Написание сценариев
10
Раунд 1 Ключевые слова
Задача: Я хочу использовать текст шагов без
привязки к ключевым словам
When currency equals USD
The...
JBehave
12
Cucumber "ru": {
"and": [
"* ",
"И ",
"К тому же ",
"Также "
],
"background": [
"Предыстория",
"Контекст"
],
"but": [
"* "...
Cucumber
14
Cucumber Win
1 / 0
15
Раунд 2 Меньше повторов
Задача: Я хочу использовать одну реализацию
шага для нескольких текстовых описаний.
Then there are...
JBehave
17
JBehave
18
JBehave
19
Cucumber
‣ Then there are 5 cards in the list
‣ Then there are 5 cards in the roll
20
JBehave Win
1 / 1 0
21
Раунд 3 Работа с датами
Задача: Я хочу, чтобы дата передавалась в шаг в
определенном формате.
22
JBehave
@Given("ISO date format is $date")
public void theIsoDateIs(@Named("date") Date date) {
// ...
}
Given ISO date fo...
private ParameterConverter[] customConverters() {
List<ParameterConverter> converters = new ArrayList<ParameterConverter>(...
private ParameterConverter[] customConverters() {
List<ParameterConverter> converters = new ArrayList<ParameterConverter>(...
@Override
public Configuration configuration(){
return new MostUsefulConfiguration()
.useParameterConverters(new Parameter...
Cucumber
27
Feature: Date format of current date
Scenario: Correct format
* current date is 12.06.2014
Scenario: Incorrect...
Cucumber
28
Cucumber (падающий тест)
ConversionException: Couldn't convert "2014-04-12"
to an instance of: [class java.util.Date]
29
Cucumber Win
1 2 / 1
30
Раунд 4 Ключевые слова на разных языках
Задача: Владелец продукта хочет получать отчеты
о тестировании на русском языке.
31
JBehave
Создать properties файл с описанием ключевых слов
Для русских слов i18n/keywords_ru.properties:
Символы Unicode, и...
JBehave
Определить ключевые слова в конфигурациях
@Override
public Configuration configuration() {
//...
Keywords keywords...
JBehave
Определить ключевые слова в конфигурациях
@Override
public Configuration configuration(){
ClassLoader classLoader ...
JBehave
Определить ключевые слова в конфигурациях
@Override
public Configuration configuration(){
ClassLoader classLoader ...
JBehave
36
Cucumber
37
import cucumber.api.java
Cucumber + Java 8
38
Cucumber
39
Cucumber Win
2 3 / 1
40
Раунд 5 Аннотации жизненного цикла тестов
Задача: Организовать для тестов пред/пост
обработчики:
* делать скриншот при каж...
JBehave
@BeforeScenario
@BeforeScenario
public void beforeEachScenario() {
// ...
}
42
JBehave
@BeforeStory
@BeforeStory // @BeforeStory(uponGivenStory=false)
public void beforeStory() {
// ...
}
@BeforeStory(...
JBehave
@AfterScenario
public void afterAnyScenario() {
// ...
}
@AfterScenario(uponOutcome=AfterScenario.Outcome.SUCCESS)...
JBehave
@AfterStory
@AfterStory //@AfterStory(uponGivenStory=false)
public void afterStory() {
// ...
}
@AfterStory(uponGi...
JBehave
@BeforeStories @AfterStories
@BeforeStories
public void
beforeCollectionOfStories() {
// ...
}
@AfterStories
publi...
А теперь сначала ...
@BeforeScenario
@BeforeScenario
public void beforeEachScenario() {
// ...
}
47
JBehave
@BeforeStory
@BeforeStory // @BeforeStory(uponGivenStory=false)
public void beforeStory() {
// ...
}
@BeforeStory(...
JBehave
@AfterScenario
public void afterAnyScenario() {
// ...
}
@AfterScenario(uponOutcome=AfterScenario.Outcome.SUCCESS)...
JBehave
@AfterStory
@AfterStory //@AfterStory(uponGivenStory=false)
public void afterStory() {
// ...
}
@AfterStory(uponGi...
JBehave
@BeforeStories @AfterStories
@BeforeStories
public void
beforeCollectionOfStories() {
// ...
}
@AfterStories
publi...
Cucumber
Всего 2 аннотации в наличии: @After и @Before.
Настройки:
@After("unstable")
@After(value="unstable", order = 2, ...
Cucumber пример
53
JBehave Win
3 / 2 1
54
Раунд 6 Заготовки или предусловия
Задача: Было бы удобно выполнять некую последовательность
шагов перед схожими по логике ...
JBehave
!-- Предусловие ко всей сторе
GivenStories: path/to/openPaintAndCreateNewFile.story
Scenario: Drawing Claude Monet...
JBehave
Scenario:Drawing Claude Monet waterloo bridge picture
!-- Предусловия к сценарию
GivenStories: path/to/openPaintAn...
Cucumber
Feature: Drawing
Background:
Given open Paint app
When create new file
Scenario Outline:Drawing picture
Then file...
Cucumber Win
3 4 / 2
59
Раунд 7 Исключение тестов из запуска
Задача: Исключить из запуска тестов набор,
например, нестабильных тестов.
60
Cucumber
61
Cucumber
@RunWith(Cucumber.class)
@CucumberOptions(
glue = {"ru.alfabank.steps", "steps"},
format = {"pretty", "json:build...
Cucumber
@RunWith(Cucumber.class)
@CucumberOptions(
glue = {"ru.alfabank.steps", "steps"},
format = {"pretty", "json:build...
JBehave
Scenario: A scenario which we cannot run every time
Meta:
@skip
@ignored true
Given ... // normal scenario steps
А...
JBehave Win
4 / 3 2
65
Раунд 8 Нереализованные шаги
Задача: У меня еще не реализован шаг, но я хочу
запускать тест и чтобы он не падал.
66
JBehave
@Given("page is opened with title $title")
@Pending
public void pendingMethod(String title) {
// not yet implement...
Cucumber
@Pending можно навешивать на класс кастомных исключений
Если метод кинет такое исключение, то шаг будет помечен к...
Cucumber
69
JBehave Win
4 / 4 3
70
Раунд 9 Тестовые данные отдельно от тестов
Задача: Я хочу одни и те же тестовые данные
использовать для многих кейсов. Мне...
JBehave
Scenario: The Examples tables could be loaded
from external resources
Given page is opened with <title>
When user ...
Cucumber
73
4 / 5 4
JBehave Win 74
Отчеты о тестировании
75
Раунд 10 Удобный отчет о тестировании
Задача: Я хочу предоставить своей команде удобный
отчет без лишней информации и без ...
JBehave
77
JBehave + Serenity
78
79
Cucumber
есть диаграммы
80
Cucumber
минимум полезной суммарной информации
81
82
Cucumber
можно прикреплять скриншоты/логи
83
Cucumber Win
4 5 / 5
84
85
Заключение
Jbehave мощный, тяжелый инструмент
Cucumber модный, молодежный, стремительно развивающийся
Свои фишки и огранич...
87
‣ Чернышева Анна
‣ skype Ganna_Chernyshova
‣ facebook anna.chernyshova.79
‣ Ковалева Юлия
‣ skype juliana_kov
Контакты
88
Prochain SlideShare
Chargement dans…5
×

BDD girls Battle: Cucumber VS. JBehave

3 157 vues

Publié le

Доклад Юлии Ковалевой и Анны Чернышевой на конференции SQA Days-21
www.sqadays.com

Publié dans : Formation
  • Login to see the comments

  • Soyez le premier à aimer ceci

BDD girls Battle: Cucumber VS. JBehave

  1. 1. BDD girls battle JBehave vs Cucumber 1
  2. 2. Герои битвы ‣ JBEHAVE ‣ Чернышева Анна ‣ CUCUMBER ‣ Ковалева Юлия 2
  3. 3. Процессы разработки и тестирования в Альфа Лаборатории ‣ BDD ‣ парное программирование ‣ небольшие SCRUM команды ‣ стремление к кросс функциональности команд 3
  4. 4. Стоит ли переписывать готовый фреймворк на новый ради нескольких преимуществ? 4
  5. 5. ‣ Как решать похожие проблемы? Нужно ли решать? ‣ А если ничего не предпринимать? ‣ Наши решения и выводы - это не панацея ... ‣ Максимум полезного в одном докладе ‣ Возможно мы что-то не учли... Зачем нужна битва? 5
  6. 6. Selenium JUnit JAVA HttpClient Serenity JBehave Maven 6
  7. 7. Selenium JUnit JAVA HttpClient Serenity JBehave Maven 7
  8. 8. Selenium Selenide JAVA HttpClient Serenity JBehave Maven Gradle Rest Assured Cucumber JUnit 8
  9. 9. 9
  10. 10. Написание сценариев 10
  11. 11. Раунд 1 Ключевые слова Задача: Я хочу использовать текст шагов без привязки к ключевым словам When currency equals USD Then currency equals USD 11
  12. 12. JBehave 12
  13. 13. Cucumber "ru": { "and": [ "* ", "И ", "К тому же ", "Также " ], "background": [ "Предыстория", "Контекст" ], "but": [ "* ", "Но ", "А " ], gherkin-languages.json * = And | But | Given | When | Then When currency equals USD Then currency equals USD Given currency equals USD * currency equals USD 13
  14. 14. Cucumber 14
  15. 15. Cucumber Win 1 / 0 15
  16. 16. Раунд 2 Меньше повторов Задача: Я хочу использовать одну реализацию шага для нескольких текстовых описаний. Then there are 5 cards in the list Then there are 5 cards in the roll public void checkCardsAmountInTheList(int amount) { // ... } 16
  17. 17. JBehave 17
  18. 18. JBehave 18
  19. 19. JBehave 19
  20. 20. Cucumber ‣ Then there are 5 cards in the list ‣ Then there are 5 cards in the roll 20
  21. 21. JBehave Win 1 / 1 0 21
  22. 22. Раунд 3 Работа с датами Задача: Я хочу, чтобы дата передавалась в шаг в определенном формате. 22
  23. 23. JBehave @Given("ISO date format is $date") public void theIsoDateIs(@Named("date") Date date) { // ... } Given ISO date format is 09/09/2009 23
  24. 24. private ParameterConverter[] customConverters() { List<ParameterConverter> converters = new ArrayList<ParameterConverter>(); converters.add(new DateConverter(new SimpleDateFormat("yyyy-MM-dd"))); return converters.toArray(new ParameterConverter[converters.size()]); } JBehave 24
  25. 25. private ParameterConverter[] customConverters() { List<ParameterConverter> converters = new ArrayList<ParameterConverter>(); converters.add(new DateConverter(new SimpleDateFormat("yyyy-MM-dd"))); return converters.toArray(new ParameterConverter[converters.size()]); } JBehave 25
  26. 26. @Override public Configuration configuration(){ return new MostUsefulConfiguration() .useParameterConverters(new ParameterConverters() .addConverters(customConverters())) .useStoryLoader(new LoadFromClasspath(this.getClass())) .useStoryReporterBuilder(new StoryReporterBuilder() .withDefaultFormats() .withFormats(Format.CONSOLE, Format.TXT)); } JBehave 26
  27. 27. Cucumber 27 Feature: Date format of current date Scenario: Correct format * current date is 12.06.2014 Scenario: Incorrect format * current date is 2014-04-12
  28. 28. Cucumber 28
  29. 29. Cucumber (падающий тест) ConversionException: Couldn't convert "2014-04-12" to an instance of: [class java.util.Date] 29
  30. 30. Cucumber Win 1 2 / 1 30
  31. 31. Раунд 4 Ключевые слова на разных языках Задача: Владелец продукта хочет получать отчеты о тестировании на русском языке. 31
  32. 32. JBehave Создать properties файл с описанием ключевых слов Для русских слов i18n/keywords_ru.properties: Символы Unicode, используя кодировку ISO-8859-1 32
  33. 33. JBehave Определить ключевые слова в конфигурациях @Override public Configuration configuration() { //... Keywords keywords = new LocalizedKeywords(new Locale("ru")); //... } 33
  34. 34. JBehave Определить ключевые слова в конфигурациях @Override public Configuration configuration(){ ClassLoader classLoader = this.getClass().getClassLoader(); Keywords keywords = new LocalizedKeywords(new Locale("ru")); return new MostUsefulConfiguration() .useKeywords(keywords) .useStoryParser(new RegexStoryParser(keywords)) //... } 34
  35. 35. JBehave Определить ключевые слова в конфигурациях @Override public Configuration configuration(){ ClassLoader classLoader = this.getClass().getClassLoader(); Keywords keywords = new LocalizedKeywords(new Locale("ru")); return new MostUsefulConfiguration() .useKeywords(keywords) .useStoryParser(new RegexStoryParser(keywords)) //... } 35
  36. 36. JBehave 36
  37. 37. Cucumber 37 import cucumber.api.java
  38. 38. Cucumber + Java 8 38
  39. 39. Cucumber 39
  40. 40. Cucumber Win 2 3 / 1 40
  41. 41. Раунд 5 Аннотации жизненного цикла тестов Задача: Организовать для тестов пред/пост обработчики: * делать скриншот при каждом фейле * очищать куки перед каждым тестом 41
  42. 42. JBehave @BeforeScenario @BeforeScenario public void beforeEachScenario() { // ... } 42
  43. 43. JBehave @BeforeStory @BeforeStory // @BeforeStory(uponGivenStory=false) public void beforeStory() { // ... } @BeforeStory(uponGivenStory=true) public void beforeGivenStory() { // ... } 43
  44. 44. JBehave @AfterScenario public void afterAnyScenario() { // ... } @AfterScenario(uponOutcome=AfterScenario.Outcome.SUCCESS) public void afterSuccessfulScenario() { // ... } @AfterScenario(uponOutcome=AfterScenario.Outcome.FAILURE) public void afterFailedScenario() { // ... } @AfterScenario 44
  45. 45. JBehave @AfterStory @AfterStory //@AfterStory(uponGivenStory=false) public void afterStory() { // ... } @AfterStory(uponGivenStory=true) public void afterGivenStory() { // ... } 45
  46. 46. JBehave @BeforeStories @AfterStories @BeforeStories public void beforeCollectionOfStories() { // ... } @AfterStories public void afterCollectionOfStories() { // ... } 46
  47. 47. А теперь сначала ... @BeforeScenario @BeforeScenario public void beforeEachScenario() { // ... } 47
  48. 48. JBehave @BeforeStory @BeforeStory // @BeforeStory(uponGivenStory=false) public void beforeStory() { // ... } @BeforeStory(uponGivenStory=true) public void beforeGivenStory() { // ... } 48
  49. 49. JBehave @AfterScenario public void afterAnyScenario() { // ... } @AfterScenario(uponOutcome=AfterScenario.Outcome.SUCCESS) public void afterSuccessfulScenario() { // ... } @AfterScenario(uponOutcome=AfterScenario.Outcome.FAILURE) public void afterFailedScenario() { // ... } @AfterScenario 49
  50. 50. JBehave @AfterStory @AfterStory //@AfterStory(uponGivenStory=false) public void afterStory() { // ... } @AfterStory(uponGivenStory=true) public void afterGivenStory() { // ... } 50
  51. 51. JBehave @BeforeStories @AfterStories @BeforeStories public void beforeCollectionOfStories() { // ... } @AfterStories public void afterCollectionOfStories() { // ... } 51
  52. 52. Cucumber Всего 2 аннотации в наличии: @After и @Before. Настройки: @After("unstable") @After(value="unstable", order = 2, timeout = 3000) И интерфейс cucumber.api.Scenario ... 52
  53. 53. Cucumber пример 53
  54. 54. JBehave Win 3 / 2 1 54
  55. 55. Раунд 6 Заготовки или предусловия Задача: Было бы удобно выполнять некую последовательность шагов перед схожими по логике сценарями. Например: Хотим рисовать несколько картин разных художников 55
  56. 56. JBehave !-- Предусловие ко всей сторе GivenStories: path/to/openPaintAndCreateNewFile.story Scenario: Drawing Claude Monet picture Given file is opened When the user draws waterloo bridge Then they should see Claude Monet picture Scenario: Drawing Salvador Dali picture *** 56
  57. 57. JBehave Scenario:Drawing Claude Monet waterloo bridge picture !-- Предусловия к сценарию GivenStories: path/to/openPaintAndCreateNewFile.story, path/to/selectBlueBrush.story Given file is opened When the user draws waterloo bridge Then they should see Claude Monet picture 57
  58. 58. Cucumber Feature: Drawing Background: Given open Paint app When create new file Scenario Outline:Drawing picture Then file is opened When the user draws <nameOfPicture> Then they should see <author> picture Examples: |nameOfPicture | author | |waterloo bridge| Claude Monet | |elephants | Salvador Dali| 58
  59. 59. Cucumber Win 3 4 / 2 59
  60. 60. Раунд 7 Исключение тестов из запуска Задача: Исключить из запуска тестов набор, например, нестабильных тестов. 60
  61. 61. Cucumber 61
  62. 62. Cucumber @RunWith(Cucumber.class) @CucumberOptions( glue = {"ru.alfabank.steps", "steps"}, format = {"pretty", "json:build/cucumber/cucumber1.json"}, features = {"./src/test/resources/features/Статус платежа.feature"}, tags = {"~@unstable"} ) public class Runner { } 62
  63. 63. Cucumber @RunWith(Cucumber.class) @CucumberOptions( glue = {"ru.alfabank.steps", "steps"}, format = {"pretty", "json:build/cucumber/cucumber1.json"}, features = {"./src/test/resources/features/Статус платежа.feature"}, tags = {"~@unstable"} ) public class Runner { } 63 ./gradlew clean test -Dcucumber.options=”--tags ~@unstable”
  64. 64. JBehave Scenario: A scenario which we cannot run every time Meta: @skip @ignored true Given ... // normal scenario steps Аннотация @skip 64
  65. 65. JBehave Win 4 / 3 2 65
  66. 66. Раунд 8 Нереализованные шаги Задача: У меня еще не реализован шаг, но я хочу запускать тест и чтобы он не падал. 66
  67. 67. JBehave @Given("page is opened with title $title") @Pending public void pendingMethod(String title) { // not yet implemented } @Pending keyword 67
  68. 68. Cucumber @Pending можно навешивать на класс кастомных исключений Если метод кинет такое исключение, то шаг будет помечен как pending. В консоли: Then step was not written # AccountsSteps.notImplementedStep() cucumber.api.PendingException: TODO: implement me 68
  69. 69. Cucumber 69
  70. 70. JBehave Win 4 / 4 3 70
  71. 71. Раунд 9 Тестовые данные отдельно от тестов Задача: Я хочу одни и те же тестовые данные использовать для многих кейсов. Мне будет удобно хранить их в одном месте в файле. Возможно даже удаленно. 71
  72. 72. JBehave Scenario: The Examples tables could be loaded from external resources Given page is opened with <title> When user clicks on button <button> Then the alert status should be <status> Examples: org/project/examples/stories/allert.table 72
  73. 73. Cucumber 73
  74. 74. 4 / 5 4 JBehave Win 74
  75. 75. Отчеты о тестировании 75
  76. 76. Раунд 10 Удобный отчет о тестировании Задача: Я хочу предоставить своей команде удобный отчет без лишней информации и без подключения дополнительных библиотек. 76
  77. 77. JBehave 77
  78. 78. JBehave + Serenity 78
  79. 79. 79
  80. 80. Cucumber есть диаграммы 80
  81. 81. Cucumber минимум полезной суммарной информации 81
  82. 82. 82
  83. 83. Cucumber можно прикреплять скриншоты/логи 83
  84. 84. Cucumber Win 4 5 / 5 84
  85. 85. 85
  86. 86. Заключение Jbehave мощный, тяжелый инструмент Cucumber модный, молодежный, стремительно развивающийся Свои фишки и ограничения есть у каждого, также как и решения для быстрого старта проекта 86
  87. 87. 87
  88. 88. ‣ Чернышева Анна ‣ skype Ganna_Chernyshova ‣ facebook anna.chernyshova.79 ‣ Ковалева Юлия ‣ skype juliana_kov Контакты 88

×