company_banner

Вредные советы: как превратить автоматизацию UI-тестов в кошмар

http://www.inflectra.com/Ideas/Entry/558.aspx
  • Перевод


Привет! Меня зовут Артём, и я занимаюсь автоматизацией тестирования. Антипаттерны в разработке — довольно популярная тема. Но ведь в тестировании тоже есть свои "плохие советы", и они довольно забавно пересекаются с разработкой. Недавно мне на глаза попалась ироничная статья про антипаттерны в тестировании. Вашему вниманию!


Мы стараемся как можно скорее доказать, что неправы, потому что только таким образом можем развиваться.
Ричард Фейнман

Есть много способов усложнить жизнь командам автоматизации тестирования. Если вы разработчик или системный архитектор, и недолюбливаете кого-то из тестировщиков, то эта статья — для вас. Вы найдете в ней сокровенное знание, вдохновившись которым, вы научитесь делать интерфейс любого приложения практически непригодным для тестирования.


Ну, а если вы добрая душа и уважительно относитесь к чужому труду, то можете рассматривать эту статью как набор антипаттернов.


Итак, поехали.


Сборник проклятий


Идентификация


Самая первая ваша задача — сделать идентификацию элементов интерфейса чересчур трудной или совершенно невозможной.


Эмпирическое правило: никаких ID.


Никогда не присваивайте элементам интерфейса какие-либо ID. C их помощью инструментам автоматизированного тестирования проще всего находить элементы. Кроме того, даже при изменении макета интерфейса ID сохраняются и позволяют находить элементы. А вот без ID тестирование наверняка провалится.


Динамические ID


Если вы не можете избавиться от ID, то хотя бы сделайте их динамическими. Генерируйте новое значение при каждом отображении представления (view) пользователю. И тогда все тесты, использующие фиксированные значения ID, будут автоматически сломаны сразу же после записи.


Динамический заголовок приложения


Это прекрасная идея — добавлять время в главный заголовок окна приложения. Например:


Platinum CRM - ACME - December 19, 02:46:23 pm


Эта методика может усложнить не только определение элементов интерфейса, но и процесс записи теста. Представьте, что объекты внутри инструмента автоматизированного тестирования группируются по заголовку окна — тогда каждый объект превратится в отдельную группу.


Время выполнения


При обновлении данных длительность открытия диалога или загрузки страницы может быть непредсказуемой. Это заставит инженеров по автоматизации использовать в тестах много выражений синхронизации.


Подождите! Есть и другие способы сделать время выполнения совершенно случайным.


Неэффективная реализация обработки данных


Это очень просто. При реализации ПО не думайте об объеме данных, проверяйте код с помощью маленьких баз данных и в одном-единственном окружении. Гарантирую, что при реальной нагрузке ваша программа будет отвечать медленно.


Развёртывание во враждебной среде


Разверните серверную часть своего решения в виртуальной машине, которая хостится на сервере с кучей других ВМ. Есть большая вероятность, что эти соседние ВМ заберут ресурсы процессора/памяти/диска, когда они вам больше всего нужны.


Вспомогательные API


Никогда не реализуйте в своём приложении интерфейсы доступа вроде UI Automation и ARIA, иначе у тестировщиков будет эффективный способ автоматизации взаимодействия с приложением. Вы просто не имеете права давать им такую власть.


Почаще обновляйте макет интерфейса


Меняйте макет каждую неделю. Вместе с вышеприведёнными советами это просто убьёт тестировщиков. Возможно, они даже начнут фантазировать о ручном тестировании, потому что в этом случае они не будут видеть результаты своей работы лежащими в руинах.


Не давайте им шансов


Состояние приложения


Ваше приложение не должно никак показывать своё текущее состояние и что оно делает. Не разглашайте ничего, что можно использовать для понимания происходящего или проверки корректности поведения приложения. Никаких панелей состояния, никаких навигационных цепочек. Не давайте возможности понять, что приложение сейчас чем-то занято.



Приложение не должно поддерживать альтернативные способы навигации или взаимодействия, вроде сочетаний клавиш. Хотите перемещаться по меню? Мышь и только мышь. Хотите перейти к другой ячейке? Только мышь, стрелки на клавиатуре работать не должны. Короче, вы поняли суть.


Логи


Не пишите никаких логов. Они могут дать информацию о проблемах и содержать подсказки к их исправлению.


Кнопки с иконками


Используйте кнопки с иконками и ни при каких обстоятельствах не делайте подписи или текстовые подсказки для кнопок. В сочетании с отсутствием ID это сделает идентификацию почти невозможной или очень ненадёжной.


В заключение


Помните! Чтобы превратить тестирование интерфейса в кошмар, нужно следовать базовым принципам:


  • Сделать ненадёжной идентификацию объектов.
  • Сделать непредсказуемым поведение приложения.
  • Изменять интерфейс так, чтобы это ломало тесты и превращало их в мусор.
  • Приложение должно быть чёрным ящиком для инструментов автоматизированного тестирования.
  • Эффективно пресекайте любые попытки обходов, вроде сочетаний клавиш или анализа логов.

И наконец, если тестировщики попросят сделать что-то, противоречащее этим советам, просто игнорируйте.


Удачи!

Badoo 467,41
Big Dating
Поделиться публикацией
Комментарии 11
    +1
    Это забавно! :)
      +4
      … если бы не так грустно.
      0

      Фреймворки Vaadin и GWT генерируют уникальные id для элементов и от этого не уйти, но это обходится в одну строку.

        0
        у нас вот первому совету очень четко следуют…
          +1
          Где-то читал, что лучше id вообще не использовать, т.к. есть вероятность, что появятся два элемента с одинаковым id.
            +1

            Кстати, вполне разумное замечание. Но какой-то уникальный идентификатор все равно должен быть. Например, dataset атрибуты или список классов

              0
              Можно делать id-шники хоть с мегабайты длиной.
              Можно закладывать в id всю иерархию компонента.
              Можно поменять id если таки нарвался на неуникальность.
              Id очень сильно помогают в автотестах, очень. Это скорость и стабильность. Особенно во всяких ExtJs, где по умолчанию id генерится динамически.
                0

                Мне кажется, что автор имел в виду не прямо вот дословно атрибут ID, а некоторый уникальный идентификатор. Например, data-id или data-qa-id.

                  0
                  Я не понимаю зачем извращаться с аттрибутами, если есть функционал настоящих id. Мгновенный поиск, уникальность, все из коробки. Только называй правильно и кайфуй. Вот есть некая пугалка «вдруг неуникальный будет», ну продумайте архитектуру — да сделайте систему уникальных, и будет вам оч. большое счастье в виде скорости и стабильности тестов.
                    0

                    ¯_(ツ)_/¯
                    Вы, конечно, правы. Если есть возможность сделать хорошо — нужно делать хорошо.

              0
              delete this comment, please.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое