Рубрики
Без рубрики

TestNG vs JUnit: Какой фреймворк тестирования вам следует выбрать?

Платформа автоматизации тестирования – это набор компонентов, который облегчает выполнение тестов вместе с… С тегами testng, junit, java, framework.

Платформа автоматизации тестирования – это набор компонентов, который облегчает выполнение тестов наряду с отчетностью о результатах выполнения теста. Однако поиск подходящей платформы автоматизации тестирования может оказаться очень сложной задачей, поскольку в вашем распоряжении так много вариантов. Представьте себе это – при выполнении тестирования Selenium automation с использованием Java вам приходится выбирать из изнурительного списка 10 фреймворков тестирования Java .

Что касается фреймворков автоматизации тестирования в Selenium Java, JUnit и TestNG являются предпочтительными по сравнению с другими фреймворками в списке. Некоторые из уместных вопросов заключаются в следующем:

  • Как JUnit сопоставляется с тестированием в сравнении TestNG и JUnit?
  • Можно ли запускать тесты JUnit с помощью TestNG (и наоборот)?
  • Какие аннотации присутствуют в JUnit и TestNG?

Параллельное сравнение TestNG и JUnit даст четкое представление о том, как две известные платформы автоматизации тестирования сочетаются друг с другом. Выявление разницы между фреймворками JUnit и TestNG в Selenium WebDriver поможет определить наиболее подходящий фреймворк для автоматизированных тестов.

В этом блоге мы проводим тщательное сравнение TestNG и JUnit, изучение которого поможет принять мудрое решение о выборе идеальной среды автоматизации тестирования для вашего проекта. В этом сравнении TestNG и JUnit мы использовали JUnit 5 (последнюю версию JUnit framework) для демонстрации примера реализации.

Введение в JUnit и тестирование Фреймворков автоматизации тестирования

Прежде чем мы начнем сравнение TestNG и JUnit, давайте рассмотрим некоторые основные особенности этих двух фреймворков. JUnit – это платформа модульного тестирования с открытым исходным кодом для Java, которая была впервые представлена в 1997 году. На момент написания этого блога JUnit 5 является последней версией фреймворка JUnit. Поскольку Selenium framework поддерживает Java, многие инженеры по контролю качества предпочитают использовать JUnit framework для тестирования веб-автоматизации. В случае, если вы начинаете работу с JUnit, вы можете ознакомиться с нашим предыдущим блогом, который помогает в настройке среды JUnit для первого теста .

Testing также является популярной платформой тестирования с открытым исходным кодом для Java. Тестирование было создано в 2007 году с целью охватить более широкий спектр категорий тестов – Модульное тестирование, Функциональное тестирование, Сквозное тестирование, Интеграционное тестирование и многое другое. На момент написания этого блога последняя версия TestNG – 7.3.0. Вы можете ознакомиться с нашим вводным блогом о том, как создать проект тестирования в Eclipse для реализации тестирования веб-автоматизации с помощью TestNG.

Необходимо знать разницу между JUnit и TestNG, чтобы вы могли принять обоснованное решение, когда дело доходит до выбора идеальной среды автоматизации тестирования. Это основная причина, по которой мы придумали прямое сравнение Testng и JUnit.

TestNG vs JUnit – Сравнение лучших фреймворков автоматизации тестирования

И TestNG, и JUnit являются одними из лучших фреймворков автоматизации в Java. Несмотря на то, что они чрезвычайно популярны, факт заключается в том, что оба фреймворка имеют свои плюсы и минусы. Мы бы сохранили это обсуждение для более позднего блога, поскольку тестирование против JUnit может быть хорошим ориентиром для выбора фреймворка для вашего проекта автоматизации.

Для сравнения TestNG и JUnit мы использовали JUnit 5 (последнюю версию JUnit framework) вместо JUnit 4 framework. Если вы все еще используете фреймворк JUnit 4 с Selenium WebDriver, вы все равно можете выполнять тесты JUnit4 с помощью фреймворка JUnit 5 .

Ниже показано подробное различие между фреймворками JUnit и TestNG в Selenium WebDriver:

Наборы тестов в JUnit и TestNG

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

JUnit 5 был переработан, чтобы преодолеть ограничения предыдущих версий JUnit (включая JUnit 4). Концепция наборов тестов была введена в JUnit 5, поскольку Junit 4 (и более ранние версии JUnit) не предоставляли возможности создания наборов тестов.

Наборы тестов в JUnit 5 реализованы с использованием классов @RunWith и @suite

@RunWith(Suite.class)

@Suite.SuiteClasses({
   JUnitTestSuiteDemo1.class,
    JUnitTestSuitDemo2.class
})

