Рекомендация по построению кода

Я попытался автоматизировать вход в систему с помощью Katalon Studio и Selenium|testNG. Я использовал файл XML для отправки значения браузера в скрипт, который я вставил сюда.

    public class TC_Testportal {
       private WebDriver driver;
       private String baseUrl; 

    @Parameters("browser")
    @BeforeMethod
    public void beforeMethod(String browser) {
     if (browser.equals("firefox")) {
        System.setProperty("webdriver.gecko.driver", "drivers\\geckodriver.exe");
        driver = new FirefoxDriver();
        baseUrl = "https://test.com";
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    } else if (browser.equals("chrome")) {
        System.setProperty("webdriver.chrome.driver", "drivers\\chromedriver.exe");
        driver = new ChromeDriver();
        baseUrl = "https://test.com";
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        driver.manage().window().maximize();
    }
}  

    @Test
    public void tc001() {
    driver.get(baseUrl);
    //Empty user-name|password validation
    driver.findElement(By.xpath("//input[@id='username']")).click();
    driver.findElement(By.xpath("//input[@id='username']")).clear();
    driver.findElement(By.xpath("//input[@id='username']")).sendKeys("");
    driver.findElement(By.xpath("//input[@id='userpassword']")).click();
    driver.findElement(By.xpath("//input[@id='userpassword']")).clear();
    driver.findElement(By.xpath("//input[@id='userpassword']")).sendKeys("");
    driver.findElement(By.xpath("(.//*[normalize-space(text()) and normalize-space(.)='SIGN IN'])[1]/following::div[2]")).click();
    System.out.println("Empty user-name|password validation - CHECKED");

    //Empty password validation
    driver.findElement(By.xpath("//input[@id='username']")).click();
    driver.findElement(By.xpath("//input[@id='username']")).clear();
    driver.findElement(By.xpath("//input[@id='username']")).sendKeys("test");
    driver.findElement(By.xpath("//input[@id='userpassword']")).click();
    driver.findElement(By.xpath("//input[@id='userpassword']")).clear();
    driver.findElement(By.xpath("//input[@id='userpassword']")).sendKeys("");
    driver.findElement(By.xpath("(.//*[normalize-space(text()) and normalize-space(.)='SIGN IN'])[1]/following::button[1]")).click();
    System.out.println("Empty password validation - CHECKED");

    //Empty user-name validation
    driver.findElement(By.xpath("//input[@id='username']")).click();
    driver.findElement(By.xpath("//input[@id='username']")).clear();
    driver.findElement(By.xpath("//input[@id='username']")).sendKeys("");
    driver.findElement(By.xpath("//input[@id='userpassword']")).click();
    driver.findElement(By.xpath("//input[@id='userpassword']")).clear();
    driver.findElement(By.xpath("//input[@id='userpassword']")).sendKeys("123");
    driver.findElement(By.xpath("(.//*[normalize-space(text()) and normalize-space(.)='SIGN IN'])[1]/following::div[2]")).click();
    System.out.println("Empty user-name validation - CHECKED");

 }
 @AfterMethod
   public void afterMethod() {
   driver.quit();
   } 
 }

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

Любые советы/предложения, связанные с построением кода/качеством кода/именованием параметров/нумерацией тестовых наборов и т. д., будут высоко оценены.


person user3806999    schedule 21.08.2019    source источник


Ответы (3)


Несколько вещей, которые следует отметить в отношении общего кода,

  1. Я вижу, вы продублировали один и тот же код. Например, driver.findElement(By.xpath("//input[@id='username']")).click(); Имеет 3 дубликата. Дублирование — это плохо, так как код будет сложно поддерживать и читать.
  2. Тестирование 3 тестовых сценариев в рамках одного @Test. Лучше разделить это на 3 теста или создать драйвер данных тестового примера.
  3. Попробуйте сделать свой код модульным, чтобы увеличить возможность повторного использования. Например, содержимое @BeforeMethod можно переместить в отдельный класс DriverManager и сделать его пригодным для использования во всех тестах.
  4. Попробуйте адаптировать шаблон проектирования, например Модель объекта страницы, Фабрика страниц
person Asanka V    schedule 21.08.2019
comment
Спасибо за ваши советы. Я буду следовать им. Я использовал студию Katalon (расширение Chrome), чтобы получить этот код. Я экспортировал как (WebDriver + TestNG). Затем я запустил его в eclipse. Это неправильный метод для подражания в автоматизированном тестировании? - person user3806999; 22.08.2019
comment
Я думаю, что вы используете подход записи и воспроизведения, как объяснено. С него хорошо начинать, но в реальном мире вам нужно спроектировать и реализовать свой код более удобным для обслуживания способом IMO. - person Asanka V; 22.08.2019
comment
Я начал изучать POM. Я увидел, что избыточность может быть сведена к минимуму с помощью этого шаблона. Большое вам спасибо. Я думал, что это текущий метод (Katalon Recorder + Selenuim + TestNG) для автоматизированного тестирования. На самом деле я хотел провести регрессионные тесты. с несколькими значениями (поставщик данных testNG). Поэтому я подумал, что это будет самый простой способ сделать это, не учитывая повторения. Спасибо за ваши советы. - person user3806999; 22.08.2019

