Andrei Solntsev (asolntsev) wrote,
Andrei Solntsev
asolntsev

Category:

Bullshit driven development

Сегодня я хочу поговорить о тестировании.

Недавно я съездил на конференцию Selenium Camp в Киеве. Это было зыбско, чо. Познакомился с разными интересными людьми, занимающимися тестированием, в том числе из таких компаний, как Odnoklassniki и Yandex. А главное, я многое понял о том, почему тестировщики такие непохожие на нас.

Мы с коллегой ездили туда презентовать нашу библиотеку для UI-тестов Selenide. Естественно, мы хотели узнать, что используют другие.



BDD в тренде


Так вот, оказалось, что в моде нынче BDD - Behaviour Driven Development. В контексте UI тестов и Selenium больше всего говорили про фреймвокр Thucydides. Если коротко, это мега-гипер-монстр (одно только оглавление документации занимает 33 страницы!!!), заставляющий бедных тестировщиков писать много-много лишнего кода.

Ну давайте посмотрим для примера. Возьмём простой тест для авторизации пользователя, который с помощью Selenide можно было бы написать в четыре строчки:

@Test
public void userCanLoginByUsername() {
  open("/login");
  $(By.name("userName")).setValue("johny");
  $("#submit").click();
  $(".welcome").shouldHave(text("Hello, Johny!"));
}


Как реализовать его на Thucydides?
Тут нужно несколько шагов, начнём с малого.

Для начала нам понадобится написать Page Object:
  @FindBy(name="userName")
  private WebElement usernameInput;

  @FindBy(id="submit")
  private WebElement submitButton;

  public LoginPage(WebDriver driver) {
    super(driver);
  }

  public void enter_username(String username) {
    usernameInput.sendKeys(username);
  }

  public DashboardPage submit_login() {
    submitButton.click();
    return new DashboardPage(driver);
  }
}


Уже втрое больше кода. Но это только начало!

Идём дальше, теперь бедный тестировщик должен написать ещё Step Object:
  public EndUserSteps(Pages pages) {
    super(pages);
  }

  @Step
  public void logs_in_with(String usename) {
    enters_username(username);
    performs_login();
  }

  @Step
    public void enters_username(String username) {
    onLoginPage().enter_username(username);
  }

  @Step
  public void performs_login() {
    onLoginPage().submit_login();
  }

  private LoginPage onLoginPage() {
    return getPages().currentPageAt(LoginPage.class);
  }

  @Step
  public void should_see_welcome_message(String userFullName) {
    assertThat(onDashboardPage().getWelcomeMessage(), is(userFullName));
  }
}


Думаете, всё? Как бы не так, мы только на полпути.

Теперь надо ещё намонстрячить Story с описанием того, что делается, на "человеческом" языке:

  @Managed(uniqueSession = true)
  public WebDriver webdriver;

  @ManagedPages(defaultUrl = "http://localhost:8080/login")
  public Pages pages;

  @Steps
  public EndUserSteps endUser;

  @Issue("#WIKI-1")
  @Test
  public void logging_in_with_username_should_display_a_welcome_message() {
    endUser.is_the_login_page();
    endUser.logs_in_with("johny");
    endUser.should_see_welcome_message("Hello, Johny!");
  }
}


На этом месте я бы уже два раза сходил за кофе и всерьёз задумался об автоматизации написания этой хрени. Ну так вот, мы ещё не закончили! Остался ещё маленький шажок:
  @Feature
  public class Backend {
    public class ProcessSales {}
    public class ProcessSubscriptions {}
  }

  @Feature
  public class Contribute {
    public class AddNewArticle {}
    public class EditExistingArticle {}
  }
}


Вот теперь, кажется, всё. Можно сходить на обед, а потом начать запускать тесты и генерировать отчёты.

Зачем так сложно?


По-моему, очевидно, что такое написание тестов серьёзно подбрасывает работы тестировщикам. Шутка ли - написать 100 строк кода там, где можно обойтись четырьмя!
Я всё пытался понять, зачем такие сложности.

Ответ оказался простой: чтобы генерировать красивые отчёты. Шутка в том, что само название фреймворка "Thucydides" происходит от имени какого-то древнегреческого перца Фукидида, прославившегося не тем, что он что-то хорошо делал, а тем, что составлял красивые отчёты.

