25 вопросов на собеседовании по TestNG

TestNG — один из самых широко используемых фреймворков для тестирования, подходящий как для модульного, так и для автоматизированного тестирования. В этой статье мы собрали наиболее часто задаваемые вопросы и ответы на интервью по TestNG для новичков и опытных специалистов.

Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ

Вопрос 1. Что такое TestNG?

TestNG (NG — Next Generation) — это фреймворк для тестирования, который может быть интегрирован с Selenium или любым другим инструментом автоматизации для обеспечения различных возможностей, таких как утверждения (assertions), создание отчетов, параллельное выполнение тестов и многое другое.

Вопрос 2. Каковы преимущества TestNG?

Основные преимущества TestNG:

  1. Поддержка различных утверждений, которые помогают проверить ожидаемые и фактические результаты.
  2. Параллельное выполнение тестовых методов.
  3. Возможность указания зависимости одного тестового метода от других.
  4. Установка приоритетов для тестов в Selenium.
  5. Группировка тестовых методов в группы.
  6. Поддержка тестирования на основе данных с помощью аннотации @DataProvider.
  7. Встроенная поддержка отчетности.
  8. Возможность параметризации тест-кейсов с использованием аннотации @Parameters.

Вопрос 3. Чем TestNG отличается от Selenium WebDriver?

Selenium — это инструмент автоматизации, с помощью которого можно автоматизировать тестирование веб-приложений. TestNG добавляет возможности тестирования в автоматизированные наборы тестов. С его помощью можно добавлять такие функции, как утверждения, отчетность, параллельное выполнение, параметризация и др.
Проще говоря, Selenium обеспечивает автоматизацию, а TestNG добавляет тестовые возможности.

Вопрос 4. Для чего используется файл testng.xml?

Файл testng.xml используется для настройки всего тестового набора. В нем можно:

  • создавать тестовые наборы;
  • группировать тесты;
  • отмечать тесты для параллельного выполнения;
  • добавлять слушатели (listeners);
  • передавать параметры в скрипты

Также файл testng.xml позволяет запускать тесты из командной строки или через Jenkins.

Вопрос 5. Как сгруппировать тест-кейсы, например, для наборов Sanity и Regression?

Используя атрибут groups в TestNG, можно назначить методы к определенным группам.

// Тестовый метод только для Sanity-набора
@Test(groups = {"sanitySuite"})
public void testMethod1() {
  // Логика теста
}

// Тестовый метод для Sanity и Regression-наборов
@Test(groups = {"sanitySuite", "regressionSuite"})
public void testMethod2() {
  // Логика теста
}

Вопрос 6. Как исключить тестовый метод из выполнения через файл testng.xml?

Используя тег <exclude> в testng.xml, можно исключить определенный тестовый метод.

<suite name="Test Suite" verbose="1">
   <test name="TestName">
      <classes>
         <class name="TestClassName">
            <methods>
               <exclude name="testMethodToBeExcluded"/>
            </methods>
         </class>      
      </classes>
   </test>
</suite>

Вопрос 7. Какие аннотации чаще всего используются в TestNG?

Основные аннотации TestNG:

  • @Test — обозначает метод как тестовый.
  • @BeforeSuite — выполняется один раз перед запуском всех тестов в наборе.
  • @AfterSuite — выполняется один раз после выполнения всех тестов в наборе.
  • @BeforeClass — выполняется один раз перед первым методом в текущем классе.
  • @AfterClass — выполняется один раз после выполнения всех методов в текущем классе.
  • @BeforeTest — выполняется перед запуском любых тестов в <test> теге.
  • @AfterTest — выполняется после завершения всех тестов в <test> теге.
  • @BeforeMethod — выполняется перед каждым тестовым методом.
  • @AfterMethod — выполняется после каждого тестового метода.
  • @DataProvider — используется для передачи тестовых данных. Метод будет выполняться столько раз, сколько строк данных передано через DataProvider.

Вопрос 8. В каком порядке выполняются аннотации TestNG?

TestNG следует порядку: Набор → Тест → Класс → Метод с последовательностью аннотаций Before → Test → After.

  • @BeforeSuite
  • @BeforeTest
  • @BeforeClass
  • @BeforeMethod
  • @Test
  • @AfterMethod
  • @AfterClass
  • @AfterTest
  • @AfterSuite

Вопрос 9. Какие утверждения используются в TestNG?

