И JUnit, и TestNG — это популярные фреймворки модульного тестирования, которые получили широкое признание среди Java-разработчиков. JUnit был представлен как фреймворк модульного тестирования с открытым исходным кодом для Java еще в 1997 году. Фактически, JUnit является одним из широко используемых фреймворков для автоматизации тестирования. TestNG — это еще одна система автоматизации тестирования на Java, которая не только имеет открытый исходный код, но и предлагает потрясающие возможности, которые лучше всего подходят для крупномасштабного автоматизированного веб-тестирования. TestNG был создан для различных категорий тестирования, включая (но не ограничиваясь) модульное тестирование, функциональное тестирование, сквозное тестирование и интеграционное тестирование.
Как и я, если вы хорошо знакомы с обоими фреймворками для автоматизации тестирования, вы можете столкнуться со сценариями, когда вам захочется запустить тесты JUnit с помощью TestNG. Основным толчком к такому перекрестному опылению (проще говоря) является широкий набор функций, предоставляемых фреймворком TestNG. TestNG поддерживает более широкие категории тестов, что позволяет тестировщикам легко переносить тестовые случаи JUnit на фреймворк TestNG. Преимуществом такого подхода является отсутствие необходимости полностью переписывать тестовые сценарии, использующие фреймворк JUnit.
В этом блоге мы рассмотрим, как можно запускать тестовые сценарии, использующие JUnit и TestNG, в Selenium без повторного написания тестов.
Тестируйте на Selenium Testing Grid Cloud из 3000+ настольных и мобильных браузеров.
- Введение в JUnit
- Как установить JUnit
- Как создавать и выполнять тестовые случаи в JUnit
- Как запустить тест JUnit
- Введение в TestNG
- Как установить TestNG
- Как создавать и выполнять тестовые примеры в TestNG
- Как запускать тестовые примеры TestNG
- Как запускать тесты JUnit с помощью TestNG в Selenium
- Параллельное выполнение тестовых примеров JUnit в TestNG с помощью удаленной Selenium Grid
- Заключение
Введение в JUnit
Следуя практике экстремального программирования, Java создала свой фреймворк модульного тестирования с открытым исходным кодом под названием JUnit. Хотя JUnit в основном используется для модульного тестирования, автоматизированное тестирование с помощью JUnit и Selenium может широко использоваться для кросс-браузерного тестирования (или тестирования совместимости браузеров).
С другой стороны, фреймворк TestNG (Test Next Generation) имеет расширенные возможности, которые позволяют выполнять различные категории тестов (т.е. модульное тестирование, интеграционное тестирование, функциональное тестирование и т.д.).
Как установить JUnit
Последняя версия JUnit — это JUnit 5. В отличие от JUnit 4, JUnit 5 состоит из модулей трех различных проектов — JUnit Platform, JUnit Jupiter и JUnit Vintage.
-
JUnit Platform — Обеспечивает базу для запуска фреймворков тестирования
-
JUnit Jupiter — предоставляет TestEngine для запуска тестов на базе Jupiter на платформе
-
JUnit Vintage — предоставляет тестовый движок для запуска тестов на базе Unit 3 и JUnit 4.
Если вы используете тесты JUnit 4 и хотите узнать о работе с фреймворком JUnit 5, загляните в наш блог, который поможет вам выполнить тесты JUnit 4 с помощью фреймворка JUnit 5.
Чтобы начать работу с фреймворком JUnit, выполните следующие шаги:
-
Чтобы установить JUnit в свой проект, перейдите на сайт JUnit 5 → Docs → User Guide и загрузите зависимости.
-
Чтобы использовать JUnit, включите jar-файлы в ClassPath вашего проекта.
-
Чтобы использовать JUnit в Eclipse, включите библиотеки JUnit в свой Java-проект. Например, щелкните правой кнопкой мыши на Java-проекте → Properties → Java Build Path → Add Libraries → Select JUnit → Choose library version (JUnit 4/JUnit5).
Вы можете ознакомиться с нашим блогом «Начало работы с JUnit», чтобы сделать первые шаги в использовании фреймворка для автоматизации тестирования Selenium.
Как создавать и выполнять тестовые случаи в JUnit
JUnit предоставляет несколько аннотаций для создания и выполнения тестовых примеров. Поэтому важно хорошо понимать аннотации JUnit в Selenium, если вы используете фреймворк для автоматизации тестирования Selenium.
Теперь, когда мы рассмотрели основные аспекты JUnit, давайте замажем руки примером теста JUnit, который демонстрирует автоматизацию тестирования Selenium:
Сценарий тестирования
-
Перейдите по адресу https://todomvc.com/examples/react/#/.
-
Введите текст «JUnit Parallel Test sample» в текстовое поле
-
Убедитесь, что точный текст появился в списке под текстовым полем.
Реализация
Для реализации приведенного выше тестового примера мы напишем тестовый класс JUnitDemo:
package Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class JUnitDemo {
WebDriver driver;
@Before
public void setUp() throws Exception {
System.setProperty("webdriver.chrome.driver", "YOUR DRIVER EXE PATH");
driver = new ChromeDriver();
}
@Test
public void testJunitDemo() throws Exception {
try { // Change it to production page
int total_elements = 0;
driver.get("https://todomvc.com/examples/react/#/");
driver.findElement(By.className("new-todo")).sendKeys("JUnit Test sample");
driver.findElement(By.className("new-todo")).sendKeys(Keys.ENTER);
total_elements = driver.findElements(By.xpath("//ul[@class='todo-list']/li//label")).size();
Assert.assertEquals(1, total_elements);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
@After
public void tearDown() throws Exception {
driver.quit();
}
}
Ознакомление с кодом
-
Аннотации @Before и @After указывают, что код метода будет выполняться до и после каждого тестового метода. Если ожидаемый результат совпадает с фактическим, то утверждение не поднимается.
-
Метод тестирования testJUnitDemo содержит сценарий Selenium для выполнения шагов тестирования. Если вы используете фреймворк JUnit, вам следует использовать параметризованное тестирование с JUnit, чтобы максимально использовать Selenium и JUnit как полный пакет!
Как запустить тест JUnit
1- Чтобы запустить приведенный выше код в Eclipse, щелкните правой кнопкой мыши на тестовом классе и выберите Run As → JUnit Test.
2- Чтобы запустить тестовый пример вне Eclipse, вы можете создать класс TestRunner.
3- Вы можете включить более одного теста, используя runClasses testclass1,[testclass2,…].
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(JUnitDemo.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
4- Для запуска в командной строке следуйте синтаксису.
$ java org.junit.runner.JUnitCore TestClass1 [TestClass2 ...]
Вы можете обратиться к нашему подробному учебнику по JUnit в учебном центре LambdaTest, чтобы получить представление о других возможностях фреймворка JUnit.
Посмотрите это видео, чтобы узнать, как TestNG стал одним из самых надежных фреймворков автоматизации тестирования и все, что вам нужно знать, чтобы начать работу с TestNG в Selenium.
Введение в TestNG
TestNG также является очень распространенным фреймворком тестирования на Java, который широко используется сообществом разработчиков и тестировщиков. Фреймворк широко используется для создания тестов, уделяя большое внимание таким функциям, как группировка, зависимость, приоритизация, аннотации и многое другое. На момент написания этого блога последней версией TestNG является версия 7.3.0.
Получив сертификат TestNG, вы сможете проверить свои навыки в выполнении автоматизированного тестирования с помощью TestNG и поднять свою карьеру на новый уровень.
Вот краткий обзор сертификации TestNG от LambdaTest:
Автоматизируйте тестирование Cypress и выполняйте автоматическое тестирование браузера с помощью LambdaTest прямо сейчас!
Как установить TestNG
Перейдите на официальный сайт TestNG и скопируйте зависимости (Maven/Gradle) в свой проект. Если вы используете Eclipse IDE, вы можете обратиться к нашему подробному руководству о том, как установить TestNG в Eclipse.
После установки Eclipse в вашей системе, вам нужно создать проект и загрузить соответствующие зависимости. Вы можете ознакомиться с нашим блогом, который поможет вам создать проект TestNG в Eclipse для автоматизации тестирования Selenium.
Как создавать и выполнять тестовые примеры в TestNG
Чтобы продемонстрировать использование фреймворка TestNG для автоматизации веб-тестирования, мы используем тот же сценарий тестирования, что и в предыдущем разделе. Комбинация браузера и платформы также остается неизменной.
Сценарий тестирования
-
Перейдите по адресу https://todomvc.com/examples/react/#/.
-
Введите в текстовое поле текст «TestNG Sample Test».
-
Убедитесь, что точный текст появился в списке под текстовым полем.
Реализация
package Test;
import static org.testng.Assert.assertTrue;
import java.net.MalformedURLException;
import java.net.URL;
import org.junit.Assert;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class TestNGDemo {
public WebDriver driver;
@BeforeClass
public void setUp() throws Exception {
System.setProperty("webdriver.chrome.driver", "YOUR CHROME DRIVER EXE PATH");
driver = new ChromeDriver();
}
@BeforeMethod
public void beforeMethod() {
System.out.println("Before Method Setup");// for illustration
}
@Test
public void testNGDemoTest() throws Exception {
try { // Change it to production page
int total_elements = 0;
driver.get("https://todomvc.com/examples/react/#/");
driver.findElement(By.className("new-todo")).sendKeys("TestNG Sample Test");
driver.findElement(By.className("new-todo")).sendKeys(Keys.ENTER);
total_elements = driver.findElements(By.xpath("//ul[@class='todo-list']/li//label")).size();
Assert.assertEquals(1, total_elements);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
@AfterMethod
public void afterMethod() {
System.out.println("Äfter Method");
}
@AfterClass
public void tearDown() throws Exception {
driver.quit(); // for illustration
}
}
Проход по коду
-
Аннотации @BeforeClass и @AfterClass указывают, что код метода будет выполняться до и после вызова класса. Обычно в этих аннотациях мы указываем методы конфигурации, инициализации и закрытия экземпляров драйвера и т.д.
-
Аннотация @BeforeMethod и @AfterMethod используется для вызова метода до и после выполнения каждого из тестовых методов.
-
Аннотация @test обозначает тестовые методы так же, как и в JUnit.
-
Метод assertEquals() проходит, если ожидаемый результат совпадает с фактическим.
Посмотрите это видео, чтобы узнать об аннотациях TestNG и о том, как они помогают обеспечить лучшую структуру и читаемость кода.
Как запускать тестовые примеры TestNG
Тестовые примеры TestNG можно запускать через testng.xml или через любой инструмент сборки (например, Maven, Ant или Gradle). testng.xml обеспечивает большую гибкость при выполнении тестовых примеров по сравнению с фреймворком JUnit.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="TestNGTestCaseDemo">
<test name=""TestNGSeleniumDemo >
<classes>
<class name="Test.TestNGSeleniumDemo/>
</classes>
</test>
</suite>
Вы можете запустить XML-файл в Eclipse или выполнив следующую команду из терминала:
$ java org.testng.TestNG testing.xml
Перед запуском тестов из командной строки убедитесь, что путь к jar-файлу TestNG установлен в Java ClassPath.
Если вы хотите узнать больше о других основных возможностях фреймворка TestNG, перейдите к подробному учебнику по TestNG на учебном хабе LambdaTest.
Эта сертификация JUnit устанавливает стандарты тестирования для тех, кто хочет продвинуться по карьерной лестнице в области автоматизации Selenium тестирования с помощью JUnit.
Вот краткий обзор сертификации JUnit от LambdaTest:
Как запускать тесты JUnit с помощью TestNG в Selenium
Прежде чем перейти к «как», давайте сначала поймем «почему» нам нужно запускать тестовые случаи с помощью JUnit и TestNG в Selenium для автоматизации тестирования. Вот самый простой ответ на поставленный выше вопрос
‘Предоставление широких возможностей TestNG по сравнению с JUnit’. TestNG был выпущен намного позже JUnit, но предлагает множество возможностей, таких как улучшенные возможности управляемого выполнения тестов, улучшенные аннотации для обеспечения гибкости и многое другое.
Вот краткий обзор сравнения TestNG и JUnit:
1- Аннотации: TestNG предлагает больше аннотаций для более гибкого управления автоматизированными тестовыми случаями по сравнению с JUnit. Хотя JUnit 5 ввел несколько новых аннотаций для достижения большей гибкости в управлении тестовыми случаями, нам все еще нужно посмотреть, как он работает по сравнению с JUnit.
2- Группировка тестовых примеров: TestNG поддерживает группировку тестовых случаев, если вы хотите запустить только набор тестовых случаев. Этого можно добиться с помощью параметров groups в аннотации @test. Тот же тег указывается в testng.xml с именем групп, которые вы хотите запустить.
3- Параллельное выполнение тестовых примеров: TestNG поддерживает параллельное выполнение тестовых примеров с использованием нескольких потоков и классов с помощью ключевого слова «parallel» в testng.xml.
junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.mode.default = concurrent
Здесь concurrent mode задает параллельные потоки для каждого метода тестирования. Мы также можем установить значение «по умолчанию», если хотим, чтобы для всех методов выполнялся один поток. Тестовые методы в таких тестовых классах выполняются параллельно только в том случае, если на тестовом классе или методе присутствует аннотация @execution(CONCURRENT). Параллельное выполнение тестов в TestNG предпочтительнее, поскольку оно помогает получить результаты тестирования гораздо быстрее.
4- Зависимость тестовых примеров: Параметр dependsOnMethods в аннотации @test используется для определения зависимого метода (или группы методов). В основном это используется в тех случаях, когда один метод тестирования зависит от результатов другого метода (методов). Однако зависимые тесты не являются хорошей практикой, когда речь идет об автоматизированном тестировании Selenium. Поэтому рекомендуется следовать лучшим практикам Selenium, чтобы максимально использовать возможности системы автоматизации тестирования.
Инъекцию зависимостей можно реализовать в JUnit 5, где тестовым методам разрешено иметь параметры.
Как видно из вышесказанного, TestNG имеет много преимуществ перед JUnit 4 (который все еще широко используется). Многие из нас хотели бы использовать возможности TestNG, чтобы тесты можно было частично или полностью перевести на TestNG. Теперь возникает вопрос: как запускать тестовые примеры с помощью JUnit и TestNG в Selenium?
У вас может быть ‘N’ количество юнит-тестов, написанных на JUnit, которые интегрированы в конвейер CI/CD. Тестовый фреймворк, CI/CD-конвейер, отчетность и все остальное находится на месте и работает хорошо перед каждым релизом. Переписывание этих тестовых примеров привело бы к значительному увеличению затрат. Так каким же должно быть идеальное решение, чтобы максимально использовать JUnit, TestNG и соответствующий инструмент CI/CD, используемый в проекте?
TestNG решает эту проблему, распознавая ряд примеров тестов JUnit через тег JUnit в XML-файле. Говоря простыми словами, TestNG имеет встроенную поддержку для запуска тестовых примеров JUnit. Мы подробно рассмотрим это на одном примере с помощью облачной Selenium Grid от LambdaTest.
Этот учебник по JUnit для новичков и профессионалов поможет вам узнать, как использовать фреймворк JUnit с Selenium и Java для проведения автоматизированного тестирования Selenium.
Параллельное выполнение тестовых примеров JUnit в TestNG с помощью удаленной Selenium Grid
Параллельное тестирование в Selenium помогает достичь лучшего тестового покрытия в ускоренном темпе. Хотя параллельное выполнение тестов не является ключевой особенностью JUnit, его можно достичь с помощью определенных методов, которые мы рассмотрим в этом разделе.
Чтобы сделать выполнение тестовых примеров JUnit более эффективным, мы можем выполнять их в TestNG, используя облачный удаленный Selenium Grid. Выполнение тестовых примеров с использованием JUnit и TestNG в Selenium может быть достигнуто таким же образом, как обсуждалось ранее. Однако облачная Selenium Grid обеспечит безопасное, быстрое и стабильное выполнение тестов.
Для демонстрации выполнения тестов JUnit с помощью TestNG в облачной Selenium Grid мы рассмотрим следующий тестовый сценарий:
Сценарий тестирования
-
Перейдите по адресу https://todomvc.com/examples/react/#/.
-
Введите текст «JUnit Parallel Test sample» в текстовое поле.
-
Убедитесь, что точный текст появился в списке под текстовым полем.
Для демонстрации возможностей параллельного тестирования с помощью JUnit и TestNG с использованием Selenium cloud grid мы запустим один и тот же тест на нескольких комбинациях браузеров и платформ:
Браузер | Версия | Платформа |
---|---|---|
Chrome | 70.0 | WIN10 |
Safari | 14.0.2 | macOS Big Sur |
Firefox | 76.0 | WIN8 |
Давайте сначала напишем код JUnit для поддержки параллельного выполнения потоков для каждой из комбинаций браузер-платформа. Чтобы запустить тест JUnit на разных браузерах одновременно, необходимо создать вспомогательный класс, который расширяет класс parameterized (org.junit.runners.Parameterized) и реализует класс RunnerScheduler.
Чтобы продемонстрировать это, мы используем облачную Selenium Grid от LambdaTest, которая предлагает автоматизацию Selenium Automation Testing With JUnit на 2000+ браузерах и операционных системах.
package Test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.junit.runners.Parameterized;
import org.junit.runners.model.RunnerScheduler;
public class Parallelized extends Parameterized {
private static class ThreadPoolScheduler implements RunnerScheduler {
private ExecutorService executor;
public ThreadPoolScheduler() {
String threads = System.getProperty("junit.parallel.threads", "15");
int numThreads = Integer.parseInt(threads);
executor = Executors.newFixedThreadPool(numThreads);
}
public void finished() {
executor.shutdown();
try {
executor.awaitTermination(10, TimeUnit.MINUTES);
} catch (InterruptedException exc) {
throw new RuntimeException(exc);
}
}
public void schedule(Runnable childStatement) {
executor.submit(childStatement);
}
}
public Parallelized(Class<?> klass) throws Throwable {
super(klass);
setScheduler(new ThreadPoolScheduler());
}
}
Теперь мы напишем сценарий для реализации вышеупомянутого тестового сценария. Распараллеленный класс будет передан в качестве параметра в аннотации @RunWith. Чтобы выполнить тестовый сценарий на LambdaTest, необходимо предоставить наше имя пользователя и ключ доступа, которые доступны в разделе профиля LambdaTest.
package Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Platform;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
[@RunWith](http://twitter.com/RunWith)(Parallelized.class)
public class JunitParallelExecutionDemo {
public static String username = "YOUR_USER_NAME;
public static String accessKey = "YOUR_ACCESS_KEY";
public String gridURL = "[@hub](http://twitter.com/hub).lambdatest.com/wd/hub";
public String platform;
public String browserName;
public String browserVersion;
public RemoteWebDriver driver = null;
boolean status = false;
[@Parameterized](http://twitter.com/Parameterized).Parameters
public static LinkedList<String[]> getEnvironments() throws Exception {
LinkedList<String[]> env = new LinkedList<String[]>();
env.add(new String[] { "WIN10", "chrome", "70.0" });
env.add(new String[] { "macOS Big Sur", "safari", "14.0.2" });
env.add(new String[] { "WIN8", "firefox", "62.0" });
return env;
}
public JunitParallelExecutionDemo(String platform, String browserName, String browserVersion) {
this.platform = platform;
this.browserName = browserName;
this.browserVersion = browserVersion;
}
[@Before](http://twitter.com/Before)
public void setUp() throws Exception {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("browserName", browserName);
capabilities.setCapability("version", browserVersion);
capabilities.setCapability("platform", platform);
capabilities.setCapability("build", "JUnitRepeatedTestSample");
capabilities.setCapability("name", "JUnitRepeatedTestSample");
capabilities.setCapability("network", true); // To enable network logs
capabilities.setCapability("visual", true); // To enable step by step screenshot
capabilities.setCapability("video", true); // To enable video recording
capabilities.setCapability("console", true); // To capture console logs
try {
driver = new RemoteWebDriver(new URL("https://" + username + ":" + accessKey + gridURL), capabilities);
} catch (MalformedURLException e) {
System.out.println("Invalid grid URL");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
[@Test](http://twitter.com/Test)
[@RepeatedTest](http://twitter.com/RepeatedTest)(value=2)
public void testParallel() throws Exception {
try { // Change it to production page
int total_elements=0;
driver.get("[https://todomvc.com/examples/react/#/](https://todomvc.com/examples/react/#/)");
driver.findElement(By.className("new-todo")).sendKeys("Lambdatest Cross Browser Testing");;
total_elements = driver.findElements(By.xpath("//ul[[@class](http://twitter.com/class)='todo-list']/li")).size();
Assert.assertEquals(1, total_elements);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
[@After](http://twitter.com/After)
public void tearDown() throws Exception {
driver.quit();
}
}
Теперь приведенный выше тестовый пример может быть запущен с помощью JUnit и TestNG в Selenium, точно так же, как мы обсуждали ранее. Мы укажем junit=»true» в теге suite, и все готово!
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "[http://testng.org/testng-1.0.dtd](http://testng.org/testng-1.0.dtd)" >
<suite name = "Parallel Tests" junit="true">
<test name="JunitParallelExecutionDemo">
<classes>
<class name="Test.JunitParallelExecutionDemo"/>
</classes>
</test>
</suite>
Как видно из приведенного ниже журнала выполнения вышеприведенного тестового примера, запущенного на трех различных комбинациях браузеров и платформ.
Как видно из скриншота, тест выполнялся на указанных браузерах параллельно. Мы также можем посмотреть видео выполнения, выбрав конкретное выполнение и нажав на видео справа. Это поможет найти проблему в случае какого-либо сбоя.
Эй! Вы используете Playwright для автоматизации тестирования? Запускайте свои тестовые сценарии Playwright мгновенно на 50+ комбинациях браузеров/OS с помощью облака LambdaTest!
Заключение
Подводя итог, мы рассмотрели два фреймворка для тестирования -JUnit и TestNG, и чем они отличаются. Кроме того, какие возможности есть у TestNG, и зачем нам нужно запускать тестовые случаи с использованием JUnit и TestNG при автоматизации тестирования Selenium. Мы также объяснили, как это сделать с помощью примера теста JUnit. Вот как мы можем использовать существующие тестовые примеры с расширенными возможностями TestNG.
Надеюсь, этот блог поможет вам запустить тестовые примеры с помощью JUnit и TestNG в Selenium и найти способы масштабирования набора тестов автоматизации с использованием их широких возможностей.
Счастливого тестирования!