Ну так вот, вся эта хрень, описанная выше, нужна для того, чтобы сгенерировать примерно такой "красивый" отчёт:
In order to authenticate myself
As a user
I can log in by username


Конечно, этот отчёт будет весь такой цветастый и с картинками, типа такого.

Кому это нужно?


Возникает логичный вопрос: кому эти отчёты нужны?
Повсюду на конференции, буквально на каждом докладе, я слышал неизменное "Клиент хочет видеть отчёты". Но я общаюсь с клиентами, я знаю точно, что клиенту нахрен не нужны отчёты, клиенту нужен работающий софт! Клиенту нужно, чтобы с его сайта можно было продавать рыболовные снасти или заказать суши на дом, а отчёт он в гробу видел в белых папочках!
И вот в процессе разговоров в кулуарах я начал потихонечку понимать, в чём тут секрет. Похоже, тестировщики словом "клиент" называют ... менеджера! Вот кто хочет видеть отчёты!

Почему это плохо?


Смотрите что получается. Допустим, что в компании X работает 1000 тестировщиков, и ими управляют 10 менеджеров. Так вот эти 1000 человек мучаются, генерируют эти сотни строк ненужных излишних тестов, ездят на конференции по Selenium, борятся с Thucydides - и всё это только для того, чтобы сгенерировать красивые отчёты с картинками для этих 10 человек. Так не проще ли послать этих десятерых один раз на нормальный тренинг, чтобы они научились читать код??? Хотя бы названия тестовых методов? Да что там, хотя бы понимать обычный отчёт о тестах, генерируемый обычным Jenkins или TeamCity?

А знаете, что самое весёлое? Этим менеджерам тоже эти отчёты нафиг не нужны. Милые мои хорошие тестировщики, у меня для вас плохая новость: этим менеджерам отчёты нужны для галочки. У них в голове есть такой чекбокс: "Отчёты!" И им нужно мысленно поставить туда галочку. Мол, отчёты есть - всё, можно спать спокойно. А внутрь самих отчётов заглядывать не обязательно. Ну, иногда надо, конечно, заглянуть - для проформы. Показать подчинённым, что всевидящее око не дремлет, давайте генерируйте, не расслабляйтесь!

И что же делать?


Все, с кем мы обсуждали эту ситуацию на конференции, сходятся в одном: Украина - аутсорсинговая страна, внешние компании заказывают в Украине разработку (в т.ч. тестирование), потому что дёшево. А украинским компаниям выгодно заставлять своих работников монстрячить мегатесты с красивыми репортами, потому что это всё часы, выливающиеся в деньги. Очевидно, что такая ситуация характерна не только для Украины, но и для всего постсоветского пространства. Да и вообще для почти всего IT-сектора. Так что ничего не поделаешь, такая система.

Там, где одни видят барьеры, другие видят возможности.
Смельчак, который сколотит свою фирму, в которой будут писать эффективный код (в том числе эффективные тесты) - озолотится.

Эгегей, украинские смельчаки!

Выбросьте тонны мусора из своего кода.

Пишите эффективные тесты.


Tags: it
Subscribe

  • О глобальной дискриминации, или зачем программисту уметь говорить

    Предыстория: 9 марта портал Delfi опубликовал моё интервью, приуроченное к грядущей конференции TEDLasnamae. Правда, они зачем-то сильно обрезали…

  • No Wanna No Cry

    Ух ты, я опять мелькнул в телеке! На сей раз я рассказывал на канале ЭТВ+ в передаче "ТВой вечер" про компьютерный вирус WannaCry.…

  • SoftwareStories: крошка Енот

    Ходил сегодня в театр на детский спектакль "Крошка-Енот", и очень он мне напомнил это наше ОЙТИ. Суть спектакля в том, что все звери очень боялись…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 20 comments

  • О глобальной дискриминации, или зачем программисту уметь говорить

    Предыстория: 9 марта портал Delfi опубликовал моё интервью, приуроченное к грядущей конференции TEDLasnamae. Правда, они зачем-то сильно обрезали…

  • No Wanna No Cry

    Ух ты, я опять мелькнул в телеке! На сей раз я рассказывал на канале ЭТВ+ в передаче "ТВой вечер" про компьютерный вирус WannaCry.…

  • SoftwareStories: крошка Енот

    Ходил сегодня в театр на детский спектакль "Крошка-Енот", и очень он мне напомнил это наше ОЙТИ. Суть спектакля в том, что все звери очень боялись…