Примеры утверждений в TestNG:

  1. assertEquals(String actual, String expected, String message)
  2. assertNotEquals(double data1, double data2, String message)
  3. assertFalse(boolean condition, String message)
  4. assertTrue(boolean condition, String message)
  5. assertNotNull(Object object)
  6. fail(boolean condition, String message)

Вопрос 10. Как отключить выполнение тестового метода?

Указав атрибут enabled = false, можно отключить выполнение теста.

// Для одного метода
@Test(enabled = false)
public void testMethod1() {
  // Логика теста
}

// Для метода, принадлежащего группе
@Test(groups = {"NegativeTests"}, enabled = false)
public void testMethod2() {
  // Логика теста
}

Вопрос 11. Как задать зависимость тестового метода от другого?

Используя параметр dependsOnMethods в аннотации @Test, можно сделать выполнение метода зависимым от успешного выполнения другого.

@Test(dependsOnMethods = { "preTests" })
public void testMethod() {
  // Логика теста
}

Вопрос 12. Как задать приоритет тестовых методов в TestNG?

Приоритет задается через параметр priority в аннотации @Test. Методы с более низким значением приоритета выполняются первыми.

@Test(priority = 1)
public void testMethod() {
  // Логика теста
}

Вопрос 13. Каков приоритет по умолчанию для тестовых методов?

Если приоритет не указан, по умолчанию он равен 0. Если есть тесты с явным приоритетом, то тест без приоритета (то есть с 0) выполнится раньше.

Вопрос 14. Как запустить тестовый метод несколько раз в цикле (без использования DataProvider)?

Можно использовать параметр invocationCount, который указывается в аннотации @Test. Этот параметр задаёт количество запусков тестового метода.

@Test(invocationCount = 10)
public void invocationCountTest() {
   // Логика теста
}

Указываем invocationCount = 10, и метод invocationCountTest выполнится 10 раз. Это удобно для проверки стабильности теста, например, чтобы убедиться, что тест проходит без сбоев при многократном запуске.

Вопрос 15. Что такое threadPoolSize? Как его использовать?

Атрибут threadPoolSize указывает количество потоков, которые нужно выделить для метода тестирования. Этот атрибут используется совместно с атрибутом invocationCount. Количество потоков будет разделено на количество итераций, указанных в invocationCount.

@Test(threadPoolSize = 5, invocationCount = 10)
public void threadPoolTest() {
   // Логика теста
}

Как это работает:

  1. threadPoolSize = 5 создаёт 5 потоков.
  2. invocationCount = 10 запускает метод 10 раз.
  3. Потоки распределяют эти 10 запусков, что ускоряет выполнение.

Вопрос 16. В чем разница между мягкими (soft) и жесткими (hard) утверждениями в TestNG?

  • Мягкие утверждения (SoftAssert) позволяют выполнять несколько проверок внутри одного тестового метода. Даже если одна из проверок завершится сбоем, метод продолжит выполнение остальных. Для фиксации результатов всех проверок используется метод softAssert.assertAll(). Пример:
@Test
public void softAssertionTest() {
   SoftAssert softAssert = new SoftAssert();
 
   // Проверка, которая завершится сбоем
   softAssert.fail();
   System.out.println("Failing");
   
   // Проверка, которая пройдет успешно
   softAssert.assertEquals(1, 1);
   System.out.println("Passing");
   
   // Сводка результатов теста
   softAssert.assertAll();
}

Даже если первая проверка завершится сбоем, тест продолжит выполнение и выведет сообщение после второй проверки.

  • Жесткие утверждения (HardAssert) — это стандартные утверждения TestNG. Если одна из проверок завершается сбоем, выполнение метода сразу же прекращается.
@Test
public void hardAssertionTest() {
   Assert.assertEquals(1, 2); // Тест завершится с ошибкой
   System.out.println("Эта строка не выполнится");
}

Вопрос 17. Как завершить тест в TestNG, если он не был выполнен за указанное время?

Для этого используется атрибут timeOut в аннотации @Test. Если тест не выполнится в указанное время, он завершится с исключением TimeoutException.

@Test(timeOut = 1000)
public void timeOutTest() throws InterruptedException {
   // Ожидание 2 секунды, чтобы тест завершился сбоем
   Thread.sleep(2000);
   System.out.println("Будет вызвано исключение TimeoutException!");
}

Вопрос 18. Как пропустить тест?

Для этого используется SkipException. Если он выбрасывается, тест помечается как пропущенный, и дальнейшие действия внутри метода не выполняются.

