java http接口测试框架,基于Java+HttpClient+TestNG的接口自动化测试框架(七)------ 测试函数的读取实现...

本文介绍了如何通过正则表达式识别函数名称,找到对应的接口实现类,进而自动化调用并获取执行结果。讲解了`classFinder`类用于查找类路径下的子类和接口,`functionUtil`中存储函数映射并执行。

之前一篇,我们说了一些测试用函数的接口类与实现类,这样相当于我们已经构造了我们想使用的函数。那么,如何让程序知道我们使用的是函数,并调用接口实现类进行处理后将结果放入我们想要的地方呢?

在这里,我们需要整理一下我们的思路。

首先,我们可以通过正则表达式来匹配到我们的函数名称。其次,在得知函数名称的情况下,调用对应函数的接口实现类的方法去执行。最后,将值传递回我们需要填入的地方。

在这里,我们先看看如何使用正则表达式来实现匹配函数名称。(我们使用函数的样式为“_funcName(args)”)

protected Pattern funPattern =Pattern

.compile("__(\\w*?)\\((([\\w\\\\\\/:\\.\\$]*,?)*)\\)");

可以使用这个正则表达式来匹配【_funcName(args)】的形式。有关正则这里不再详细说明。

在知道了函数名称之后,怎样调用对应函数的接口实现类的方法去执行呢?这里我们还是整理一下思路。

----->先找到当前项目路径下所有的类,然后过滤获取这个路径下所有子类或接口实现类。通过一个集合,将函数名与测试函数接口对应起来,存入集合。最后,通过调用接口实现类来获取值。

首先,我们来看一下classFinder的查找类。

public classclassFinder {static ClassLoader classloader =Thread.currentThread().getContextClassLoader();/*** 获取同一路径下所有子类或接口实现类

*

*@paramintf

*@return*@throwsIOException

*@throwsClassNotFoundException*/

public static List> getAllAssignedClass(Class>cls) {

List> classes = new ArrayList>();for (Class>c : getClasses(cls)) {if (cls.isAssignableFrom(c) && !cls.equals(c)) {

classes.add(c);

}

}returnclasses;

}/*** 取得当前类路径下的所有类

*

*@paramcls

*@return*@throwsIOException

*@throwsClassNotFoundException*/

public static List> getClasses(Class>cls) {

String pk=cls.getPackage().getName();

String path= pk.replace(‘.‘, ‘/‘);

try{

String dirPath= URLDecoder.decode(classloader.getResource(path).getPath(),"utf-8");return getClasses(newFile(dirPath), pk);

}catch(UnsupportedEncodingException e) {//TODO Auto-generated catch block

e.printStackTrace();

}return new ArrayList>();

}/*** 迭代查找

*

*@paramdir

*@parampk

*@return*@throwsClassNotFoundException*/

private static List>getClasses(File dir, String pk) {

List> classes = new ArrayList>();if (!dir.exists()) {returnclasses;

}for(File f : dir.listFiles()) {if(f.isDirectory()) {

classes.addAll(getClasses(f, pk+ "." +f.getName()));

}

String name=f.getName();if (name.endsWith(".class")) {try{

classes.add(Class.forName(pk+ "." + name.substring(0, name.length() - 6)));

}catch(Exception ex){//TODO console warn

}

}

}returnclasses;

}

}

通过上面的查找类,我们可以获取到指定路径下的所有子类和接口实现类。

public classfunctionUtil {private static final Map> functionsMap = new HashMap>();static{//bodyfile 特殊处理,这个bodyfile主要是应对POST有上传文件的情况。

functionsMap.put("bodyfile", null);

List> clazzes = classFinder.getAllAssignedClass(functionInterface.class);

clazzes.forEach((clazz)->{try{//function

functionInterface tempFunc =(functionInterface) clazz.newInstance();

String referenceKey=tempFunc.getReferenceKey();if (referenceKey.length() > 0) { //ignore self

functionsMap.put(referenceKey, tempFunc.getClass());

}

}catch(Exception ex) {

ex.printStackTrace();//TODO

}

});

}public static booleanisFunction(String functionName){returnfunctionsMap.containsKey(functionName);

}public staticString getValue(String functionName,String[] args){try{returnfunctionsMap.get(functionName).newInstance().execute(args);

}catch(Exception e) {//TODO Auto-generated catch block

e.printStackTrace();return "";

}

}

}

在这个functionUtil里面我们实现了将找到的接口实现类存入Map,并根据函数名来调用相应的函数执行,并返回执行后的结果。

原文:https://www.cnblogs.com/generalli2019/p/12221258.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值