Как протестировать 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
Следовательно, всегда лучше проводить автоматизированное тестирование, и благодаря этому мы можем избежать многих ошибок.