目標(biāo):通過讀取多個excel用例涩嚣,自動創(chuàng)建Test
方法:根據(jù)官網(wǎng)提供的注解@Factory的用法,來創(chuàng)建多個測試類
工程結(jié)構(gòu):
image.png
1.首先在工程目錄下創(chuàng)建一個caseexcel文件夾來存放用例
image.png
2.遍歷文件夾獲取用例文件
static public ArrayList<String> getCasePathList() {
ArrayList<String> files = new ArrayList<String>();
File file = new File("caseexcel/");
File[] tempList = file.listFiles();
if (tempList.length > 0) {
for (int i = 0; i < tempList.length; i++) {
if (tempList[i].isFile()) {
System.out.println("文 件:" + tempList[i]);
files.add(tempList[i].toString());
}
if (tempList[i].isDirectory()) {
// System.out.println("文件夾:" + tempList[i]);
}
}
} else {
throw new NullPointerException("沒有找到case");
}
return files;
}
3.測試類
將上一次測試類中的各個方法copy過來
新增屬性publicCaseList、caseList用來接收測試用例
package com.testng.testng;
import java.util.List;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import Util.CaseModel;
import Util.CaseType;
import Util.Driver;
import Util.StepModel;
import Util.WebElementZ;
public class WebTest {
private List<CaseModel> publicCaseList;//公共用例
private List<CaseModel> caseList;//普通用例
//構(gòu)成方法凰荚;
@SuppressWarnings("static-access")
public WebTest(List<CaseModel> publicCaseList,List<CaseModel> caseList) {
this.publicCaseList = publicCaseList;
this.caseList = caseList;
}
@Test(dataProvider = "dp")
public void f(CaseModel caseModel) {
System.out.println("執(zhí)行了用例" + caseModel);
doCase(caseModel);
}
@AfterClass
public void AfterClass() {
Driver.getChromeDriver().quit();
Driver.setChromeDriver(null);
}
@BeforeClass
public void BeforeClass() {
}
@DataProvider
public Object[] dp() {
//獲取用例
int size = caseList.size();
Object[] objects = new Object[size];
for (int i = 0; i < objects.length; i++) {
objects[i] = caseList.get(i);
}
return objects;
}
//根據(jù)casel模型執(zhí)行用例
public void doCase(CaseModel caseModel) {
for (int i = 0; i < caseModel.getStepModels().size(); i++) {
StepModel stepModel = caseModel.getStepModels().get(i);
System.out.println(stepModel);
String object = stepModel.getObject();
if (stepModel.getPrecondition() != null) {
//執(zhí)行前置條件
for (CaseModel caseModel2 : publicCaseList) {
if (stepModel.getPrecondition().equals(caseModel2.getCaseName())) {
//根據(jù)casename查找到說要執(zhí)行的公共用例
doCase(caseModel2);
break;
}
}
}
if (object.equals("driver")) {
Driver.action(stepModel);
} else {
//懶得寫elseif。這里假裝判斷了是element
WebElementZ.ElementAction(stepModel);
}
}
}
}
4.根據(jù)用例個數(shù)生成多個測試類對象
@Factory
public Object[] createInstances() {
List<String> pathList = getCasePathList();//獲取測試用例文件
Object[] result = new Object[pathList.size()];
for (int i = 0; i < pathList.size(); i++) {
//生成測試類對象,將公共用例與普通用例解析后傳入對象
CaseModel.getCaseList(pathList.get(i), CaseType.publicCase);
result[i] = new WebTest(CaseModel.getCaseList(pathList.get(i), CaseType.publicCase),
CaseModel.getCaseList(pathList.get(i), CaseType.ordinaryCase));
}
return result;
}
5.在testng.xml中添加class
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
<test thread-count="5" name="Test">
<classes>
<class name="com.testng.testng.WebTestFactory"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
完事
6.以下官網(wǎng)內(nèi)容
5.8 - 工廠
工廠創(chuàng)建了10個測試類@Factory
public class WebTestFactory {
@Factory
public Object[] createInstances() {
Object[] result = new Object[10];
for (int i = 0; i < 10; i++) {
result[i] = new WebTest(i * 10);
}
return result;
}
}
測試類
public class WebTest {
private int m_numberOfTimes;
public WebTest(int numberOfTimes) {
m_numberOfTimes = numberOfTimes;
}
@Test
public void testServer() {
for (int i = 0; i < m_numberOfTimes; i++) {
// access the web page
}
}
}
通過testng.xml調(diào)用寡喝,添加工廠WebTestFactory
<class name="WebTestFactory" />
通過代碼執(zhí)行
TestNG testNG = new TestNG();
testNG.setTestClasses(WebTestFactory.class);
testNG.run();