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

Например, предположим, что мы хотели бы утверждать, что группа веб-поисковых систем имеет «окно поиска» на своей домашней странице, но поскольку они поддерживаются разными компаниями, у них нет общего локатора HTML. Здесь мы используем DataProvider для ведения списка URL-адресов и соответствующих им идентификаторов «окна поиска», переходим по URL-адресу и подтверждаем, что окно поиска видимо.

@DataProvider(name = "searchBoxProvider")
public Object[][] searchBoxProvider() {
  return new Object[][] {
    { "https://www.google.com", "lst-ib" },
    { "https://duckduckgo.com", "search_form_input_homepage"},
    { "https://www.dogpile.com/", "topSearchTextBox"},
    { "https://www.bing.com", "sb_form_q"}
  };
}

@Test(dataProvider = "searchBoxProvider")
public void shouldHaveVisibleSearchBox(String url, String searchBoxId) {
  WebDriver driver = new FirefoxDriver();
  driver.get(url);
  WebElement searchBox = driver.findElement(By.id(searchBoxId));
  assertTrue(searchBox.isDisplayed());
}

Однако допустим, что однажды DuckDuckGo добавит на свою главную страницу рекламу, которая скрывает «окно поиска», пока вы его не закроете, но мы все равно хотим утверждать, что «окно поиска» все еще там. Мы могли бы усложнить наш метод @Test, который нажимает на объявление, но только для duckduckgo.com, или мы могли бы добавить второй DataProvider и второй @Test, который выполняет дополнительный шаг. И то, и другое делает тест ужасным для чтения, к сожалению.

@DataProvider(name = "searchBoxProvider")
public Object[][] searchBoxProvider() {
    return new Object[][] {
        { "https://www.google.com", "lst-ib" },
        { "https://duckduckgo.com", "search_form_input_homepage"},
        { "https://www.dogpile.com/", "topSearchTextBox"},
        { "https://www.bing.com", "sb_form_q"}
    };
}

@Test(dataProvider = "searchBoxProvider")
public void shouldHaveVisibleSearchBox(String url, String searchBoxId) {
    WebDriver driver = new FirefoxDriver();
    driver.get(url);
    
    if (StringUtils.equals(url, "https://duckduckgo.com")) {
        WebElement adCloseButton = driver.findElement(By.id('mainAdCloseButton'));
        adCloseButton.click();
    }
    
    WebElement searchBox = driver.findElement(By.id(searchBoxId));
    assertTrue(searchBox.isDisplayed());
}

Использование стратегий

Я обнаружил, что использование DataProviders для предоставления утверждений Стратегии — отличный способ решить проблему такого типа. Здесь мы создаем интерфейс SearchEngine и реализуем классы DefaultSearchEngine и DuckDuckGo, чтобы абстрагировать различное поведение от подготовки страницы из тестового метода.

interface SearchEngine {
    static void preparePage(WebDriver driver);
}

class DefaultSearchEngine implements SearchEngine {
    static void preparePage(WebDriver driver) {
        // do nothing
    }
}

class DuckDuckGo implements SearchEngine {
    static void preparePage(WebDriver driver) {
        WebElement adCloseButton = driver.findElement(By.id('mainAdCloseButton'));
        adCloseButton.click();
    }
}

А затем предоставьте SearchEngine тестовому методу с помощью searchBoxProvider.

@DataProvider(name = "searchBoxProvider")
public Object[][] searchBoxProvider() {
    return new Object[][] {
        { "https://www.google.com", "lst-ib" , new DefaultSearchEngine()},
        { "https://duckduckgo.com", "search_form_input_homepage", new DuckDuckGo()},
        { "https://www.dogpile.com/", "topSearchTextBox", new DefaultSearchEngine()},
        { "https://www.bing.com", "sb_form_q", new DefaultSearchEngine()}
    };
}

@Test(dataProvider = "searchBoxProvider")
public void shouldHaveVisibleSearchBox(String url, String searchBoxId, SearchEngine searchEngine) {
    WebDriver driver = new FirefoxDriver();
    driver.get(url);
    
    searchEngine.preparePage(driver);
    
    WebElement searchBox = driver.findElement(By.id(searchBoxId));
    assertTrue(searchBox.isDisplayed());
}

Первоначально опубликовано на сайте zdwolfe.blogspot.com 27 октября 2015 г.