如何测试从数据库读取数据并写入文件的spring批处理步骤?

aor9mmx1  于 2021-06-26  发布在  Impala
关注(0)|答案(1)|浏览(412)

我想知道在spring批处理作业中测试以下场景的最佳方法是什么:
由两个步骤组成的工作:
1) 第一步使用 ItemReader ( from apache kudu using impala )并将查询生成的内容写入文件。
那个 itemReader 有一个 rowMapper 从结果集创建一个复杂对象。它 itemWriter 只是做了一个 toString (which in fact is a JSON representation) 那个复杂的物体。
2) 第二步从 step 1 并处理它。处理完所有文件后,所有内容都会写入一个新文件。
这个 itemReader 从中读取文件 step 1 使用 jsonLineMapper ,然后处理从mapper生成的新复杂对象并将其写入新文件。
然后作业的侦听器将这两个文件上传到s3中。
我需要这个工作流,因为第一步生成了第二步所需的示例。如果有一天我只需要测试第二步,我可以使用第一步中的一个旧样本,因为数据库会随着时间而变化,如果没有它,我可能无法生成两天前执行的相同样本。
第一步是最难测试的一步,但我想以如下方式测试这两个步骤:
1) 从 step 1 我需要检查查询语法是否正确。另外,检查它是否从数据库resultset通过 rowMapper . 文件的内容 itemWriter 是正确的 (correct means that is expected) .
2) 第二步更容易测试,因为我可以从一个预定义的文件开始。它应该使用 jsonLineMapper 是正确的。处理部分是分开测试的,但是我可以遵循一个简单的工作流,并且最终的文件具有预期的内容。
我测试这个场景的想法是:
1) 为了检查查询语法是否正确,我需要一个查询生成器(我在google上找到了类似的库) jOOQ 但我不想仅仅为了构建字符串查询而添加外部库)。在检查了查询是否正确之后,也许我应该 mock 返回一个预定义的复杂对象并将其写入文件。问题是,如果查询返回的是缺少的列,那么对象将不正确,测试将失败,因此如果返回预定义的对象,我将永远不知道哪个是查询返回。
正如您在这里所看到的,问题是为了验证查询,如果查询是正确的,我可以测试 rowMapper 最后的文件。
2) 对于这一步,我认为最好的方法是拥有一个预定义的文件,其中包含来自 step 1 只需检查最终文件内容是否符合我的预期。我认为检验这一步很容易。
有没有更好的方法来测试这个场景?
谢谢!

r1zk6ea1

r1zk6ea11#

对于步骤1,我建议使用嵌入式数据库插入一些行,运行作业,然后Assert生成的文件是正确的。这允许您控制测试数据,以便验证查询和文件中的预期结果。你可以在这里找到一个例子:https://docs.spring.io/spring-batch/4.0.x/reference/html/testing.html#endtoendtesting. Spring批提供 AssertFile.assertFileEquals 测试两个文件是否相等。这可以帮助您根据预期的文件验证步骤1的输出。
对于步骤2,您可以创建一些有效/无效的文件(这些文件可能是步骤1的结果),并将它们用作测试步骤2的输入。但需要注意的是,如果步骤1的结果发生了变化,那么这些文件将不再有效,无法测试步骤2(因此这是您需要注意的维护成本)。

相关问题