Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сегодня все большую популярность приобретает.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
270.85 Кб
Скачать

Дополнительные возможности

Кроме всего описанного есть и другие возможности, например для проверки выброса исключений(очень удобно использовать для тестов на неправильных данных):

public class ExceptionTest {

@DataProvider

public Object[][] wrongData() {

return new Object[][] {

{"Hello, World!!!"},

{"0x245"},

{"1798237199878129387197238"},

};

}

@Test(dataProvider = "wrongData", expectedExceptions = NumberFormatException.class,

expectedExceptionsMessageRegExp = "^For input string: \"(.*)\"$")

public void testParse(String data) {

Integer.parseInt(data);

}

}

  • expectedExceptions задает варианты ожидаемых исключений, если они не выбрасываются, тест считается провалившемся.

  • expectedExceptionsMessageRegExp то же что и предыдущий параметр, но задает regexp для сообщения об ошибке.

Еще один пример:

public class PrioritiesTest extends Assert {

private boolean firstTestExecuted;

@BeforeClass

public void setUp() throws Exception {

firstTestExecuted = false;

}

@Test(priority = 0)

public void first() {

assertFalse(firstTestExecuted);

firstTestExecuted = true;

}

@Test(priority = 1)

public void second() {

assertTrue(firstTestExecuted);

}

}

  • priority определяет приоритет теста внутри класса, чем меньше, тем раньше будет выполнен.

Данный пример пройдет успешно, так как сначала выполнится метод first, затем second. Если поменять приоритет у first на 2, тест провалится. Похожее поведение будет наблюдаться также если указать зависимости у теста, например, добавим в наш тест:

public class PrioritiesTest extends Assert {

// some staff

@Test(dependsOnMethods = {"first"})

public void third() {

assertTrue(firstTestExecuted);

}

// some staff

}

Обычно это удобно, когда один тест зависит от другого, например, Утилита1 используетУтилиту0, если Утилита0 работает неправильно, то нет смысла тестировать Утилиту1. С другой стороны зависимости также удобно использовать в @Before, @After методах, особенно для связи базового теста с наследующимся, причем иногда бывает необходимо сделать так, чтобы даже если метод A свалился, а метод B зависит от него, метод B все равно вызывался. В этом случае устанавливаем параметр alwaysRun в true.

Внедрение зависимостей

В TestNG есть встроенная поддержка Guice(Фреймворк обеспечивает поддержку внедрения зависимостей при помощианнотаций для конфигурирования объектов Java.). Выглядит это так:

public class GuiceModule extends AbstractModule {

@Override

protected void configure() {

bind(String.class).annotatedWith(Names.named("guice-string-0")).toInstance("Hello, ");

}

@Named("guice-string-1")

@Inject

@Singleton

@Provides

public String provideGuiceString() {

return "World!!!";

}

}

@Guice(modules = {GuiceModule.class})

public class GuiceTest extends Assert {

@Inject

@Named("guice-string-0")

private String word0;

@Inject

@Named("guice-string-1")

private String word1;

@Test

public void testService() {

final String actual = word0 + word1;

assertEquals(actual, "Hello, World!!!");

}

}

Все, что надо — зааннотировать нужный класс с помощью @Guice и указать в параметре modules все необходимые guice-модули. Далее в тест классе можно уже использовать внедрение зависимостей, используя Inject. Добавлю еще, что у других подобных фреймворков обычно есть своя поддержка TestNG, например, у Spring-а.