При тестировании набор тестов определяется в xml-файле (например testng.xml ) Тег suite определен в файле, как показано ниже:





  
    
       

Аннотации в JUnit и TestNG

Аннотации в среде автоматизации тестирования предоставляют дополнительную информацию о классе или методе тестирования. Для краткого обзора ознакомьтесь с нашим подробным руководством по аннотациям TestNG для автоматизации Selenium.

Поддержку аннотаций можно рассматривать как один из важных моментов сравнения TestNG и JUnit. И JUnit, и TestNG являются фреймворками, основанными на аннотациях.

Большинство аннотаций в TestNG и JUnit предлагают ту же функциональность с небольшим изменением в номенклатуре именования. Разница между JUnit и TestNG с точки зрения аннотаций заключается в том, что тестирование имеет некоторые дополнительные аннотации по сравнению с JUnit.

Вот сравнение TestNG и JUnit в том, что касается аннотаций:

Ознакомьтесь с нашим предыдущим блогом на Аннотации JUnit в Selenium WebDriver , чтобы получить подробную информацию об аннотациях в упомянутом фреймворке.

TestNG vs JUnit: Управление тестовыми примерами в фреймворках TestNG и JUnit

Управление выполнением тестового набора намного проще в тестировании по сравнению с JUnit. При тестировании инженеры по контролю качества могут группировать тесты, игнорировать тесты, параметризовать тесты и эффективно писать зависимые тесты.

Давайте рассмотрим каждый из этих пунктов в этом разделе сравнения тестирования и JUnit:

  • Группировка Тестовых примеров

При тестировании вы можете сгруппировать тестовые примеры, просто указав параметры в аннотации @test, как показано ниже:

@Test(groups={"groupname1",<"group2">..,<"groupN">})

Вы можете ознакомиться с нашим подробным блогом на как группировать тестовые примеры в тестировании для получения дополнительной информации о группировке тестов в TestNG. Конкретную группу (группы) можно выполнить, указав имя (имена) в XML-файле в тегах <группы> и <выполнить>, как показано ниже:

  
    
       
          
       
    
   
      
          
          
      
      
     
        
     
     

Здесь будут выполнены тесты в группе "Панель мониторинга". JUnit не предоставляет простого способа группировки тестовых примеров.

  • Игнорировать тест

Существуют сценарии, в которых вам может потребоваться выполнить выбранный набор тестов из огромного набора тестов. Тестовые примеры, которые не нужно выполнять, должны быть проигнорированы. Игнорирование тестов в JUnit и TestNG особенно полезно, когда необходимо протестировать только определенную функцию.

Платформы автоматизации TestNG и JUnit предоставляют функцию, при которой тесты можно игнорировать. При тестировании мы можем указать параметр в аннотации @test, как показано ниже:

@Test(enabled=false)
public void TestIgnoreDemo()
{  
    /* Implementation goes here */
}

В Junit 5 аннотация @ignore используется для игнорирования тестовых примеров:

@Ignore
public void TestIgnoreDemo()
{
    /* Implementation goes here */
}
  • Параметризация

Параметризация в наборе тестов позволяет запускать определенный тест с различными входными значениями. Улучшенная возможность повторного использования и удобочитаемость кода являются основными преимуществами параметризации при автоматизированном тестировании. Параметризация может оказаться выгодной сделкой при сравнении TestNG и JUnit.

При тестировании передача параметров в testcase проста. Он использует аннотацию @Parameter с параметром для данного метода тестирования. Аннотацию @Parameters следует использовать в случае, если вы хотите передать методу более одного параметра.

public class Demo {
    @Test
    @Parameters({"browser"})
    public void demoTest(String browser)
    {
        System.out.println("The browser Is : " + browser);
    }
}

Значение переменной 'browser' объявляется в xml-файле (например testng.xml ), как показано ниже:


  
      
      
      
          
      
  

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

В JUnit параметры могут быть переданы с помощью аннотации @ParameterizedTest:

@ParamerizedTest
@ValueSource(strings = { "Chrome", "IE", "Safari" })
void DemoParameterize(String browser) {
    void  setBrowser("The browser is:"+browser));
}

При выполнении приведенного выше кода тестовая демонстрационная параметризация будет запущена отдельно с такими входными параметрами, как Chrome, IE и Safari. Вы можете ознакомиться с нашим подробным блогом о параметризации в JUnit с помощью Selenium Driver, чтобы получить представление о том, как использовать параметризованные тесты в JUnit.

  • Зависимый тест

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

При тестировании зависимые методы могут быть определены с помощью аннотации @dependsOnMethods.

