Как протестировать Java-приложение с помощью TestNG?
TestNG — это среда автоматизированного тестирования, широко используемая во многих проектах. NG означает «Следующее поколение», на него повлиял JUnit и следует аннотациям (@). TestNG легко справляется со сквозным тестированием. В качестве примера давайте посмотрим на тестирование, а также на необходимость его выполнения через проект maven.
Пример проекта Maven
Структура проекта:
Это проект maven. Следовательно, зависимости TestNG должны быть упомянуты в pom.xml.
<dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.9.8</version> </dependency>
Всегда необходимые зависимости должны быть доступны в pom.xml
пом.xml
XML
<?xml version="1.0" encoding="UTF-8"?> xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 <modelVersion>4.0.0</modelVersion> <groupId>testNGSampleProject</groupId> <artifactId>testNGSampleProject</artifactId> <version>1.0</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <!--Testing--> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.9.8</version> </dependency> </dependencies> <!-- Configure maven surefire plugin for qtest testng-plugin-log-collector to listen the tests--> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <!-- Jar file entry point --> <addClasspath>true</addClasspath> <mainClass>com.sample.CalculatorApplication</mainClass> </manifest> </archive> </configuration> </plugin> <!-- Following plugin executes the testng tests --> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.19.1</version> <configuration> <suiteXmlFiles> <suiteXmlFile>testng.xml</suiteXmlFile> </suiteXmlFiles> <testFailureIgnore>true</testFailureIgnore> </configuration> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.10.1</version> <configuration> <encoding>iso-8859-1</encoding> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> <!-- End configuration --></project> |
Основные важные файлы, которые нам нужно увидеть, следующие:
testng.xml
Здесь мы можем указать параметр и значения, которые может принимать тестовый файл. А также нам нужно указать n количество тестовых файлов классов Java внутри этого, так как в целом, как набор, тестовые случаи будут выполняться.
XML
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"><suite name="Suite" parallel="none"> <test name="Test"> <!-- Parameters and their values are specified here --> <parameter name="welcome" value="Geeky people" /> <parameter name="thankyou" value="Geeky people" /> <!-- Specify number of test files under this tag --> <classes> <class name="com.sample.SampleTestProgram" /> <class name="com.sample.AdditionalTestProgram" /> </classes> <!-- Specify number of test files under this tag --> </test> <!-- Test --></suite> <!-- Suite --> |
Давайте начнем с основного файла бизнес-логики, который также является автономным java-приложением. Но, как практика maven, нам нужно запустить его как тест, поскольку мы проводим автоматическое тестирование.
CalculatorApplication.java
Это стандартная программа-калькулятор, которая содержит отдельные методы для базовых вычислений, а также шаги для выполнения кода TestNG.
Java
import java.util.List;import org.testng.TestListenerAdapter;import org.testng.TestNG;import org.testng.collections.Lists; public class CalculatorApplication { public static void main(String[] args) { System.out.println("Calculation test via TestNg"); TestListenerAdapter tla = new TestListenerAdapter(); TestNG testng = new TestNG(); testng.addListener(tla); List<String> suites = Lists.newArrayList(); // path to xml.. This will refer the internal // folder that contains the filename suites.add("testng.xml"); testng.setTestSuites(suites); testng.run(); } public static int addNumbers(int one, int two) { return one + two; } public static int subtractNumbers(int one, int two) { return one - two; } public static int multiplyNumbers(int one, int two) { return one * two; } public static int getQuotientByDividingNumbers(int one, int two) { return one / two; } public static int getReminderByDividingNumbers(int one, int two) { return one % two; } } |
Давайте проверим то же самое, добавив два отдельных файла
SampleTestProgram.java и AdditionalTestProgram.java
SampleTestProgram.java
Java
import org.testng.Assert;import org.testng.annotations.Parameters;import org.testng.annotations.Test; public class SampleTestProgram { @Test @Parameters({ "welcome", "thankyou" }) public void testEasySamples(String welcome,String thankyou) { String title = "welcome"; Assert.assertTrue(welcome.contains("Geeky people")); Assert.assertTrue(thankyou.contains("Geeky people")); Assert.assertTrue(title.contains("welcome")); Assert.assertTrue((1000 * 20) == 20000); Assert.assertTrue((1000 * 20) >= 2000); Assert.assertEquals(true, title.contains("welcome")); Assert.assertEquals(true, welcome.contains("Geeky people")); Assert.assertEquals(true, thankyou.contains("Geeky people")); } @Test public void testAddNumbers() { Assert.assertTrue(300 == CalculatorApplication.addNumbers(100,200)); Assert.assertTrue(0 == CalculatorApplication.addNumbers(-100,100)); Assert.assertEquals(true, (0 == CalculatorApplication.addNumbers(-100,100))); } @Test public void testSubtractNumbers() { Assert.assertTrue(300 == CalculatorApplication.subtractNumbers(500,200)); Assert.assertTrue(-200 == CalculatorApplication.addNumbers(-100,-100)); Assert.assertNotEquals(true, (200 == CalculatorApplication.addNumbers(-100,-100))); Assert.assertFalse(3000 == CalculatorApplication.subtractNumbers(500,200), "Subtrated result is wrong"); } } |
Дополнительные тестовые программы.java
Java
import org.testng.Assert;import org.testng.annotations.Test; public class AdditionalTestProgram { @Test public void testMultiplyNumbers() { Assert.assertTrue(20000 == CalculatorApplication.multiplyNumbers(100,200)); Assert.assertTrue(0 == CalculatorApplication.multiplyNumbers(1000000,0)); Assert.assertEquals(true, (0 == CalculatorApplication.multiplyNumbers(0,200120))); } @Test public void testGetQuotientByDividingNumbers() { Assert.assertTrue(2 == CalculatorApplication.getQuotientByDividingNumbers(500,200)); Assert.assertTrue(1 == CalculatorApplication.getQuotientByDividingNumbers(-100,-100)); Assert.assertNotEquals(false, (2 == CalculatorApplication.getQuotientByDividingNumbers(500,200))); Assert.assertFalse(3 == CalculatorApplication.getQuotientByDividingNumbers(500,200), "Quotient calculated result is wrong"); } @Test public void testGetReminderByDividingNumbers() { Assert.assertFalse(1 == CalculatorApplication.getReminderByDividingNumbers(500,200)); Assert.assertTrue(0 == CalculatorApplication.getReminderByDividingNumbers(-100,-100)); Assert.assertNotEquals(true, (2 == CalculatorApplication.getReminderByDividingNumbers(-100,-100))); Assert.assertFalse(3 == CalculatorApplication.getReminderByDividingNumbers(500,200), "Reminder calculated result is wrong"); }} |
Таким образом, мы можем добавить несколько тестовых файлов, и все они должны быть включены в testng.xml. Через командную строку в папке проекта мы можем протестировать файлы как
mvn test
Или через затмение как
После запуска тестов в консоли мы увидим следующий вывод
В случае каких-либо ошибок, давайте посмотрим, как мы можем получить подробности. В целевой папке доступна папка surefire-reports. В папке targetsurefire-reportsjunitreports мы можем увидеть отчеты
Таким образом мы можем получить подробный отчет в папке targetsurefire-reports-Suite
Следовательно, всегда лучше проводить автоматизированное тестирование, и благодаря этому мы можем избежать многих ошибок.