如何自动化从大型数据库查询的测试? (导入或创建)

时间:2012-02-12 16:30:49

标签: java unit-testing testing junit automated-tests

假设我有以下情况(显然我过于简单化了):“部门”中的“经理”“批准”“员工”的“费用”。

我在这里的测试是测试一个返回以下内容的查询:D1和D2之间来自部门'HR'的所有经理的所有费用都高于$ X ......

我意识到有2个方法可以做到这一点:

  1. 从头开始 - 创建用户/组用户,添加权限,创建安全级别,添加费用和测试查询。

  2. 导入已有一些数据的数据库并测试返回结果是否与您期望得到的一样?

  3. 选项1的问题是“创建环境”需要很长时间才能进行测试。

    选项2的问题是“导入”1GB(或更多)数据库需要很长时间,然后只需运行查询并查看预期结果是否正确。

    我想知道是否有第三种方法?或对上述现有替代方案的任何改进。

    谢谢!

2 个答案:

答案 0 :(得分:3)

我建议你看一下DbUnit - 它是一个旨在促进数据库测试的库。我通常采用的方法是在main方法中编写一些代码,这些代码将生成.csv文件中需要的测试数据(每个表一个),然后使用H2创建填充此数据的内存表。

这通常看起来像:

public static void main(final String args) {
  final DatabaseConnection conn = new DatabaseConnection(getConnectionToDbWithRealData());
  final QueryDataSet dataset = new QueryDataSet(conn);
  dataset.addTable("foo", "select * from foo where bar = 'xyz'");
  new CsvDataSetWriter(getOutputFile()).write(dataset);
}

CREATE TABLE foo (
  ...
) AS SELECT * FROM CSVREAD('classpath:/foo.csv', null, 'null=null');

创建数据集需要一个小时左右,但您可以在几秒钟内按需重新生成数据集。

答案 1 :(得分:1)

第三种选择可能是在较小的数据库上进行测试,显然,除非你正在进行一些性能测试。如果你这样做,你也可以尝试使用一个小的内存数据库来降低测试查询的性能成本。

对于非破坏性的大型查询(实际上只在数据库中读取信息),您不必每次都重新创建数据库 - 您的测试可能会“假设”数据库存在于一个众所周知的地方,只是偶尔创造的。

此外,与往常一样,不要犹豫,尽可能针对“模拟”数据库测试你的系统,特别是如果你真的想测试:

  • 如何设置查询参数
  • 最终查询的内容
  • 或如何处理查询结果,
  • etc ...而不是您的数据库引擎实际运行查询的方式。