DDT подход
Рассмотрим классическую ситуацию - тестирование страницы логина на сайт. Нам нужно запонить два поля username и password, а затем нажать кнопку sign in. Данный сценарий представлется очень простым и написание для него теста не должно занять много времени. Но все мы прекрасно знаем, что данные подаваемые на вход могут быть различные: это и неверные username и password, и запрещенные символы, и просто поля могут оставить пустыми. Что же делать автоматизатору в таком случае? Писать отдельные тест для каждого возможного ввода? А если вариантов будет 200 или 300? Это чистой воды утопия. Чтобы избежать подобных проблем существует следующий подхож к тестированию, который называется Data Driven Testing (DDT). DDT позволяет данные хранить отдельно от тестов. Наш написанный тест, каждый раз читает данные из хранилища (базаданных и т.д.) и выполняется, используя их. Продолжается это до тех пор пока тесты не будут запущены со всеми данными.
WebDriver предназначен для работы только лишь с API браузеров. Поэтому чтобы использовать в тестировании подход DDT нам понадобятся сторонние фреймворки. Рассмотрим наиболее популярные при написании JUnit и TestNG.
JUnit и DDT
JUnit — библиотека для модульного тестирования программного обеспечения на языке Java. Чтобы использовать его для DDT нам нужно будет "параметризировать" класс с тестами.
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.By;
import org.junit.*;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
import org.junit.runners.Parameterized;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collection;
@RunWith(value = Parameterized.class)
public class SimpleDDT {
private static WebDriver driver;
private static StringBuffer verificationErrors = new
StringBuffer();
private String height;
private String weight;
private String bmi;
private String bmiCategory;
@Parameters
public static Collection testData() {
return Arrays.asList(
new Object[][] {
{"160","45","17.6","Underweight"},
{"168","70","24.8","Normal"},
{"181","89","27.2","Overweight"},
{"178","100","31.6","Obesity"}
}
);
public SimpleDDT(String height, String weight, String bmi, String bmiCategory)
{
this.height = height;
this.weight = weight;
this.bmi = bmi;
this.bmiCategory = bmiCategory;
}
@Test
public void testBMICalculator() throws Exception {
//Get the Height element and set the value using parameterised
//height variable
WebElement heightField = driver.findElement(By.name("heightCMS"));
heightField.clear();
heightField.sendKeys(height);
//Get the Weight element and set the value using parameterised
//Weight variable
WebElement weightField = driver.findElement(By.name("weightKg"));
weightField.clear();
weightField.sendKeys(weight);
//Click on Calculate Button
WebElement calculateButton = driver.findElement(By.id("Calculate"));
calculateButton.click();
try {
//Get the Bmi element and verify its value using parameterised
//bmi variable
WebElement bmiLabel = driver.findElement(By.name("bmi"));
assertEquals(bmi, bmiLabel.getAttribute("value"));
//Get the Bmi Category element and verify its value using
//parameterised bmiCategory variable
WebElement bmiCategoryLabel = driver.findElement(By.name("bmi_category"));
assertEquals(bmiCategory,bmiCategoryLabel.
getAttribute("value"));
} catch (Error e) {
//Capture and append Exceptions/Errors
verificationErrors.append(e.toString());
System.err.println("Assertion Fail "+ verificationErrors.
toString());
}
}
}
TestNG
TestNG — это фреймворк для тестирования, написанный Java, он взял много чего с JUnit и NUnit, но он не только унаследовался от существующей функциональности Junit, а также внедрения новых инновационных функций, которые делают его мощным, простым в использовании. Попробуем применить его:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.By;
import org.testng.annotations.*;
import static org.testng.Assert.*;
public class TestNGDDT {
private WebDriver driver;
private StringBuffer verificationErrors = new StringBuffer();
@DataProvider
public Object[][] testData() {
return new Object[][] {
new Object[] {"160","45","17.6","Underweight"},
new Object[] {"168","70","24.8","Normal"},
new Object[] {"181","89","27.2","Overweight"},
new Object[] {"178","100","31.6","Obesity"},
};
}
@BeforeTest
public void setUp() {
// Create a new instance of the Firefox driver
driver = new FirefoxDriver();
driver.get("http://dl.dropbox.com/u/55228056/bmicalculator.html");
}
@Test(dataProvider = "testData")
public void testBMICalculator(String height, String weight, String
bmi, String category) {
try {
WebElement heightField = driver.findElement(By.name("heightCMS"));
heightField.clear();
heightField.sendKeys(height);
WebElement weightField = driver.findElement(By.name("weightKg"));
weightField.clear();
weightField.sendKeys(weight);
WebElement calculateButton = driver.findElement(By.id("Calculate"));
calculateButton.click();
WebElement bmiLabel = driver.findElement(By.name("bmi"));
assertEquals(bmiLabel.getAttribute("value"),bmi);
WebElement bmiCategoryLabel = driver.findElement(By.name("bmi_category"));
assertEquals(bmiCategoryLabel.getAttribute("value"),category);
} catch (Error e) {
//Capture and append Exceptions/Errors
verificationErrors.append(e.toString());
}
}
@AfterTest
public void tearDown() {
//Close the browser
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
}