DDT подход
Рассмотрим классическую ситуацию - тестирование страницы логина на сайт. Нам нужно заполнить два поля username и password, а затем нажать кнопку sign in. Данный сценарий представляется очень простым и написание для него теста не должно занять много времени. Но все мы прекрасно знаем, что данные подаваемые на вход могут быть различные: это и неверные username и password, и запрещенные символы, и просто поля могут оставить пустыми. Что же делать автоматизатору в таком случае? Писать отдельные тесты для каждого возможного ввода? А если вариантов будет 200 или 300? Это чистой воды утопия. Чтобы избежать подобных проблем существует следующий подход к тестированию, который называется Data Driven Testing (DDT). DDT позволяет данные хранить отдельно от тестов. Наш написанный тест каждый раз читает данные из хранилища (базаданных и т.д.) и выполняется, используя их. Продолжается это до тех пор, пока тесты не будут запущены со всеми данными.
WebDriver предназначен для работы только лишь с API браузеров. Поэтому, чтобы использовать в тестировании подход DDT, нам понадобятся сторонние фреймворки. Рассмотрим наиболее популярные при написании JUnit и TestNG.

JUnit и DDT

JUnit — библиотека для модульного тестирования программного обеспечения на языке Java. Чтобы использовать его для DDT нам нужно будет "параметризировать" класс с тестами.
1
import org.openqa.selenium.firefox.FirefoxDriver;
2
import org.openqa.selenium.WebDriver;
3
import org.openqa.selenium.WebElement;
4
import org.openqa.selenium.By;
5
import org.junit.*;
6
import org.junit.runner.RunWith;
7
import org.junit.runners.Parameterized.Parameters;
8
import org.junit.runners.Parameterized;
9
import static org.junit.Assert.*;
10
import java.util.Arrays;
11
import java.util.Collection;
12
13
@RunWith(value = Parameterized.class)
14
public class SimpleDDT {
15
private static WebDriver driver;
16
private static StringBuffer verificationErrors = new
17
StringBuffer();
18
19
private String height;
20
private String weight;
21
private String bmi;
22
private String bmiCategory;
23
24
@Parameters
25
public static Collection testData() {
26
return Arrays.asList(
27
new Object[][] {
28
{"160","45","17.6","Underweight"},
29
{"168","70","24.8","Normal"},
30
{"181","89","27.2","Overweight"},
31
{"178","100","31.6","Obesity"}
32
}
33
);
34
35
public SimpleDDT(String height, String weight, String bmi, String bmiCategory)
36
{
37
this.height = height;
38
this.weight = weight;
39
this.bmi = bmi;
40
this.bmiCategory = bmiCategory;
41
}
42
43
@Test
44
public void testBMICalculator() throws Exception {
45
//Get the Height element and set the value using parameterised
46
//height variable
47
WebElement heightField = driver.findElement(By.name("heightCMS"));
48
heightField.clear();
49
heightField.sendKeys(height);
50
51
//Get the Weight element and set the value using parameterised
52
//Weight variable
53
WebElement weightField = driver.findElement(By.name("weightKg"));
54
weightField.clear();
55
weightField.sendKeys(weight);
56
57
//Click on Calculate Button
58
WebElement calculateButton = driver.findElement(By.id("Calculate"));
59
calculateButton.click();
60
try {
61
//Get the Bmi element and verify its value using parameterised
62
//bmi variable
63
WebElement bmiLabel = driver.findElement(By.name("bmi"));
64
assertEquals(bmi, bmiLabel.getAttribute("value"));
65
66
//Get the Bmi Category element and verify its value using
67
//parameterised bmiCategory variable
68
WebElement bmiCategoryLabel = driver.findElement(By.name("bmi_category"));
69
assertEquals(bmiCategory,bmiCategoryLabel.
70
getAttribute("value"));
71
72
} catch (Error e) {
73
//Capture and append Exceptions/Errors
74
verificationErrors.append(e.toString());
75
System.err.println("Assertion Fail "+ verificationErrors.
76
toString());
77
}
78
}
79
}
Copied!

TestNG

TestNG — это фреймворк для тестирования, написанный Java, он взял много чего с JUnit и NUnit, но он не только унаследовался от существующей функциональности Junit, а также внедрения новых инновационных функций, которые делают его мощным, простым в использовании. Попробуем применить его:
1
import org.openqa.selenium.WebDriver;
2
import org.openqa.selenium.firefox.FirefoxDriver;
3
import org.openqa.selenium.WebElement;
4
import org.openqa.selenium.By;
5
import org.testng.annotations.*;
6
import static org.testng.Assert.*;
7
8
public class TestNGDDT {
9
private WebDriver driver;
10
private StringBuffer verificationErrors = new StringBuffer();
11
12
@DataProvider
13
public Object[][] testData() {
14
return new Object[][] {
15
new Object[] {"160","45","17.6","Underweight"},
16
new Object[] {"168","70","24.8","Normal"},
17
new Object[] {"181","89","27.2","Overweight"},
18
new Object[] {"178","100","31.6","Obesity"},
19
};
20
}
21
22
@BeforeTest
23
public void setUp() {
24
// Create a new instance of the Firefox driver
25
driver = new FirefoxDriver();
26
driver.get("http://dl.dropbox.com/u/55228056/bmicalculator.html");
27
}
28
29
@Test(dataProvider = "testData")
30
public void testBMICalculator(String height, String weight, String
31
bmi, String category) {
32
try {
33
WebElement heightField = driver.findElement(By.name("heightCMS"));
34
heightField.clear();
35
heightField.sendKeys(height);
36
37
WebElement weightField = driver.findElement(By.name("weightKg"));
38
weightField.clear();
39
weightField.sendKeys(weight);
40
41
WebElement calculateButton = driver.findElement(By.id("Calculate"));
42
calculateButton.click();
43
44
WebElement bmiLabel = driver.findElement(By.name("bmi"));
45
assertEquals(bmiLabel.getAttribute("value"),bmi);
46
47
WebElement bmiCategoryLabel = driver.findElement(By.name("bmi_category"));
48
assertEquals(bmiCategoryLabel.getAttribute("value"),category);
49
50
} catch (Error e) {
51
//Capture and append Exceptions/Errors
52
verificationErrors.append(e.toString());
53
}
54
}
55
56
@AfterTest
57
public void tearDown() {
58
//Close the browser
59
driver.quit();
60
String verificationErrorString = verificationErrors.toString();
61
if (!"".equals(verificationErrorString)) {
62
fail(verificationErrorString);
63
}
64
}
65
}
Copied!
Copy link