2、Andor测试框架为什么要采用参数化测试?
项目的重要特点:数据的分布与上层数据查询分离,无论数据的分布如何变化,上层都应该能够查出正确的结果。
项目测试的特点:
数据分布的多样性:数据分布在一个group一个atom,一个group多个atom,多个group多个atom。
数据分布规则的多样性:多机情况下,可以使用多种分库分表规则。
采用数据库的多样性:存在bdb数据库,mysql数据。
共同特性:不管数据分布如何,同一条sql语句得到的结果是一样的。
3、遇到的问题?
参数化测试只能做到测试代码结构都是相同的,不同的仅仅是测试数据和期望值。
怎样通过测试数据的不一样达到能够测试各种数据的分布场景,是该测试框架需要解决的关键问题。不管数据分布如何,同一条sql语句得到的结果是一样的,但是不同的数据表结构得到数据最终的结果也不一样,怎样根据数据表设计期望值也是需要解决的关键问题。
4、解决方法
根据不同的数据分布特点定义不同的表,如简单以bdb数据库数据分布的多样性为例:
一个group一个atom表:normaltbl_oneGroup_oneAtom
一个group多个atom表: normaltbl_oneGroup_mutilAtom
多个group多个atom表:normaltbl_mutilGroup
分别定义这三张表,这三张表分表对应相应的数据分布规则。因此通过调用对应的表即可以访问对应的数据分布类型。
将这三张表的表结构设计为完全一样。因此同一条sql语句,在这三张表中操作的结果是一样的。
通过以上的方法,就可以通过如下类型的参数化测试实现一个用例,测试到多种数据分布场景。
@Parameters public static Collection prepareData() { Object[][]object={{"normaltbl_oneGroup_oneAtom"},{ "normaltbl_oneGroup_mutilAtom" }, { "normaltbl_mutilGroup" }} return Arrays.asList(object); } public DeleteTest(String tableName) { this.normaltblTableName = tableName; } @Test public void deleteAll() throws Exception { String sql = "DELETE FROM " + normaltblTableName; rc = execute(null, sql, Collections.EMPTY_LIST); Assert.assertNull(rc.getException()); Assert.assertEquals(MAX_DATA_SIZE,rc.getIngoreTableName(rc.next(), ResultCursor.AFFECT_ROW)); } |
如需添加新的数据分布测试场景,只需添加如下步骤即可完成:
1)添加对应的表名
2)表所对应的规则,
3)准备数据的参数中加入表名。
5、小结
使用新的测试框架,非常有利于将已经想过的场景在新的数据分布架构上进行复制性测试,能够极大的减少人工成本。目前用例数为333个,而实际的用例运行数为3046个,也就是每个用例平均重复被用于10个不同的场景测试。