同步操作将从 闲.大赋(李家智)/xlsunit 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
面向数据库应用的单元测试框架,使用excel,作为输入,以及输出比较,适合大量数据库操作. 如下情况可以使用xlsunit
xlsunit支持Spring 4以上,SpringBoot1.5以上,支持Oracle,MySql,Postgres等数据库
面向数据应用的单元测试中,最麻烦的地方有俩个
Spring的面向数据库单元测试技术技术会有如下问题
DBUnit 是另外款单元测试工具一定程度上弥补了Spring面向数据库单元测试不足地方,通过XML来模拟和比较数据。但是模拟和比较数据都非常不直观,既然是面向数据库单元测试,为什么不能用xls初始化要测试前的数据,并且还用xls来比较单元测试后的期望数据呢?
XLSUnit正是基于这个想法,他可以用一个工作表容易的模拟数据表数据,在单元测试前,导入到一个空数据库,单元测试完毕,可以将数据库里的数据与另外一个工作表的数据做比较,如果只关心部分数据比较,只需要将这部分数据背景用红色填充,XLSUnit会只比较你关心的数据
然后在项目里引用
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>xlsunit</artifactId>
<version>${version}</version>
<scope>test</scope>
</dependency>
可以将测试数据写在excel里,或者通过数据库客户端工具粘贴到excel里完成数据的输入。
可以用拥有任意多个excel文件,每个文件概念上都可以包含一个初始化数据的多种测试场景,Excel文件有三部分组成
如下是一些例子
XLSUnit会根据$id的值查询数据库,并与Excel里期望的数据做比较
表名后下一个单元格是单表查询条件语句,XLSUnit会查询数据库数据,并与下面的excel数据逐一比较
XLSUnit 对excel里的数据的颜色不做限定,你可以使用任何颜色来分块,区分你的数据,除了列名上的红色,这个颜色用来表示仅仅比较期望的的列。这在XLSUnit是必须的。
目录表示excel的第一个工作区,可以是任意内容。比如可以介绍一下这个excel所代表的单元测试内容,单元测试代码类(好通过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 | |
可以定义多个变量组,还有多个数据库表,用空行分开。
$符号有其特殊含义
用在列名上,表示是一个主键(尽管可以通过数据库MetaData自动判断,但为了好阅读,显示的标注一下还是很好的
用在单元格力,表示这是一个表达式,如 $fn.date, 表示一个当前时间,复杂的表达式要用${}.符合beetl表达式习惯
通常在数据库表里,$id 这样的变量如果不存在,表达的意思是需要回填。比如数据库自增主键,或者通过触发器,其他方式初始化的数据库数据。
${ } 对应于一个表达式,同Beetl,如${user.gender==1?"男" :"女"}
sql语句类似Beetlsql,可以使用变量,比如在批量比较里,使用##符号来引用变量
##SYS_USER | NAME=#user.name# order by id ASC | |||
---|---|---|---|---|
ID | NAME | BIR | GENDER | |
$id | xiandafu | |||
$id2 | joelli |
场景测试同输入是一样的规则,场景测试也可以再次定义一些场景测试的变量,这样在JUnit测试里,可以使用这些变量来测试。比如上图定义了一个变量test.password变量,JUnit可以取出这个变量,来更新用户密码,并做比较
场景里的每个表关心的数据可以用红色背景表示在列名上,这样XLSUnit仅仅比较红色即可,这有助于单元测试维护中几种注意力修改需要比较的关键数据
includeSheet指令可以用来导入其他excel文件初始化数据。参数分别是excel文件,以及工作表名称
##includeSheet /common.xlsx userdata | ||||
---|---|---|---|---|
可以将某些测试需要公共初始化的数据放到一个excel文件里,这样维护方便。
可以自定义扩展,比如
VariableTable vars = new VariableTable();
vars.getFns().put("myTest",new Function(){....});
xls里申明的变量或者操作数据库操作后的序列都放到此表里里,可以通过find方法,或者findSocpe获取变量
计算后,与输出比较,包括
@Test
public void testUser1() {
//执行某个测试场景的初始化工作,初始化user表
VariableTable vars = new VariableTable();
userParser.init(vars);
//开始测试,获取userId和password
userParser.prepare("场景1", vars);
Integer id = (Integer) vars.find("id");
String newPassword = vars.findString("test.password");
//调用业务代码,修改用户密码
userSerivce2.modifyUserInfo(id, newPassword);
//比较数据库里的数据跟场景1的数据是否一致
userParser.test("场景1", vars);
}
东方金科 李家智(闲大赋)
更多例子可以参考beetlsql的单元测试,使用了xlsunit保证代码质量
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。