3. Процессы разработки и тестирования
в Альфа Лаборатории
‣ BDD
‣ парное программирование
‣ небольшие SCRUM команды
‣ стремление к кросс
функциональности команд
3
5. ‣ Как решать похожие проблемы?
Нужно ли решать?
‣ А если ничего не предпринимать?
‣ Наши решения и выводы - это не
панацея ...
‣ Максимум полезного в одном
докладе
‣ Возможно мы что-то не учли...
Зачем нужна
битва?
5
16. Раунд 2 Меньше повторов
Задача: Я хочу использовать одну реализацию
шага для нескольких текстовых описаний.
Then there are 5 cards in the list
Then there are 5 cards in the roll
public void checkCardsAmountInTheList(int amount) {
// ...
}
16
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
31. Раунд 4 Ключевые слова на разных языках
Задача: Владелец продукта хочет получать отчеты
о тестировании на русском языке.
31
32. JBehave
Создать properties файл с описанием ключевых слов
Для русских слов i18n/keywords_ru.properties:
Символы Unicode, используя кодировку ISO-8859-1
32
33. JBehave
Определить ключевые слова в конфигурациях
@Override
public Configuration configuration() {
//...
Keywords keywords = new LocalizedKeywords(new Locale("ru"));
//...
}
33
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. 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
41. Раунд 5 Аннотации жизненного цикла тестов
Задача: Организовать для тестов пред/пост
обработчики:
* делать скриншот при каждом фейле
* очищать куки перед каждым тестом
41
52. Cucumber
Всего 2 аннотации в наличии: @After и @Before.
Настройки:
@After("unstable")
@After(value="unstable", order = 2, timeout = 3000)
И интерфейс cucumber.api.Scenario ...
52
55. Раунд 6 Заготовки или предусловия
Задача: Было бы удобно выполнять некую последовательность
шагов перед схожими по логике сценарями.
Например: Хотим рисовать несколько картин
разных художников
55
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. 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. 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
66. Раунд 8 Нереализованные шаги
Задача: У меня еще не реализован шаг, но я хочу
запускать тест и чтобы он не падал.
66
67. JBehave
@Given("page is opened with title $title")
@Pending
public void pendingMethod(String title) {
// not yet implemented
}
@Pending keyword
67
68. Cucumber
@Pending можно навешивать на класс кастомных исключений
Если метод кинет такое исключение, то шаг будет помечен как
pending.
В консоли:
Then step was not written
# AccountsSteps.notImplementedStep()
cucumber.api.PendingException: TODO: implement me
68
71. Раунд 9 Тестовые данные отдельно от тестов
Задача: Я хочу одни и те же тестовые данные
использовать для многих кейсов. Мне будет удобно
хранить их в одном месте в файле. Возможно даже
удаленно.
71
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
76. Раунд 10 Удобный отчет о тестировании
Задача: Я хочу предоставить своей команде удобный
отчет без лишней информации и без подключения
дополнительных библиотек.
76
86. Заключение
Jbehave мощный, тяжелый инструмент
Cucumber модный, молодежный, стремительно развивающийся
Свои фишки и ограничения есть у каждого, также как и решения для
быстрого старта проекта
86