Коллеги, этот топик постепенно скатывается из обсуждения чего-то «высокого» в обсуждение каких-то антипаттернов в программировании.
Про антипаттерны для программистов написано много интересного… Тем не менее, не все антипаттерны для программирования приложений нужно считать антипатернами для программирования тестов.
Парочка примеров:
- погуглите что люди пишут про Singleton. Так это паттерн или антипаттерн?
- А какие аргументы приводят те, кто считает Singleton антипатерном?
Копи-паст… Это конечно же плохо… особенно когда копи-пастится текст локатора, вместо того чтобы завести для локатора переменную, или константу, или поместить в PageObject.
А вот для шагов в коде теста, копи-паст не так уж и плох, в разумных пределах, конечно. Я всегда за то, чтобы вынести повторяющийся код в параметризируемые методы… Вынести в метод – это просто. Но, иногда для этого приходится создавать очень непростые абстракции. Это например паттерн «Шаблонный» метод или «Стратегия». Эти два паттерна избавляют от цепочек if-ов… Я пробовал их использовать, и скажу: ну нет уж… иногда лучше if-ы.
Свое длинное вступление я хочу завершить вот этим чудо видео, которое может помочь в освоении «чистого кода» (да, да который попахивает только шампунем):
А теперь немного по теме:
@mindjin, на самом деле, верно или нет вы пишите код – очень зависит от контекста. Если вы просто хотите написать тест «без задней мысли»
– то выбранный вами подход не верен для Java.
Java – это типизированный язык объектно-ориентированный язык. И код, который на нем пишется должен соответствовать этому стилю. Должны быть классы, методы.
Команды, переданные текстовыми строками, как то «edit» или «verify» – идут вопреки идее языка.
Огромный один единственный метод, который делает всё на свете – говорит о том, что в его коде вы скоро утонете.
Я предлагаю, вместо:
card.popup("Имя","12345","Edit")
card.popup("Имя","12345","Verify")
Создать и вызывать отдельные методы:
card.editName("12345");
card.verifyName("12345");
Таким образом, вы сделаете много маленьких методов, вместо большого кейса. Каждый метод будет решать свою задачу. Вам может показаться то, что писать все в одном методе с огромном кейсе – намного лёгче… это так и есть. Но, в долгосрочной перспективе, подход с методами облегчит поддержку кода.
@mindjin, а хотите теперь я найду аргумент в защиту вашего кода?
Вот представляете, у вас есть внешний Excel файл следующего формата:
Field Value Command
Имя 123 Edit
Имя 123 Verify
Если вы хотите чтобы непонимающие в программировании мануальщики писали вам тесты – то вам достаточно написать парсер этого файла, ну что-то по типу (псевдокод):
while (excel.HasNextLine())
{
columns = excel.ReadNextLine()
card.popup(columns[0],columns[1],columns[2])
}
Вы вот движок (парсер) напишете один раз, а мануальщики без перекомпиляции страшного кода, будут вам всю жизнь такие Excel’ки писать.
Так работают многие Keyword-Driven фреймворки, например вот этот:
Что-то похожее, я уверен, можно найти и в Robot Framework.
На одном моем проекте был такой парсер. И исторически, он вырос до огромных размеров. Даже, учитывая то, что мы выносили большую часть реализации в отдельные методы. Когда один человек уходил его дебажить… то мы знали, что сегодня он уже не вернётся…
Если вам это не нужно сейчас… то используйте отдельные небольшие, чёткие, конкретные методы, пока судьба не заставит вас писать подобные парсеры.