Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

BDD girls Battle: Cucumber VS. JBehave

2,441 views

Published on

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

Published in: Education
  • Be the first to comment

  • Be the first to like this

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

×