Модульное тестирование, интеграционное тестирование, приоритетное тестирование с использованием TestNG в Java
TestNG — это среда автоматизированного тестирования. В этом руководстве давайте подробнее рассмотрим, как его можно использовать в жизненном цикле программного обеспечения.
Модульное тестирование
Вместо тестирования всей программы тестирование кода на уровне класса, уровня метода и т. д. называется модульным тестированием. Код должен быть разделен на отдельные классы и методы, чтобы можно было легко проводить тестирование на уровне модуля.
Интеграционное тестирование
После завершения модульного тестирования всегда будет необходимость в интеграционном тестировании. Несколько модулей тестируются группами, и это поможет уменьшить дефекты, выявленные во время интеграции нескольких модулей.
Пример: мы можем запускать тесты вместе, указав «название набора», и можем вместе проводить разные классы.
Приоритетное тестирование
Используя такие аннотации, как @Test(priority=1/2/…), мы можем установить приоритет тестов. Если тестовый класс имеет только аннотацию @Test, он будет иметь высокий приоритет, и если указаны какие-либо конкретные номера тестов, он выполняется в соответствии с порядком. Таким образом, мы можем установить порядок выполнения, используя аннотации, как указано выше. Возьмем проект maven и оттуда охватим важные темы.
Пример проекта
Структура проекта:
Это проект типа maven, и поэтому зависимости должны быть упомянуты в
пом.xml
XML
<? xml version = "1.0" encoding = "UTF-8" ?> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 < modelVersion >4.0.0</ modelVersion > < groupId >com.gfg.testng</ groupId > < artifactId >testng</ artifactId > < version >0.1.0-SNAPSHOT</ version > < name >testng</ name > < packaging >jar</ packaging > < dependencies > <!-- This is the essential dependency required for testng --> < dependency > < groupId >org.testng</ groupId > < artifactId >testng</ artifactId > < version >${testng.version}</ version > < scope >test</ scope > </ dependency > <!-- As we are logging, below dependency is required --> < dependency > < groupId >org.slf4j</ groupId > < artifactId >slf4j-api</ artifactId > < version >1.7.9</ version > </ dependency > </ dependencies > < build > < finalName >testng</ finalName > < resources > < resource > < directory >src/main/resources</ directory > < filtering >true</ filtering > </ resource > </ resources > < testResources > < testResource > < directory >src/main/resources</ directory > < filtering >true</ filtering > </ testResource > </ testResources > </ build > < profiles > < profile > < id >default-second</ id > < build > < plugins > < plugin > < groupId >org.apache.maven.plugins</ groupId > < artifactId >maven-surefire-plugin</ artifactId > < configuration > < suiteXmlFiles > < suiteXmlFile >src est
esourcesparametrized_testng.xml</ suiteXmlFile > </ suiteXmlFiles > </ configuration > </ plugin > </ plugins > </ build > </ profile > < profile > < id >integration-lite-second</ id > < build > < plugins > < plugin > < groupId >org.apache.maven.plugins</ groupId > < artifactId >maven-surefire-plugin</ artifactId > < configuration > < suiteXmlFiles > < suiteXmlFile >src est
esources est_int.xml</ suiteXmlFile > </ suiteXmlFiles > </ configuration > </ plugin > </ plugins > </ build > </ profile > </ profiles > < properties > < testng.version >7.1.0</ testng.version > < 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 > </ project > |
В TestNG через файлы XML мы можем передавать параметры, как указано в приведенном ниже XML, используя тег <parameter> с именем и значением.
XML
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > < suite name = "My test suite" > < listeners > < listener class-name = "com.gfg.reports.CustomisedListener" ></ listener > </ listeners > < test name = "numbersXML" > <!-- We can specify as much parameters and their values here --> < parameter name = "value" value = "1" /> < parameter name = "isEven" value = "false" /> < classes > < class name = "com.gfg.ParametrizedUnitTest" /> </ classes > </ test > </ suite > |
Эти параметры собираются через @DataProvider или @Parameter в файлах Java.
@DataProvider(name = "numbers") public static Object[][] evenNumbers() { return new Object[][]{{11, false}, {2222, true}, {4882, true}}; }
Мы можем запускать тесты вместе, указав «название набора», и можем вместе делать разные классы.
XML
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > < suite name = "int" > < test name = "integration tests" > < classes > < class name = "com.gfg.MultiThreadedIntegrationTest" /> < class name = "com.gfg.TimeOutCheckTest" /> </ classes > </ test > </ suite > |
Это указывает, что « int » — это имя набора и 2 класса, а именно com.gfg.MultiThreadedIntegrationTest и com.gfg.TimeOutCheckTest вместе. Таким образом, мы можем сгруппировать классы в одном наборе. А также мы можем указать разные имена наборов и можем группировать классы в зависимости от того, что нам нужно. Тесты зависимости. т.е. зависит от конкретного теста и, следовательно, регистрации некоторой информации
Usecase: Check whether an email is valid or not and if valid, proceed to the next set of steps
private String userEmail = "geek@gfg.com"; @Test public void checkForValidMail() { boolean validEmail = userEmail.contains("@"); Assert.assertEquals(validEmail, true); } // If first test is success, below test executes and logs the information @Test(dependsOnMethods = {"checkForValidMail"}) public void logInWhenEmailValid() { LOGGER.info("Given Email {} valid >> and logging in", userEmail); }
Порядок выполнения теста можно контролировать с помощью аннотации @Priority.
@Test(priority = 1) // This is executed first public void stringToIntCheck() { String testString = "100"; assertTrue(Integer.valueOf(testString) instanceof Integer); } @Test(priority = 2) // This is second public void intToStringCheck() { int testInt = 100; assertTrue(String.valueOf(testInt) instanceof String); }
Время ожидания теста можно указать с помощью @Test(timeout=<определенное значение>). TestNG поддерживает тесты с истекшим временем ожидания.
@Test(timeOut = 1000, enabled = false) public void asNoStoppingPointItRunsTimeOut() { while (true) ; }
- На самом деле, в предыдущем тесте мы включили = false, то есть если мы хотим игнорировать тестовые случаи
- Мы можем включить
- @BeforeClass и @AfterClass на уровне класса в основном используются для инициализации и очистки кода.
- Точно так же мы можем включить @BeforeMethod и @AfterMethod на уровне метода.
- Аннотации @BeforeSuite, @AfterSuite, @BeforeGroup и @AfterGroup для конфигураций на уровне набора и группы соответственно.
private int evenNumber, oddNumber; @BeforeClass public void setup() { evenNumber = 100; oddNumber = 59; } @AfterClass public void tearDown() { evenNumber = 0; oddNumber = 0; }
В целом давайте посмотрим на java-код с указанными выше функциями.
DependencyUnitTest.java
Java
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.Assert; import org.testng.annotations.Test; public class DependencyUnitTest { private static final Logger LOGGER = LoggerFactory.getLogger(DependencyUnitTest. class ); private String userEmail = "geek@gfg.com" ; @Test public void checkForValidMail() { boolean validEmail = userEmail.contains( "@" ); Assert.assertEquals(validEmail, true ); } @Test (dependsOnMethods = { "checkForValidMail" }) public void logInWhenEmailValid() { LOGGER.info( "Given Email {} valid >> and logging in" , userEmail); } } |
MultiThreadedIntegrationTest.java
Java
import org.testng.Assert; import org.testng.annotations.Test; public class MultiThreadedIntegrationTest { @Test (threadPoolSize = 5 , invocationCount = 10 , timeOut = 1000 ) public void checkForCount() { int count = Thread.activeCount(); Assert.assertTrue(count > 2 ); } } |
OddOrEvenNumberCheck.java
Java
import org.testng.Assert; import org.testng.TestNG; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class OddOrEvenNumberCheck extends TestNG { private int evenNumber, oddNumber; @BeforeClass public void setup() { evenNumber = 100 ; oddNumber = 59 ; } @AfterClass public void tearDown() { evenNumber = 0 ; oddNumber = 0 ; } @Test public void checkEven() { Assert.assertTrue(evenNumber % 2 == 0 ); } @Test public void checkOdd() { Assert.assertTrue(oddNumber % 2 == 1 ); } } |
ПараметризованныйUnitTest.java
Java
import org.testng.annotations.DataProvider; import org.testng.annotations.Parameters; import org.testng.annotations.Test; import static org.testng.Assert.assertEquals; public class ParametrizedUnitTest { @DataProvider (name = "numbers" ) public static Object[][] evenNumbers() { return new Object[][]{{ 11 , false }, { 2222 , true }, { 4882 , true }}; } @Test (dataProvider = "numbers" ) public void evenNumberCheck(Integer number, boolean expected) { assertEquals(expected, number % 2 == 0 ); } РЕКОМЕНДУЕМЫЕ СТАТЬИ |