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

How to test spring batch step which reads from database and writes into a file?

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

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

2) 第二步从step 1生成的文件中读取并处理。处理所有文件后,所有内容都写入新文件。

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

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

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

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

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

我测试该场景的想法是:

1) 为了检查查询语法是否正确,我需要一个查询构建器(我用谷歌搜索并找到了像 jOOQ 这样的库,但我不想添加一个外部库来构建字符串查询)。检查查询是否正确后,也许我应该 mock 数据库和 return 预定义的复杂对象并将其写入文件。问题是,如果查询 return 缺少列,对象将不正确,测试应该失败,所以如果我 return 一个预定义的对象,我将永远不知道哪个是查询return。

正如您在这里看到的,问题根植于验证查询,好像查询是正确的,我可以测试 rowMapper 和最终文件。

2) 对于这一步,我认为最好的方法是使用来自 step 1 的正确内容的预定义文件,然后检查最终文件内容是否符合我的预期。我认为测试该步骤很容易。

是否有更好的方式或方法来测试此场景?

谢谢!

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

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