@Test
public void testMethod() {
   if (условиеДляПропускаТеста)
      throw new SkipException("Пропуск теста");
   // Логика теста
}

Вопрос 19. Как сделать так, чтобы тестовый метод выполнялся, даже если методы или группы, от которых он зависит, завершились с ошибкой или были пропущены?

Используйте атрибут alwaysRun аннотации @Test. Он гарантирует выполнение метода даже при сбоях или пропуске зависимых тестов.

@Test
public void parentTest() { 
   Assert.fail("Failed test");
}

@Test(dependsOnMethods = {"parentTest"}, alwaysRun = true) 
public void dependentTest() { 
   System.out.println("Выполняется, даже если родительский тест завершился сбоем");
}

Как это работает:

  • Без alwaysRun зависимый тест пропустится.
  • С alwaysRun = true он выполнится в любом случае.

Вопрос 20. Как передать параметр в тестовый скрипт с использованием TestNG?

С помощью аннотации @Parameter и тега parameter в файле testng.xml можно передавать параметры в тестовые скрипты.

Пример файла testng.xml:

<suite name="sampleTestSuite">
   <test name="sampleTest">   
      <parameter name="sampleParamName" value="sampleParamValue"/>
      <classes>
         <class name="TestFile" />
      </classes>      
   </test>
</suite>

Пример тестового скрипта:

public class TestFile {
   @Test
   @Parameters("sampleParamName")
   public void parameterTest(String paramValue) {
      System.out.println("Значение sampleParamName - " + sampleParamValue);
   }
}

Вопрос 21. Как создать фреймворк, основанный на данных, с использованием TestNG?

С помощью аннотации @DataProvider можно создать фреймворк, в котором данные передаются в тестовый метод, а тест выполняется многократно для разных значений данных, возвращенных методом DataProvider.

Рассмотрим пример, в котором тест выполнится два раза, с разными наборами данных:

@DataProvider(name = "dataProvider1")
public Object[][] dataProviderMethod1() {
   return new Object[][] {{"kuldeep", "rana"}, {"k1", "r1"}, {"k2", "r2"}};
}

@Test(dataProvider = "dataProvider1")
public void sampleTest(String s1, String s2) {
   System.out.println(s1 + " " + s2);
}

Вопрос 22. Для чего используется аннотация @Listener в TestNG?

TestNG предоставляет различные слушатели (Listeners), которые позволяют выполнять действия при возникновении определенных событий. Обычно слушатели TestNG используются для настройки отчетов и логирования.

Пример использования слушателя:

@Listeners(PackageName.CustomizedListenerClassName.class)
public class TestClass { 
   WebDriver driver = new FirefoxDriver();
   
   @Test 
   public void testMethod() {
      // Логика теста
   }
}

Вопрос 23. Для чего используется аннотация @Factory в TestNG?

Аннотация @Factory позволяет выполнять тестовые методы с разными наборами данных, переданными всему классу во время выполнения.

Пример:

public class TestClass {
   private String str;

   // Конструктор
   public TestClass(String str) {
      this.str = str;
   }

   @Test
   public void TestMethod() {
      System.out.println(str);
   }
}

public class TestFactory {
   @Factory
   public Object[] factoryMethod() {
      return new Object[] { new TestClass("K1"), new TestClass("k2") };
   }
}

Вопрос 24. В чем разница между аннотациями @Factory и @DataProvider?

  • @Factory создает экземпляры тестового класса и запускает все тестовые методы этого класса с разными наборами данных.
  • @DataProvider привязывается к отдельным тестовым методам и выполняет их многократно с разными наборами данных.

Вопрос 25. Как запускать тесты параллельно в TestNG?

Для запуска тестов параллельно добавьте атрибуты parallel и thread-count в тег <suite> файла testng.xml:

<suite name="ArtOfTestingTestSuite" parallel="methods" thread-count="5">

При parallel="methods" тестовые методы запускаются параллельно, а при thread-count="5" используется 5 потоков.

Примечание редакции: если вы хотите больше узнать про TestNG, рекомендуем ознакомиться с данными статьями: “Лучшие вопросы и ответы на собеседовании по TestNG” и “50 вопросов по TestNG на собеседовании в 2024 году”. Эти материалы помогут вам не только подготовиться к собеседованию, но и значительно расширить ваши знания о TestNG.

Перевод статьи «TestNG Interview Questions».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *