我正在用ApacheFlink开发一个项目,并使用junit测试我的操作符。然而,我面临一个问题:由于并行性,flink将以“随机”的行顺序写入其输出csv文件,因此我不能轻易Assert输出文件等于junit的预期输出文件。性能不是问题,因为我们讨论的是小文件(<100行),而且只用于测试。有简单的解决办法吗?
iq0todco1#
测试是否有预期的行数。然后,将期望的行存储在一个列表中。迭代实际行,确保它们“在”预期行列表中,并从列表中删除该条目。类似(groovy伪代码):
assert actualLines.size() == expectedLines.size() actualLines.each { line-> assert line in expectedLines expectedLines.remove(line) }
这应该测试您是否具有预期的行数,以及是否具有预期的行值,而不考虑顺序。
cgvd09ve2#
您可以分两个阶段检查程序:单独测试单个函数,例如mapfunction。这里只检查自己的代码,输出应该是确定性的(假设函数是确定性的)。测试整个程序。在这里,您的代码将由flink执行,结果的顺序是不确定的(除非您对其进行排序)。在flink中,我们有一些实用程序类来测试完整的程序(主要用于运行我们自己的集成测试)。这些类产生一个小型的本地flink示例,运行测试,并将其与预期结果(排序或无序)进行比较。查看multipleprogramstestbase以及它在DegreesCase中的用法。通过包含flink test utils maven依赖项,可以使用multipleprogramstestbase。根据您使用的flink版本,事情看起来可能与当前的master有些不同。如果您有问题,请在此处发表评论或ping flink用户邮件列表。
2条答案
按热度按时间iq0todco1#
测试是否有预期的行数。然后,将期望的行存储在一个列表中。迭代实际行,确保它们“在”预期行列表中,并从列表中删除该条目。类似(groovy伪代码):
这应该测试您是否具有预期的行数,以及是否具有预期的行值,而不考虑顺序。
cgvd09ve2#
您可以分两个阶段检查程序:
单独测试单个函数,例如mapfunction。这里只检查自己的代码,输出应该是确定性的(假设函数是确定性的)。
测试整个程序。在这里,您的代码将由flink执行,结果的顺序是不确定的(除非您对其进行排序)。在flink中,我们有一些实用程序类来测试完整的程序(主要用于运行我们自己的集成测试)。这些类产生一个小型的本地flink示例,运行测试,并将其与预期结果(排序或无序)进行比较。查看multipleprogramstestbase以及它在DegreesCase中的用法。通过包含flink test utils maven依赖项,可以使用multipleprogramstestbase。根据您使用的flink版本,事情看起来可能与当前的master有些不同。如果您有问题,请在此处发表评论或ping flink用户邮件列表。