Java 如何自动化从大型数据库查询的测试?(导入或创建)
假设我有以下场景(显然我过于简化了):“部门”中的“经理”批准“员工”的“费用” 我在这里的测试是测试一个查询,该查询返回以下内容:在D1和D2之间,来自部门“HR”的所有经理的所有费用均高于X美元,等等 我意识到有两种方法可以做到这一点:Java 如何自动化从大型数据库查询的测试?(导入或创建),java,unit-testing,testing,junit,automated-tests,Java,Unit Testing,Testing,Junit,Automated Tests,假设我有以下场景(显然我过于简化了):“部门”中的“经理”批准“员工”的“费用” 我在这里的测试是测试一个查询,该查询返回以下内容:在D1和D2之间,来自部门“HR”的所有经理的所有费用均高于X美元,等等 我意识到有两种方法可以做到这一点: 从头开始—创建用户/组用户、添加权限、创建安全级别、添加费用并测试查询 导入一个已经有一些数据的数据库,并测试返回的结果是否与您期望的结果相同 选项1的问题是“创建环境”需要很长时间才能进行测试 选项2的问题是,“导入”1GB(或更多)数据库需要很长时间,然
谢谢 第三种选择可能是在较小的数据库上测试它,显然,除非您正在进行一些性能测试。如果您这样做,您还可以尝试使用一个小的内存数据库来降低测试查询的性能成本 对于不具有破坏性的大型查询(实际上只读取数据库中的信息),则无需每次都重新创建数据库-您的测试可能会“假设”数据库存在于一个众所周知的位置,而该位置很少创建 此外,与往常一样,请毫不犹豫地针对“模拟”db测试尽可能多的系统,特别是如果您真的想测试:
- 如何设置查询参数
- 查询最终是什么样子的
- 或者查询结果的处理方式
- 等等。。。而不是数据库引擎实际运行查询的方式李>
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');