testNG + Selenium自动化测试,动态加载测试类

        新加入一家公司,接手一个Selenium自动化测试的Web项目,使用testNG单元测试,Selenium+testNG进行功能测试,功能测试需要读取excel文件获取WebDriver类型(浏览器不同driver也不同嘛)、案例数据等等,采用maven项目(其实其他项目也无所谓,你自己导进去jar包就行了),以前对这个Selenium也不是很了解,研究了2天了,总算做出来一个雏形了。

       思路是这样的,我在Excel中先定义一个案例需要执行的模块,如下图所示,一行对应一个案例,比如第一行1,3,4,就代表,我这个案例需要执行登录--->员工内购--->退出(注意右下角有个备注,我程序中不读取的)

   testNG + Selenium自动化测试,动态加载测试类_第1张图片

其他的数据我这里 不贴那么详细了

那么java程序读取到这个案例的时候,他怎么知道这个1,3,4代表哪个测试类了?有人说,我在excel案例的每一行后面加一个类名字(或者套件xml)不就行了吗?不行,这是一个案例,不是单元测试,一个案例包含多个单元测试,一个网站那么多的模块,组合也千变万化,你都这样写的话,我需要给你建立多少个类或者xml文件了?

   我的处理方法是这样的,我在项目中建立好各种需要的模块,用一个properties文件给好对应关系,如下:

testNG + Selenium自动化测试,动态加载测试类_第2张图片


testNG + Selenium自动化测试,动态加载测试类_第3张图片

然后我读取这个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 classModuleMap;

    static {
        classModuleMap = new ModuleClassReader().getProperties();
    }

    public Map getProperties() {
        System.err.println("join");
        Properties props = new Properties();
        Map map = new HashMap();
        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,到时候大家一起参看下可能更好。

你可能感兴趣的:(学习)