Junit5支持Excel数据驱动

作者: 城下秋草 | 来源:发表于2018-10-14 22:54 被阅读3次

    在我之前的博文Junit5中实现参数化测试中,我们提到过,Junit5能够使用CsvFileSource参数源来实现外部数据的引入并作为参数传递给测试方法。
    但实际应用中我们经常使用excel文件来保存测试数据或进行数据驱动。

    今天就介绍下如何通过junit5的参数化方法,来支持Excel文件的参数化

    MethodSource

    Junit5当中新增的ParameterizedTest注解,可以在对应的测试方法中携带参数,并且支持多种参数源,参见前文Junit5中实现参数化测试

    而其中的MethodResource方法可以自己定义一个参数实现方法

    这里MethodSource所使用的参数方法有几个要求:

    • 返回Stream<Arguments>参数流或集合类型的的参数集
    • 静态引用
    • 本身不携带参数

    这就给我们自行扩展通过Excel数据驱动提供了入口。

    如我们定义一个测试用例,使用参数化方法,通过MethodSource使用ExcelMethod参数方法传入参数。代码如:

    @ParameterizedTest
    @MethodSource("ExcelMethod")
    public void qiucaoTest(String person, int age, float salary){
      System.out.println(person + " " + age +" "+ salary);
    }
    

    但是因为MethodSource方法的调用限制,本身不能携带参数,所以如果我们希望指定使用的Excel文件路径,以及具体的数据表Sheet。还必须进行一层扩展。ExcelMethod方法定义如下:

     static Stream<Arguments> ExcelMethod() {
        return getTestDataStreamFromExcelFile(".\\src\\test\\demoData.xlsx","Sheet1");
    }
    

    POI库处理excel文件

    ExcelMethod中我们定义了一个处理Excel文件的通用方法。这里可以使用通用的第三方Office文件处理库POI
    使用POI可以通过maven导入。这里主要有poi和ooxml两个依赖库需要使用

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.0</version>
        </dependency>
    
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.0.0</version>
        </dependency>
    

    引入POI后就可以利用POI提供的便利的excel数据处理功能,完成数据的读取

     public static Stream<Arguments> getTestDataStreamFromExcelFile(String excelFullPath,
          String sheetName){
          
        Stream<Arguments> returnStream = Stream.empty();
        //定义单元格数据格式处理对象
        DataFormatter myDataFormatter = new DataFormatter();
    
        //获取工作簿对象
        try(Workbook excelFile = WorkbookFactory.create(new File(excelFullPath),null,true)) {
          //获取工作表
          Sheet excelSheet1 = excelFile.getSheet(sheetName);
          //行数据处理,忽略标题行,行数据作为后续参数List
          for(Row row: excelSheet1){
            if(row.getRowNum()==0) {continue;}
            ArrayList<Object> rowArrayList = new ArrayList<>();
            //获取单元格数值,存入行List
            for (Cell cell : row) {
              rowArrayList.add(myDataFormatter.formatCellValue(cell));
            }
            //转换为MethodSource的Arguments对象
            Arguments arguments = Arguments.of(rowArrayList.toArray());
            //Arguments转换为Stream
            returnStream = Stream.concat(returnStream,Stream.of(arguments));
          }
        return returnStream;
        } catch (IOException e) {
          e.printStackTrace();
        }
        return returnStream;
      }
    
    

    如此,我们就完成了通过Excel在Junit5中进行数据驱动测试的支持。

    思考:我们的测试方法,现在需要匹配Excel数据,进行参数的个数和类型的匹配指定,有没有更好的方法可以更加灵活地兼容Excel数据内容呢?
    欢迎关注后续更新


    欢迎保留作者信息和出处进行转载,欢迎关注微信公众号:秋草说测试。 原创测试干货资源池


    相关文章

      网友评论

        本文标题:Junit5支持Excel数据驱动

        本文链接:https://www.haomeiwen.com/subject/rsxbaftx.html