Selenium自動化測試:如何讀取 CSV當作測試個案(Java/TestNG為例子)

Selenium自動化測試:如何讀取 CSV當作測試個案(Java/TestNG為例子)

這篇文章主要說明如何利用CSV定義測試資料,並且利用TestNG讀取測試資料,

如以一來,每一組測試資料就是一個測試個案。

要新增或是修改測試個案只需要修改 CSV的測試資料即可,不需要修改任何程式。

測試資料CSV中可以定義測試資料之外還可以定義預期測試結果。

這樣的測試方法又稱為 Data Driven Testing (DDT),

最後我們用 Selenium/Java/TestNG為例子,實作網站的自動化測試並驗證結果。

DDT concept2

 測試情境

我們將定義一個 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]

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *