Как сохранить код сухим при использовании функции в селене с testng? - PullRequest
1 голос
/ 13 апреля 2019

Давайте предположим, что у меня есть метод, который при вызове делает скриншот страницы и сохраняет его в папке.Я хочу узнать лучший способ использования метода, не повторяя себя, потому что сейчас работает так (я использую Selen-WebDriver с testng и Java):

public class TestClass{

@Test
public void firstTest(){
  step1();
  step2();
  takeScreenshot();
  step3();
  takeScreenshot();
  step4();
  takeScreenshot();
  step5();
  step6();
  takeScreenshot();
}

@Test
public void secondTest(){
  step1();
  step2();
  takeScreenshot();
  step3();
  takeScreenshot();
  step4();
  step5();
  step6();
  takeScreenshot();
}


}

Как вы можете видеть, прямо сейчасЯ вызываю метод после любого шага в тестовых методах, когда мне нужно сделать снимок экрана, но он не выглядит слишком чистым.Поэтому мне интересно, если это лучший способ сделать это.

Ответы [ 3 ]

0 голосов
/ 14 апреля 2019

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

Тем не менее, вы могли бы ...

A) Погрузите takeScreenshot() в функции step() и передайте флаг, который активирует его, когда истина. Однако использование таких флагов нарушает принцип Do One Thing , что делает дядю Боба раздражительным.

public void secondTest(){
  step1();
  step2(true);
  step3(true);
  step4();
  step5();
  step6(true);
}

B) Вы могли бы сделать что-то ДЕЙСТВИТЕЛЬНО причудливое и заставить все ваши step() функции возвращать this, так что вы можете связать их с помощью takeScreenshot() (что, я полагаю, находится в другом месте в TestClass). Это позволило бы вам совершить это (возможно, ужасное) преступление:

public void secondTest(){
  step1();
  step2().takeScreenshot();
  step3().takeScreenshot();
  step4();
  step5();
  step6().takeScreenshot();
}

C) Пожертвуйте возможностью настроить, будет ли снимок экрана сниматься после определенного действия, и просто жестко закодируйте его в набор действий, которые вас больше всего волнуют.

D) Или мой любимый вариант, оставь все как есть. То, что вы вызываете функцию снова и снова, не означает, что ваш код не СУХОЙ. Вы не дублируете никакой реальной логики Это больше строк кода, но эй, вы не собираетесь исчерпать строки. Чрезмерное различие и синтаксис могут сделать ваш код более читабельным, но если вы слишком сильно его сжимаете, пытаясь сделать 20 вещей в 12 строках, это может иметь неприятные последствия. Побалуйте себя этими дополнительными строками кода, это выходные, вы это заслужили.

0 голосов
/ 18 апреля 2019

Я советую вам пойти так: превратите каждый «шаговый» метод в тест. Затем используйте аннотации TestNG @BeforeTest или @AfterTest, например:

@Test
public void Step1()
{
    // write here step1 code...
}

@Test
public void Step2()
{
    // write here step2 code...
}

@AfterTest
public void takeScreenshot()
{
    // takeScreenshot method code goes here
}

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

0 голосов
/ 13 апреля 2019

Я не знаю, что делают шаги.Но если это утверждения, то вы можете просто разделить их на отдельные тесты и вызвать метод снимка экрана в методе @AfterTest.Таким образом, после каждого тестового снимка будет сделан снимок, и вам не нужно будет повторять вызов метода снимка экрана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...