我想知道在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
只需检查最终文件内容是否符合我的预期。我认为检验这一步很容易。
有没有更好的方法来测试这个场景?
谢谢!
1条答案
按热度按时间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(因此这是您需要注意的维护成本)。