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

Java 如何自动化从大型数据库查询的测试?(导入或创建),java,unit-testing,testing,junit,automated-tests,Java,Unit Testing,Testing,Junit,Automated Tests,假设我有以下场景(显然我过于简化了):“部门”中的“经理”批准“员工”的“费用” 我在这里的测试是测试一个查询,该查询返回以下内容:在D1和D2之间,来自部门“HR”的所有经理的所有费用均高于X美元,等等 我意识到有两种方法可以做到这一点: 从头开始—创建用户/组用户、添加权限、创建安全级别、添加费用并测试查询 导入一个已经有一些数据的数据库,并测试返回的结果是否与您期望的结果相同 选项1的问题是“创建环境”需要很长时间才能进行测试 选项2的问题是,“导入”1GB(或更多)数据库需要很长时间,然

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

我在这里的测试是测试一个查询,该查询返回以下内容:在D1和D2之间,来自部门“HR”的所有经理的所有费用均高于X美元,等等

我意识到有两种方法可以做到这一点:

  • 从头开始—创建用户/组用户、添加权限、创建安全级别、添加费用并测试查询

  • 导入一个已经有一些数据的数据库,并测试返回的结果是否与您期望的结果相同

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

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

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


    谢谢

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

    对于不具有破坏性的大型查询(实际上只读取数据库中的信息),则无需每次都重新创建数据库-您的测试可能会“假设”数据库存在于一个众所周知的位置,而该位置很少创建

    此外,与往常一样,请毫不犹豫地针对“模拟”db测试尽可能多的系统,特别是如果您真的想测试:

    • 如何设置查询参数
    • 查询最终是什么样子的
    • 或者查询结果的处理方式
    • 等等。。。而不是数据库引擎实际运行查询的方式
    我建议您看看——这是一个旨在促进数据库测试的库。我通常采用的方法是在一个main方法中编写一些代码,该方法将在.csv文件中生成我需要的测试数据(每个表一个),然后使用这些数据创建内存中的表

    这通常看起来像:

    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');