09月27, 2013

接口测试自动化框架之用例生成自动化

一、开发环境

  1. 开发语言:java

  2. IDE:Eclipse

  3. 主要第三方工具:TestNG、freemarker、maven

二、实现过程

在执行用例时,HttpClient完成http发起请求的处理,TestNG完成用例的调度执行,包括html格式测试报告的生成。

基于接口测试的特点,编写的TestNG执行的用例中,90%的代码都是重复的,而且在java代码中编写的用例不便于维护,接口参数/返回类型有变更时,要更新多个地方的信息。
如果使用Excel来存储接口测试的相关数据,使用者只需关注Excel中每一条用例中参数值及返回的预期结果,

在用例执行之前,自动生成TestNG可执行的用例.java文件和.xml文件。确定接口Excel测试数据文件格式,如下图所示:一看就能明白各项的含义的,不详细一一解释了
1

  1. cookie:上面的cookie项是全局的cookie,各用例如果有需要可添加cookie列,只对当前用例有效

  2. ArgCount: 参与签名计算的参数个数,如果无需签名,此处写为0

  3. TestPoint表示测试点说明 会在生成的html报告中使用到

  4. 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”>

<!– Demo –>

<!– DemoTest –>

<!– Demo_XML文件–>

至此TestNG运行所需的.java用例文件 .xml配置文件都已根据Excel文件自动生成了,接下来执行用例就好了

本文链接:http://blogs.360.cn/post/70.html

-- EOF --

Comments