Как протестировать Java-приложение с помощью TestNG?

Опубликовано: 22 Февраля, 2023

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"?>
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 
                             https://maven.apache.org/xsd/maven-4.0.0.xsd">
  
    <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

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