由于数据提供程序配置不正确而跳过测试

时间:2016-09-25 08:13:24

标签: java unit-testing testng

我第一次使用testNG并且有一个问题。我试图从json文件加载一些数据,并将数据与dataProviders结合使用来编写一些测试。我有一个辅助文件,它有一个parseData方法,它从json文件中获取数据,并构建我需要测试的所有数据的映射。在我的主测试文件中,我按如下方式定义了一个测试:

在我的主测试文件中,我还有一个BeforeClass方法,它加载调用tDataHelper类中的parseData方法。

每次运行测试时,都会跳过它,因为每当我尝试调试createStudents数据提供程序时,tDataHelper文件都有空映射。我认为这与静态vs实例有关,我不确定究竟是什么问题。以下代码是否正常,它应该工作?任何人都可以对此有所了解吗?

    public class testStudents
    {
        private static tDataHelper helper = new tDataHelper();

        @BeforeClass
        public void setup() throws Exception
        {
            tDataHelper.parseData();
        }

        @FunctionalTest
        @Test(dataProvider = "createStudents", dataProviderClass = tDataHelper.class)
        public void testCreateStudents(List<Student> studentsToCreate){}
    }


    public class tDataHelper
    {
        private static List<Student> studentsToCreate = new HashSet<>();

        static void parseData() throws Exception
        {
            // read in json file and add students to the students list
            // studentsToCreate.add(node.parse(....))
        }

        @DataProvider
        public static Object[][] createStudents()
        {
            return new Object[][]{
                {
                    studentsToCreate
                }
        }
}

2 个答案:

答案 0 :(得分:0)

您的数据提供程序类可能存在配置问题。

你想迭代所有学生的循环吗?对!那么你的测试方法应该如下所示。

@Test(dataProvider = "createStudents", dataProviderClass = tDataHelper.class)
public void testCreateStudents(Student studentsToCreate){}

我用String类替换了Student类更新了示例,下面是工作示例。 请用下面的代码进行交叉检查。

public class tDataHelper {
    private static List<String> studentsToCreate = new ArrayList<String>();

    static void parseData() throws Exception {
        studentsToCreate.add("user1");
        studentsToCreate.add("user2");
        studentsToCreate.add("user3");
    }

    @DataProvider
    public static Object[][] createStudents() {
        Object[][] objArray = new Object[studentsToCreate.size()][];
        for (int i = 0; i < studentsToCreate.size(); i++) {
            objArray[i] = new Object[1];
            objArray[i][0] = studentsToCreate.get(i);
        }
        return objArray;
    }
}

public class testStudents {
    private static tDataHelper helper = new tDataHelper();

    @BeforeClass
    public void setup() throws Exception {
        tDataHelper.parseData();
    }
    @Test(dataProvider = "createStudents", dataProviderClass = tDataHelper.class)
    public void testCreateStudents(String studentsToCreate) {
        System.out.println(studentsToCreate);
    }
}

我正在使用qaf作为Json Data Provider,因此您不需要手动解析json数据并摆脱数据提供程序类。

答案 1 :(得分:0)

数据提供程序应该是独立的,不能从外部初始化。检查the documentation

你有选择:

  1. 使用数据提供程序的设计方式:

    public class testStudents {
    
        @FunctionalTest
        @Test(dataProvider = "createStudents", dataProviderClass = tDataHelper.class)
        public void testCreateStudents(List<Student> studentsToCreate){}
    }
    
    
    public class tDataHelper {
    
        private static List<Student> parseData() throws Exception {
            // read in json file and add students to the students list
            // studentsToCreate.add(node.parse(....))
        }
    
        @DataProvider
        public static Object[][] createStudents() {
            return new Object[][]{
                {
                    parseData();
                }
            };
        }
    }
    
  2. 使用您的类a utils并在测试中使用它:

    public class testStudents {
    
        private static List<Student> studentsToCreate;
    
        @BeforeClass
        public void setup() throws Exception {
            studentsToCreate = tDataHelper.parseData();
        }
    
        @FunctionalTest
        @Test
        public void testCreateStudents() {}
    }
    
    
    public class tDataHelper {
    
        public static List<Student> parseData() throws Exception {
            // read in json file and add students to the students list
            // studentsToCreate.add(node.parse(....))
        }    
    }