一、开发环境
开发语言:java
IDE:Eclipse
主要第三方工具:TestNG、freemarker、maven
二、实现过程
在执行用例时,HttpClient完成http发起请求的处理,TestNG完成用例的调度执行,包括html格式测试报告的生成。
基于接口测试的特点,编写的TestNG执行的用例中,90%的代码都是重复的,而且在java代码中编写的用例不便于维护,接口参数/返回类型有变更时,要更新多个地方的信息。
如果使用Excel来存储接口测试的相关数据,使用者只需关注Excel中每一条用例中参数值及返回的预期结果,
在用例执行之前,自动生成TestNG可执行的用例.java文件和.xml文件。确定接口Excel测试数据文件格式,如下图所示:一看就能明白各项的含义的,不详细一一解释了
cookie:上面的cookie项是全局的cookie,各用例如果有需要可添加cookie列,只对当前用例有效
ArgCount: 参与签名计算的参数个数,如果无需签名,此处写为0
TestPoint表示测试点说明 会在生成的html报告中使用到
timestamp 此参数值写为timestamp,在运行时会转换为Unix时间戳
先贴一段执行入口的代码,然后继续
public static void main(String[] args) {
TestReport report = new TestReport();
TaskSingleModel task = TaskSingleModel.getInstance();//单例模式
// Excel格式的测试用例
task.addCase(“testcase/TestCaseDemo.xlsx”,”demo”,”template/demo接口.java”);
task.addCase(“testcase/TestCaseDemo.xlsx”,”demoTest”,”template/demo接口.java”);
task.setTaskName(“demo测试“);
//可选配置–设置测试报告输出目录,未设置使用默认
// task.setHtmlReportPath(RootPath.getServer_ift_path()+”/report/html”);
// task.setExcelReportPath(RootPath.getServer_ift_path()+”/report/excel”);
//可选配置–设置TestNG执行记录是否输出
//是否输出到Log日志
// TestngLog.setOutputLogFlag(false);
//是否输出到TestNG日志
// TestngLog.setOutputTestNGLog(false);
//执行用例之前是否清空相关临时目录(生成的用例JAVA文件、编译后的CLASS文件、XML配置文件、TestNG输出目录)
TngTools.delTmpPath();
// 执行用例,获取生成的测试报告
report = task.execTask();
//打印测试报告路径信息
System.out.println(“运行的任务名称为:“+report.getTaskName());
System.out.println(“生成的html格式测试报告路径为:“+report.getHtmlReport());
System.out.println(“生成的excel格式测试报告路径为:“+report.getExcelReport());
}
TestReport 记录各种类型测试报告
TaskSingleModel 执行队列,一个Excel的sheet页数据文件,对应TestNG的一个测试集
执行队列的addCase方法支持添加 xml/java/data(Excel)三种格式的测试用例,在这只讲述测试用例格式为Excel的情况
execTask()完成整个执行过程,最后返回测试报告
task.addCase(“testcase/TestCaseDemo.xlsx”,”demoTest”,”template/demo接口.java”);
addCase方法的第一个参数表示Excel用例文件的位置,
第二个参表示要生成的.java用例文件的类名,
第三个参数表示生产用例时使用的模板文件路径在用例执行前,
先读取Excel文件,把所有Run标识为Y的数据读取到List的列表中,其中TestCase是自定义实体类,代表一条测试用例,
读取后,根据模板生成TestNG的测试用例.java文件
模板demo.ftl如下:
package ${javaInfo.packageName};
//省略import
………………
public class ${javaInfo.javaFileName} {
private CasesUtils cau;
private String PATH_NAME;
private String CASE_SHEET_NAME;
private String REPORT_PATH;
private String REPORT_EXCEL_NAME;
private String REPORT_SHEET_NAME;
private ArrayList allcase ;
private ExportReportExcel exportexcel;
//记录预期值与实际值比对情况
private ArrayList<LinkedHashMap<String,String>> arrres;
//预期结果与实际结果比对处理
private CompareResult comresult;
@BeforeTest
public void SetUp() {
cau=new CasesUtils();
allcase=new ArrayList() ;
PATH_NAME=”${javaInfo.caseDataPathName}”;
CASE_SHEET_NAME=”${javaInfo.caseDataSheetName}”;
REPORT_PATH=”${javaInfo.excelReportPath}”;
REPORT_EXCEL_NAME=”${javaInfo.excelReportName}”;
REPORT_SHEET_NAME=”${javaInfo.excelReportSheetName}”;
arrres=new ArrayList<LinkedHashMap<String,String>>();
comresult=new CompareResult();
exportexcel=new ExportReportExcel();
//省略部分逻辑处理操作
………………
}
//根据待执行用例列表,生成对应的测试用例java源码
<#list javaInfo.allCase as CreateJavaCaseID>
@Test(description=”${CreateJavaCaseID.testPoint}()”)
public void ${CreateJavaCaseID.caseId}(){
TestCase testcase=new TestCase();
testcase=allcase.get(${CreateJavaCaseID_index});
Map<String,String> result=new TreeMap<String,String>();
Map<String, String> resmap=new TreeMap<String, String>();//记录执行后返回的map表
String httpurl=””;//记录请求发送的Url
String expres=””;//期望的结果
String response=””;//请求响应的返回字符串
String actres=””;//过滤后实际的结果
boolean res=false;//记录比对结果
//省略部分处理逻辑
………………
}
</#list>
@AfterTest
public void CloseConn() {
//省略部分处理逻辑
………………
cau.closeConn();//关闭http连接
//写入Excel格式测试报告
exportexcel.CreatReportExcel(REPORT_PATH,REPORT_EXCEL_NAME,REPORT_SHEET_NAME,arrres);
}
}
在最终生成的.java用例文件中,@Test部分会根据用例信息生成对应的测试用例,内容如下:
@Test(description=”Demo测试用例“)
public void demo_001(){
TestCase testcase = new TestCase();
testcase=allcase.get(0);
//。。。。。。
}
@Test(description=”DemoTest测试用例“)
public void demo_002(){
TestCase testcase = new TestCase();
testcase=allcase.get(1);
//。。。。。。
}
使用的开源模板引擎freemarker,下载地址:http://sourceforge.net/projects/freemarker/
freemarker的使用很简单,根据模板生成.java的部分代码如下:
/**
说明:根据测试用例数据,创建测试用例.java源码文件
@param javaInfo
@return String
*/
public String Create(CreateJavaInfo javaInfo) {
try {
Configuration cfg =new Configuration();
Map root =new HashMap();
cfg.setDirectoryForTemplateLoading(new File(RootPath.getServer_ift_path()+”template”));
cfg.setObjectWrapper(new DefaultObjectWrapper());
root.put(“javaInfo”,javaInfo);
Template template= cfg.getTemplate(“demo.ftl”);//模板名称
//设置文件输出目录
String fileName = javaInfo.getJavaSavePath() + “/”
javaInfo.getPackageName().replace(“.”, “/”) + “/”
javaInfo.getJavaFileName() + “.java”;
Writer out = new OutputStreamWriter(new FileOutputStream(fileName),”UTF-8″);
template.process(root, out);//根据模板和数据输出.java文件
return fileName;
} catch (IOException | TemplateException e) {
//生成.java文件失败
return null;
}
}
其中CreateJavaInfo是记录用例信息的实体类,包括
private List allCase;//所有用例数据列表
private String packageName;//包名
private String javaFileName;//java文件名
private String javaSavePath;//java文件保存目录
private String caseDataPathName;//用例数据文件路径
private String caseDataSheetName;//Excel用例数据sheet名称
private String templatePathName;//模板路径
private String excelReportSheetName;//excel测试报告sheet名称
private String excelReportName;//excel测试报告文件名称
private String excelReportPath;//excel测试报告存储目录
接下来使用TestNG的XmlSuite、XmlTest类,加载测试用例的.java文件,TestNG输出.xml配置文件,包括设置的分组依赖、线程、顺序等信息,最后输出的xml文件如下:
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE suite SYSTEM “http://testng.org/testng-1.0.dtd”>
至此TestNG运行所需的.java用例文件 .xml配置文件都已根据Excel文件自动生成了,接下来执行用例就好了
Comments