我正在使用testNG,Selenium和Jenkins开发测试自动化框架。代码工作正常,它读取一个或多个csv文件并将其用作测试数据。我从詹金斯那里进行测试。
package test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;
public class runTest {
private WebDriver myDriver = null;
@BeforeTest
public void openBrowser(){
System.out.println("This test automation framework is created by --- for ---");
//Set browser
//System.setProperty("webdriver.chrome.driver", "C://Temp//chromedriver.exe");
//System.setProperty("webdriver.ie.driver", "C://Temp//IEDriverServer.exe");
//Instantiate new WebDriver object with browser of choice
myDriver = new FirefoxDriver();
//myDriver = new InternetExplorerDriver();
//myDriver = new ChromeDriver();
myDriver.get("http://localhost/tests/");
}
@Test (dataProvider="provideData")
public void csvTest(String stepNr, String timeWaitMil, String waitForElement, String clickOnCssNameXpathLink,
String valueInTextBox, String backspaceText, String assertReturnTrueFalse,
String assertBy, String getUrl,
String deleteCookie, String snapshot, String specialSnapshot){
// Click on a something based on css, name xpath or link
if (!"-".equals(clickOnCssNameXpathLink)){
myDriver.findElement(By.name(clickOnCssNameXpathLink)).click();
}
// Enter value in textbox
if (!"-".equals(valueInTextBox)){
myDriver.findElement(By.name(clickOnCssNameXpathLink)).sendKeys(valueInTextBox);
}
// Delete cookies
if (!"-".equals(deleteCookie)){
myDriver.manage().deleteAllCookies();
}
// Make snapshot of whole page
if (snapshot.equalsIgnoreCase("true")){
// take the screenshot of full page
File scrFile = ((TakesScreenshot)myDriver).getScreenshotAs(OutputType.FILE);
// prepare date to use in filename
Date d = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH-mm-ss");
// Save screenshot
try {
FileUtils.copyFile(scrFile, new File("c:\\Temp\\screenshots\\full_page_" +dateFormat.format(d)+ ".png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("Could not make screenshot");
}
}
}
@DataProvider
public Iterator<Object []> provideData() throws InterruptedException, IOException
{
//Array with multiple csv's
String csvFiles[] = {"C:/Users/---/Desktop/JES2.0/testingSelenium/testNG/data.csv", "C:/Users/---/Desktop/JES2.0/testingSelenium/testNG/data2.csv"};
List<Object []> testCases = new ArrayList<>();
//loop through csv files
for(String csvFile:csvFiles){
String[] data= null;
//read csv file
BufferedReader br = new BufferedReader(new FileReader(csvFile));
//Skip first line in the csv file, because that only contains the column names
String line = br.readLine();
//loop through csv and split parameters by comma sign ,
while ((line = br.readLine()) != null) {
// use comma as separator
data= line.split(",");
testCases.add(data);
}//end of while loop
}// end of for loop
return testCases.iterator();
}
@AfterTest
public void closeBrowser(){
//close browser
myDriver.quit();
}
}
如您所见,浏览器,网址和CSV文件都是硬编码的。我希望能够将这些作为参数传递。做这个的最好方式是什么?是否可以通过Jenkins传递它们?
我正在考虑构建一个仪表板,我可以在其中指定使用哪个浏览器运行哪些测试(csv文件)。
这是我正在运行的Jenkins批处理命令
java -cp C:\Users\---\Desktop\JES2.0\testingSelenium\testNG\libs\selenium-server-standalone-2.43.1.jar;C:\Users\---\Desktop\JES2.0\testingSelenium\testNG\bin org.testng.TestNG testng.xml
答案 0 :(得分:1)
詹金斯有一个built-in parameters handling,这是一种非常灵活的方式。但在这种情况下,由于您希望将文件名作为参数传递,因此您可以轻松地将该功能与Filesystem List Parameter结合使用,{{3}}可以基于将解析文件列表的正则表达式构建列表。
如果您使用Maven或Ant,则可以使用与此类似的形式在构建过程中嵌入该参数:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<environment>${env.PARAM}</environment>
</systemPropertyVariables>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
通过这个,你可以读取传递给Maven的参数 - 在Jenkins中使用它的内部调用者,并在命令行上使用:
mvn install -Denv.PARAM=VALUE
所以它应该以任何方式工作......