поскольку вы работаете с Katalon, у него есть встроенная функция для хранения всех объектов (хранилище объектов), например: "//input[@id='username']", https://docs.katalon.com/katalon-studio/docs/manage-test-object.html

вы можете переместиться ниже в это место

    driver.findElement(By.xpath("//input[@id='username']")).clear();
    driver.findElement(By.xpath("//input[@id='username']")).sendKeys("");
    driver.findElement(By.xpath("//input[@id='userpassword']")).click();
    driver.findElement(By.xpath("//input[@id='userpassword']")).clear();
    driver.findElement(By.xpath("//input[@id='userpassword']")).sendKeys("");
    driver.findElement(By.xpath("(.//*[normalize-space(text()) and normalize-space(.)='SIGN IN'])[1]/following::div[2]")).click();
driver.findElement(By.xpath("//input[@id='username']")).click();
    driver.findElement(By.xpath("//input[@id='username']")).clear();
    driver.findElement(By.xpath("//input[@id='username']")).sendKeys("test");
    driver.findElement(By.xpath("//input[@id='userpassword']")).click();
    driver.findElement(By.xpath("//input[@id='userpassword']")).clear();
    driver.findElement(By.xpath("//input[@id='userpassword']")).sendKeys("");
    driver.findElement(By.xpath("(.//*[normalize-space(text()) and normalize-space(.)='SIGN IN'])[1]/following::button[1]")).click();
driver.findElement(By.xpath("//input[@id='username']")).click();
    driver.findElement(By.xpath("//input[@id='username']")).clear();
    driver.findElement(By.xpath("//input[@id='username']")).sendKeys("");
    driver.findElement(By.xpath("//input[@id='userpassword']")).click();
    driver.findElement(By.xpath("//input[@id='userpassword']")).clear();
    driver.findElement(By.xpath("//input[@id='userpassword']")).sendKeys("123");
    driver.findElement(By.xpath("(.//*[normalize-space(text()) and normalize-space(.)='SIGN IN'])[1]/following::div[2]")).click();```

and if you are using Katalon you don't need to call the browser drivers, since Katalon has those in their product 
person lahimadhe    schedule 21.08.2019

Чтобы дать вам пример того, о чем @Asanka говорит, говоря о дублировании кода, взгляните на это. У вас часто повторяется этот фрагмент кода

driver.findElement(By.xpath("//input[@id='username']")).click();
driver.findElement(By.xpath("//input[@id='username']")).clear();
driver.findElement(By.xpath("//input[@id='username']")).sendKeys("");

на разных элементах.

Лучшим подходом было бы поместить все три строки в метод. Назовем этот метод sendKeysToElement():

public static void sendKeysToElement(){
    driver.findElement(By.xpath("//input[@id='username']")).click();
    driver.findElement(By.xpath("//input[@id='username']")).clear();
    driver.findElement(By.xpath("//input[@id='username']")).sendKeys("");
}

Далее вы можете заметить, что Xpath элемента также повторяется три раза. Итак, давайте извлечем XPath как параметр:

public static void sendKeysToElement(String xpathToElement){
    driver.findElement(By.xpath(xpathToElement)).click();
    driver.findElement(By.xpath(xpathToElement)).clear();
    driver.findElement(By.xpath(xpathToElement)).sendKeys("");
}

Это упростит ваш тест (я покажу вам это только до части //Empty password validation):

    //Empty user-name|password validation
    sendKeysToElement("//input[@id='username']")
    sendKeysToElement("//input[@id='userpassword']")
    driver.findElement(By.xpath("(.//*[normalize-space(text()) and normalize-space(.)='SIGN IN'])[1]/following::div[2]")).click();
    System.out.println("Empty user-name|password validation - CHECKED");

Это известно как принцип DRY (не повторяйтесь). Дальнейшее чтение здесь и здесь.

person Mate Mrše    schedule 21.08.2019
comment
Большое спасибо за ваши усилия. Это мне очень помогает, я использовал студию Katalon (расширение Chrome), чтобы получить этот код. Я экспортировал как (WebDriver + TestNG). Затем я запустил его в eclipse. Это неправильный метод следовать в автоматизированном тестировании? - person user3806999; 22.08.2019
comment
Итак, вы используете Katalon Recorder? Нет проблем, нет неправильных или правильных методов. Есть те, которые работают, и те, которые не работают. Это хорошее начало (использование рекордеров), но вы захотите переключиться на кодированные решения, такие как Katalon Studio (не рекордер) или Selenium, поскольку они дают вам гораздо больше возможностей и гибкости. - person Mate Mrše; 22.08.2019
comment
Спасибо @mate mrse, я думал, что это одно из лучших решений. Я уже начал уроки по селену. Я буду следить за Katalon и дальше. Большое спасибо еще раз. - person user3806999; 22.08.2019