Selenium自動化測試:如何讀取 CSV當作測試個案(Java/TestNG為例子)
這篇文章主要說明如何利用CSV定義測試資料,並且利用TestNG讀取測試資料,
如以一來,每一組測試資料就是一個測試個案。
要新增或是修改測試個案只需要修改 CSV的測試資料即可,不需要修改任何程式。
測試資料CSV中可以定義測試資料之外還可以定義預期測試結果。
這樣的測試方法又稱為 Data Driven Testing (DDT),
最後我們用 Selenium/Java/TestNG為例子,實作網站的自動化測試並驗證結果。
測試情境
我們將定義一個 CSV,其中包含三個值
瀏覽的網址=>點選該網頁的連結=>驗證點選完連結後視窗的Title
例如這個 CSV來說,第一個測試個案定義為 http://www.google.com/intl/en/about/products/,Web Search,The Google app
因此,程式啟動FireFox之後會瀏覽 http://www.google.com/intl/en/about/products/
點選網頁上Web Search的連結,
最後驗證該網頁視窗的 title 是否為 The Google app
第二個測試個案定義為http://www.google.com/intl/en/about/products/,Google Chrome,Chrome
依此類推。每一次的測試個案都是相互獨立。
[pastacode lang=”java” message=”” highlight=”” provider=”manual”]
http://www.google.com/intl/en/about/products/,Web Search,The Google app
http://www.google.com/intl/en/about/products/,Google Chrome,Chrome
http://www.google.com/intl/en/about/products/,YouTube,YouTube directory – News from Google – Google
[/pastacode]
程式說明
必須定義@DataProvider(name = “links”)
這段主要用來讀取 CSV的測試資料,並且提供為 TestNG 當作測試資料
[pastacode lang=”java” message=”” highlight=”” provider=”manual”]
@DataProvider(name = "links")
public Object[][] getLinks() throws IOException {
List<String> lines = FileUtils.readLines(new File("links.csv"));
Object[][] csvData = new Object[lines.size()][3];
for (int i = 0; i < lines.size(); i++) {
csvData[i] = COMMA.split(lines.get(i));
}
return csvData;
}
[/pastacode]
將測試資料讀取完畢之後,使用測試資料,並須定義 @Test(dataProvider = “links”)
因為每一筆測試資料有三個變數,變數間以”,”為分隔,因此必須要在測試的method中,定義三個變數如下:
public void verifyLinks(String url, String link, String title)
接著就可以使用這三個變數進行程式的測試。url, link, title。
完整程式範例
[pastacode lang=”markup” message=”Selenium DDT in TestNG” highlight=”” provider=”manual”]
package mySelenium;
import static org.testng.AssertJUnit.assertEquals;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Wait;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class testNG_CSV {
private static final Pattern COMMA = Pattern.compile(",");
private WebDriver driver;
private Wait<WebDriver> wait;
@DataProvider(name = "links")
public Object[][] getLinks() throws IOException {
List<String> lines = FileUtils.readLines(new File("links.csv"));
Object[][] csvData = new Object[lines.size()][3];
for (int i = 0; i < lines.size(); i++) {
csvData[i] = COMMA.split(lines.get(i));
}
return csvData;
}
@BeforeTest
public void setUp() throws Exception {
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
wait = new WebDriverWait(driver, 10);
}
@AfterTest
public void tearDown() throws Exception {
driver.quit();
}
@Test(dataProvider = "links")
public void verifyLinks(String url, String link, String title) {
driver.get(url);
driver.findElement(By.partialLinkText(link)).click();
wait.until(ExpectedConditions.titleIs(title));
assertEquals(title, driver.getTitle());
}
}
[/pastacode]