gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:03:38 26 4
gpt4 key购买 nike

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

  • 由两个步骤组成的作业:

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

  • 那个itemReader有一个rowMapper它从结果集中创建一个复杂的对象。它的itemWriter只是做了一个toString (which in fact is a JSON representation)那个复杂的物体。

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

  • itemReaderstep 1 读取文件使用jsonLineMapper ,然后处理从mapper生成的新的复杂对象并将它们写入一个新文件。

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

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

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

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

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

我测试该场景的想法是:

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

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

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

有更好的方法或方法来测试这个场景吗?

谢谢!

最佳答案

对于步骤 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 将不再有效(因此这是您需要注意的维护成本)。

关于java - 如何测试从数据库读取并写入文件的 Spring Batch 步骤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51983448/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com