public class DependentDemo {

    @Test (dependsOnMethods = { "Launcher" })
    public void login() {
        System.out.println("Login to the portal");
    }

    @Test
    public void Launcher() {
        System.out.println("Launch the application");
    }
  }

Здесь метод тестирования login() зависит от метода Launcher(). Вот результат выполнения:

JUnit не поддерживает зависимость от метода, поэтому тестирование набирает балл брауни в тестовой зависимости TestNG vs JUnit 🙂 сравнения

  • Обработка исключений

Обработка исключений в тестировании веб-автоматизации относится к способности метода тестирования выдавать исключение, когда он обнаруживает ошибку на этапе выполнения. Как фреймворки JUnit, так и TestNG поддерживают обработку исключений.

При тестировании исключения обрабатываются с помощью параметра ExpectedException в аннотации @test

@Test(expectedExceptions = ArithmeticException.class)
public void DivideByZero() {
  int i = 10/0;
}

В JUnit 5 API assertThrows используется для создания исключения

@Test
public void whenDividerIsZero_thenDivideByZeroExceptionIsThrown() {
    Calculator calculator = new Calculator();
    assertThrows(DivideByZeroException.class, () -> calculator.divide(10, 0));
}
  • Тайм-ауты

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

При тестировании параметр timeout, который определяет максимальное время выполнения, добавляется в аннотацию @test.

@Test(timeOut = 1000)
public void timeoutDemo() {
    while (true);
}

Вот как тайм-ауты в Selenium обрабатываются в рамках JUnit 5:

@Test
public void timeoutDemo() throws InterruptedException {
    Assertions.assertTimeout(Duration.ofMillis(1000), () -> Thread.sleep(10000));
}
  • Настройка имен тестов

В среде тестирования невозможно настроить имена тестов. В JUnit 5 мы можем предоставить настраиваемое имя тестам с помощью аннотации @DisplayName. То же самое показано ниже:

@ParameterizedTest
@ValueSource(strings = { "Hello", "World" })
@DisplayName("Test Method to check that the inputs are not nullable")
void givenString_TestNullOrNot(String word) {
    assertNotNull(word);
}

Если вы ищете настраиваемые имена тестов, JUnit должен быть основой для автоматизации тестирования.

  • Вложение тестовых примеров

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

public class MyApp
{
    @BeforeAll
    static void launchMyApp()
    {
        //the code to launch MyApp
    }
    @Test
    @DisplayName("Testcase to create new user")
    void signUp()
    {
        //the code to create new user 
    }

    @Nested
    @DisplayName(value="Nested class for Login to MyApp")
    class login
    {
        void verifyUser()
        {
            //the code to validate the user
        }
        void verifyNotNull()
        {
            //code to validate that username and password fields are not Null
        }
    }
    @AfterAll
    static void closeMyApp()
    {
        //the code to close MyApp
        //releasing all used objects goes here
    }
}

Группировка тестов в TestNG - это распространенный способ реализации вложенных тестов в тестировании. Что касается вложенных тестов, то тестирование набрало высокие баллы в битве TestNG против JUnit.

Параллельное выполнение тестов в фреймворках TestNG и JUnit

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

Как фреймворки TestNG, так и JUnit поддерживают параллельное выполнение тестов. При тестировании тестировщики могут назначить количество потоков в xml-файле (например testng.xml ) и запустите тесты параллельно, как показано ниже:





  
    
       параллельном тестировании в JUnit является хорошим ресурсом для получения информации о том, как практически использовать параллелизм в JUnit для тестирования Selenium automation. При тестировании параллельное выполнение может быть достигнуто на уровнях метода, теста, класса и экземпляра. 

Параллельное выполнение тестов в JUnit было введено в JUnit 5, однако оно все еще находится в экспериментальном режиме. Вот несколько способов, которыми параллельное тестирование может быть достигнуто с помощью JUnit 5:

  • junit.jupiter.parallel.process
  • junit.jupiter.выполнение.параллелизм
  • junit.jupiter.выполнение.параллельное.включено
  • юнит.юпитер.

Значение для конфигурации junit.jupiter.execution.parallel.enabled можно задать, указав необходимые параметры в плагине Maven Surefire. Кроме того, вы также можете задать этот параметр в unit-platform.properties или путем предоставления системных свойств JVM.

Вот как проявляется разница между JUnit и TestNG при оценке таких параметров, как выполнение теста, параллелизм, параметризация и многое другое.

Параллельное выполнение теста с использованием TestNG в сетке LambdaTest

