Java 中用 TestNg 的数据驱动时,数据的管理可能比较麻烦,因为要满足如下几个条件:

  1. 分类归纳
  2. 方便查看及维护
  3. 能够表征数据驱动时每一组数据

以前介绍过将数据放在 xml 文件中,但是 xml 文件还是不方便查看,为了方便查看,还是将数据放在 Java 类中最好了,IDE 可以直接 link 过去。而 jdk1.5 之后,Java 开始支持 enum,enum 也就是枚举,它有一特征就是会将每一个枚举常量转变成对象,有几个枚举常量就转变成几个对象,这一特征非常符合数据驱动的特点,于是我们将 enum 引入进来,把数据都放在 enum 中。<!--more-->

定义一个 pojo

public class TestInfo {

    private String name;

    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "TestInfo [name=" + name + ", age=" + age + "]";
    }

}

将 pojo 与 enum 结合

public class TestEnum {

    public static TestInfo getTestInfo(){
        TestInfo ti = new TestInfo();
        ti.setAge(18);
        ti.setName("zhaosi");
        return ti;
    }

    public static TestInfo getTestInfo1(){
        TestInfo ti = new TestInfo();
        ti.setAge(20);
        ti.setName("zhangsan");
        return ti;
    }

    public enum Demo{

        TEST("http://www.baidu.com", TestEnum.getTestInfo(), "//address", "湖北"),

        TEST1("http://www.baidu.com", TestEnum.getTestInfo1(), "//address", "湖北");

        private String url;

        private TestInfo testInfo;

        private String path;

        private String expectValue;

        private Demo(String url, TestInfo testInfo, String path,
                String expectValue) {
            this.url = url;
            this.testInfo = testInfo;
            this.path = path;
            this.expectValue = expectValue;
        }

        public String getUrl() {
            return url;
        }

        public TestInfo getTestInfo() {
            return testInfo;
        }

        public String getPath() {
            return path;
        }

        public String getExpectValue() {
            return expectValue;
        }
    }

}

TestNg 的数据驱动

public class TestBase {

    @DataProvider
    public Object[][] dataProvider(){
        Class<?>[] cs = TestEnum.class.getDeclaredClasses();
        Object[] ecs = null;
        for (int i = 0; i < cs.length; i++) {
            if(cs[i].isEnum()){
                ecs=cs[i].getEnumConstants();
            }
        }
        int count = 0;
        if(ecs!=null){
            count = ecs.length;
        }
        Object[][] obj = new Object[count][];
        for (int i = 0; i < count; i++) {
            obj[i] = new Object[]{ecs[i]};
        }
        return obj;
    }

    @Test(dataProvider="dataProvider")
    public void testDemo(Demo d){
        System.out.println(d.getTestInfo());
    }  
}

运行结果

TestInfo [name=zhaosi, age=18]
TestInfo [name=zhangsan, age=20]
PASSED: testDemo(TEST)
PASSED: testDemo(TEST1)

说明

  1. 每一个枚举常量都支持任意的数据类型,可以很方便的进行扩展及集中式管理。
  2. 以上只是提供了一种思路,如果要应用,细节方面还得再加强。


↙↙↙阅读原文可查看相关链接,并与作者交流