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.
1 of 88

BDD girls Battle: Cucumber VS. JBehave

1

Share

Download to read offline

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

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

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

×