51Testing软件测试论坛

标题: XLSUnit,面向数据库的单元测试工具 [打印本页]

作者: 海鸥一飞    时间: 2019-2-14 15:53
标题: XLSUnit,面向数据库的单元测试工具
XLSUnit

面向数据库应用的单元测试框架,使用excel,作为输入,以及输出比较,适合大量数据库操作. 如下情况可以使用xlsunit

xlsunit支持Spring 4以上,SpringBoot1.5以上,支持Oracle,MySql,Postgres等数据库


为什么要使用XLSUnit

面向数据应用的单元测试中,最麻烦的地方有俩个


Spring的面向数据库单元测试技术技术会有如下问题


DBUnit 是另外款单元测试工具一定程度上弥补了Spring面向数据库单元测试不足地方,通过XML来模拟和比较数据。但是模拟和比较数据都非常不直观,既然是面向数据库单元测试,为什么不能用xls初始化要测试前的数据,并且还用xls来比较单元测试后的期望数据呢?

XLSUnit正是基于这个想法,他可以用一个工作表容易的模拟数据表数据,在单元测试前,导入到一个空数据库,单元测试完毕,可以将数据库里的数据与另外一个工作表的数据做比较,如果只关心部分数据比较,只需要将这部分数据背景用红色填充,XLSUnit会只比较你关心的数据


安装

然后在项目里引用

  1. <dependency>
  2.                 <groupId>com.ibeetl</groupId>
  3.                 <artifactId>xlsunit</artifactId>
  4.                 <version>${version}</version>
  5.                 <scope>test</scope>
  6.         </dependency>
复制代码

编写工作表excel

可以将测试数据写在excel里,或者通过数据库客户端工具粘贴到excel里完成数据的输入。

可以用拥有任意多个excel文件,每个文件概念上都可以包含一个初始化数据的多种测试场景,Excel文件有三部分组成


如下是一些例子


[attach]121853[/attach]

用来初始化数据和变量

[attach]121854[/attach]

场景1,在某个单元测试完毕,按照主键比较数据库的值,红色部分是需要比较的部分

[attach]121855[/attach]

XLSUnit会根据$id的值查询数据库,并与Excel里期望的数据做比较


场景二,比较一系列数据,比如主订单的所有子订单项

[attach]121856[/attach]

表名后下一个单元格是单表查询条件语句,XLSUnit会查询数据库数据,并与下面的excel数据逐一比较

XLSUnit 对excel里的数据的颜色不做限定,你可以使用任何颜色来分块,区分你的数据,除了列名上的红色,这个颜色用来表示期望比较的的列。这在XLSUnit是必须的。

编写变量

符号"##" +小写变量名 定义了一组变量,这组变量可以在随后模拟数据库数据的时候使用,也可以在Java代码里复用(解决Spring @Sql的问题),单元格的类型决定了数据类型。尤其要注意字符和数字的区别

##user
name
age
bir

xiandafu
1
$fn.date

初始化数据库数据

符号"##"+大写变量名 定义了一个表格数据,其下一行是列名字,列名的后面所有行都是数据。

##SYS_USER
ID
NAME
BIR
GENDER

$id
$user.name
$user.bir
1


分割符号

可以定义多个变量组,还有多个数据库表,用空行分开。


$符号和 # 符号说明

$符号有其特殊含义

##SYS_USERNAME=#user.name# order by id ASC
ID
NAME
BIR
GENDER

$id
xiandafu

$id2
joelli

编写场景测试

场景测试同输入是一样的规则,场景测试也可以再次定义一些场景测试的变量,这样在JUnit测试里,可以使用这些变量来测试。比如上图定义了一个变量test.password变量,JUnit可以取出这个变量,来更新用户密码,并做比较

场景里的每个表关心的数据可以用红色背景表示在列名上,这样XLSUnit仅仅比较红色即可,这有助于单元测试维护中几种注意力修改需要比较的关键数据


include

includeSheet指令可以用来导入其他excel文件初始化数据。参数分别是excel文件,以及工作表名称

##includeSheet /common.xlsx userdata

可以将某些测试需要公共初始化的数据放到一个excel文件里,这样维护方便。


fn系列函数

可以自定义扩展,比如

  1. VariableTable vars = new VariableTable();
  2. vars.getFns().put("myTest",new Function(){....});
复制代码

apiVariableTable 变量表

xls里申明的变量或者操作数据库操作后的序列都放到此表里里,可以通过find方法,或者findSocpe获取变量


XLSParser 用于解析输入。

计算后,与输出比较,包括


例子1
  1. public void testUser1() {
  2.   //执行某个测试场景的初始化工作,初始化user表
  3.   VariableTable vars = new VariableTable();
  4.   userParser.init(vars);

  5.   //开始测试,获取userId和password
  6.   userParser.prepare("场景1", vars);       
  7.   Integer id = (Integer) vars.find("id");
  8.   String newPassword = vars.findString("test.password");
  9.   //调用业务代码,修改用户密码
  10.   userSerivce2.modifyUserInfo(id, newPassword);
  11.   
  12.   //比较数据库里的数据跟场景1的数据是否一致
  13.   userParser.test("场景1", vars);

  14. }
复制代码

如果比较出错,会有如下提示
  1. java.lang.AssertionError: 比较数据 出错,在第2行,位于XLSPoistion [file=测试一.xlsx, sheet=场景2, line =2],错误信息:CompareInfo [colName=PASSWORD, expected=d00$, real=d00$]
  2.         at org.junit.Assert.fail(Assert.java:88)
  3.         .....
复制代码




作者: Miss_love    时间: 2020-12-31 08:58
支持分享




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2