如何测试从数据库读取并写入文件的Spring Batch步骤?

时间:2018-08-23 10:14:30

标签: java spring spring-batch impala apache-kudu

我想知道在Spring Batch作业中测试以下场景的最佳方法是什么:

  • 包含两个步骤的工作:

1)第一步,使用ItemReaderfrom apache kudu using impala)从数据库读取并将查询生成的内容写入文件。

  • itemReader具有一个rowMapper,该itemWriter从结果集中创建一个复杂的对象。它的toString (which in fact is a JSON representation)只是构成了这个复杂对象的step 1

2)第二步,从itemReader生成的文件中读取并处理该文件。处理完所有文件后,所有内容都会写入一个新文件。

  • step 1使用jsonLineMapperstep 1读取文件,然后处理从映射器生成的新的复杂对象,并将它们写入新文件。

然后,作业的侦听器将两个文件都上传到S3中。

我需要此工作流程,因为第一步会生成第二步所需的样本。而且,如果有一天我只需要测试第二步,那么我可以使用第一步中的旧样本,因为数据库会随着时间的变化而变化,没有它,我可能无法生成前两天执行的相同样本。

第一步是最难测试的步骤,但我想以如下方式测试两个步骤:

1)从rowMapper,我需要检查查询语法是否正确。另外,请检查是否从数据库结果集中通过itemWriter生成正确的对象。 (correct means that is expected)的文件内容正确jsonLineMapper

2)第二步更容易测试,因为我可以从预定义的文件开始。它应该测试使用jOOQ从文件中读取是否正确。处理部分经过单独测试,但我可以遵循一个简单的工作流程,并且最终文件具有预期的内容。

我测试该方案的想法是:

1)为了检查查询语法是否正确,我需要一个查询生成器(我用Google搜索,发现像mock这样的库,但是我不想添加仅用于构建字符串的外部库查询)。检查查询正确之后,也许我应该rowMapper数据库并返回预定义的复杂对象并将其写入文件中。问题在于,如果查询返回缺少的列,则该对象将不正确,并且测试将失败,因此,如果我返回预定义的对象,我将永远不知道哪个是查询返回。

正如您在此处看到的那样,该问题在验证查询时得到解决,就像查询正确一样,我可以测试step 1和最终文件。

2)对于这一步,我认为最好的方法是从gdb -tui获取具有正确内容的预定义文件,然后仅检查最终文件内容是否符合我的期望。我认为测试该步骤很容易。

有没有更好的方法或方法来测试这种情况?

谢谢!

1 个答案:

答案 0 :(得分:2)

对于步骤1,我建议使用嵌入式数据库插入一些行,运行作业,然后断言所生成的文件是正确的。这使您可以控制测试数据,以验证查询和文件中的预期结果。您可以在此处找到示例:https://docs.spring.io/spring-batch/4.0.x/reference/html/testing.html#endToEndTesting。 Spring Batch提供了AssertFile.assertFileEquals来测试两个文件是否相等。这可以帮助您根据预期文件验证步骤1的输出。

对于第2步,您可以创建一些有效/无效文件(这些文件可能是第1步的结果),并将它们用作测试第2步的输入。但要注意的是,如果第1步的结果发生变化,则这些文件对步骤2进行测试将不再有效(因此,这是您需要注意的维护成本)。