新加入一家公司,接手一个Selenium自动化测试的Web项目,使用testNG单元测试,Selenium+testNG进行功能测试,功能测试需要读取excel文件获取WebDriver类型(浏览器不同driver也不同嘛)、案例数据等等,采用maven项目(其实其他项目也无所谓,你自己导进去jar包就行了),以前对这个Selenium也不是很了解,研究了2天了,总算做出来一个雏形了。
思路是这样的,我在Excel中先定义一个案例需要执行的模块,如下图所示,一行对应一个案例,比如第一行1,3,4,就代表,我这个案例需要执行登录--->员工内购--->退出(注意右下角有个备注,我程序中不读取的)
那么java程序读取到这个案例的时候,他怎么知道这个1,3,4代表哪个测试类了?有人说,我在excel案例的每一行后面加一个类名字(或者套件xml)不就行了吗?不行,这是一个案例,不是单元测试,一个案例包含多个单元测试,一个网站那么多的模块,组合也千变万化,你都这样写的话,我需要给你建立多少个类或者xml文件了?
我的处理方法是这样的,我在项目中建立好各种需要的模块,用一个properties文件给好对应关系,如下:
然后我读取这个properties文件,生成一个map,在java程序中动态加载测试人员案例的每个模块,代码如下:
for(int i=1;i<5;i++)
{
TestNG testNG = new TestNG();
try {
testNG.setTestClasses(new Class[] {A(ModuleClassReader.classModuleMap.get(i.toString))});
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
testNG.run();
}
A是一个根据名称获取类的方法,如下:
public Class A(String str) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
return Class.forName(str);
}
ModuleClassReader是一个读取properties文件生成map的类,代码我也给了算了:
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
//读取properties内容并转换成map形式
public class ModuleClassReader {
public static Map<String, String> classModuleMap;
static {
classModuleMap = new ModuleClassReader().getProperties();
}
public Map<String, String> getProperties() {
System.err.println("join");
Properties props = new Properties();
Map<String, String> map = new HashMap<String, String>();
try {
InputStream in = getClass().getResourceAsStream("/com/test/wangying/config/module_class.properties");
props.load(in);
System.err.println("属性1:" + props.getProperty("1"));
Enumeration en = props.propertyNames();
while (en.hasMoreElements()) {
String key = (String) en.nextElement();
String property = props.getProperty(key);
map.put(key, property);
System.out.println(key + "." + property);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return map;
}
}
这样就可以动态加载各种需要的模块了,因为最近很忙,我这是中午赶出来的,写的可能不是那么清楚,如果你有疑问可以给我留言,或者你有更好的方法可以告诉我,我很乐意的,多谢。
另外,我的项目完毕后我会给一个精简版源代码的传到CSDN,到时候大家一起参看下可能更好。