Истинный потенциал, предлагаемый параллельным тестированием в JUnit и TestNG, можно использовать, запустив тесты в облачной Selenium Grid (вместо локальной Selenium Grid). Существует множество преимуществ, предлагаемых Selenium-тестированием в облаке .

Для демонстрации параллельного тестирования мы будем использовать облачную Selenium Grid от Lamda Test. Возможности браузера генерируются с помощью генератора возможностей лямбда-тестирования. Комбинация имени пользователя и ключа доступа используется для доступа к лямбда-тестовой сетке.

Вот два тестовых примера, используемых для демонстрации параллельного тестирования с помощью TestNG:

Тестовый кейс – 1

  1. Тестовый кейс – 1
  2. Тестовый кейс – 1
  3. Тестовый кейс – 1
  4. Тестовый кейс – 1

Тестовый кейс – 1

  1. Тестовый кейс – 1
  2. Тестовый кейс – 1
  3. Тестовый кейс – 1
  4. Тестовый кейс – 1
  5. Тестовый кейс – 1

Тестовый кейс – 1

package Test; 
import static org.testng.Assert.assertTrue;

import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.By;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class Lambdatest {
    public RemoteWebDriver driver = null;
    public static String username = "user-name";
    public static String accessKey = "access-key";
    @BeforeClass

    public void setup() throws Exception {

        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("platform", "Windows 10");
        capabilities.setCapability("browserName", "Chrome");
         capabilities.setCapability("version", "88.0");
            capabilities.setCapability("resolution","1024x768");
            capabilities.setCapability("build", "Lambdatest");
            capabilities.setCapability("name", "Lambdatest");
            capabilities.setCapability("network", true); // To enable network logs
            capabilities.setCapability("visual", true); // To enable step by step screenshot
            capabilities.setCapability("console", true);
        capabilities.setCapability("user", username);
        capabilities.setCapability("accesskey", accessKey);
        try {       
            driver= new RemoteWebDriver(new URL("https://"+username+":"+accessKey+"@hub.lambdatest.com/wd/hub"), capabilities);            
        } catch (MalformedURLException e) {
            System.out.println("Invalid grid URL");
        }
    }

    @Test
    public void testAddition() throws Exception {
                try {
                    driver.get("");
                    driver.findElement(By.id("sum1")).clear();
                    driver.findElement(By.id("sum1")).sendKeys("100");
                    driver.findElement(By.id("sum2")).clear();
                    driver.findElement(By.id("sum2")).sendKeys("200");    
                    driver.findElement(By.className("btn btn-dark selenium_btn")).click();
                    String strResult=driver.findElement(By.id("addmessage")).getText();
                    assertTrue(strResult.equals("300"),"Pass");
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
    }
    @Test
    public void testUserMessage() throws Exception {
                try {
                    String strMessage="Hello! Welcome to the Lambda Test";
                    String actualMsg="";
                    driver.get("");
                    driver.findElement(By.id("user-message")).clear();
                    driver.findElement(By.id("user-message")).sendKeys(strMessage);
                    driver.findElement(By.id("showInput")).click();    
                    actualMsg=driver.findElement(By.id("message")).getText();
                    assertTrue(actualMsg.equals(strMessage),"Pass") ;

                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
    }
    @AfterClass
    public void tearDown() throws Exception{
        driver.quit();
    }
}

Тестовый кейс – 1

Тестовый кейс – 1

Тестовый кейс – 1 Тестовый кейс – 1

Тестовый кейс – 1

Тестовый кейс – 1 Хотя между JUnit и TestNG есть разница в том, что касается аннотаций, суть в том, что оба фреймворка одинаково подходят для использования в тестировании Selenium automation.

Мы должны подождать и понаблюдать, как JUnit 5 (и последующие версии JUnit) эволюционируют с течением времени. В целом, существует тонкая грань различия между JUnit и TestNG, и выбор платформы автоматизации тестирования зависит исключительно от требований проекта.

В битве TestNG против JUnit мой общий голос был бы за TestNG

Независимо от того, выбираете ли вы JUnit или TestNG, истинный потенциал соответствующего фреймворка можно использовать только путем запуска тестов в облачной сетке Selenium, такой как LambdaTest. Основная причина заключается в том, что параллельные тесты могут выполняться в разных комбинациях браузеров и ОС с невероятно высокой скоростью.

Какой фреймворк вы предпочитаете в битве TestNG против JUnit? Пожалуйста, оставьте свои доводы в разделе комментариев этого блога…

Счастливого тестирования 🙂

Оригинал: “https://dev.to/ruchira_shukl/testng-vs-junit-which-testing-framework-should-you-choose-3k9c”