我正在使用Apache Flink开发一个项目,并且我正在使用junit来测试我的操作员。测试csv文件与随机行顺序相等(Junit)
但是我遇到了一个问题:由于并行性,flink会用“随机”行顺序写入其输出csv文件,因此我不能轻易断言输出文件等于预期的输出文件与Junit 。
性能不是问题,因为我们正在讨论小文件(< 100行)并且仅用于测试。
有没有简单的解决方案?
我正在使用Apache Flink开发一个项目,并且我正在使用junit来测试我的操作员。测试csv文件与随机行顺序相等(Junit)
但是我遇到了一个问题:由于并行性,flink会用“随机”行顺序写入其输出csv文件,因此我不能轻易断言输出文件等于预期的输出文件与Junit 。
性能不是问题,因为我们正在讨论小文件(< 100行)并且仅用于测试。
有没有简单的解决方案?
你可以分两个阶段检查程序:
隔离测试您的个性化功能,例如,一个MapFunction。在这里你只检查你自己的代码,输出应该是确定性的(因为你的函数是确定性的)。
测试完整的程序。这里你的代码将由Flink执行,并且结果的顺序不是确定性的(除非你对它进行排序)。在Flink中,我们有一些实用程序类来测试完整的程序(主要用于运行我们自己的集成测试)。这些类调出一个小的本地Flink实例,运行测试,并将其与预期结果(有序或无序)进行比较。请查看MultipleProgramsTestBase以及如何在DegreesITCase中使用它。您可以通过包含flink-test-utils Maven依赖项来使用MultipleProgramsTestBase。取决于您使用的Flink版本,事情可能与当前主版本有所不同。如果您有任何疑问,请在此处留言或ping Flink用户邮件列表。
谢谢,来自'TestBaseUtils'的'compareResultsByLinesInMemory'方法正是我所期待的! – Ben
测试您是否有预期的行数。然后,将预期的行存储在列表中。迭代实际行并确保它们位于预期的行列表中并从列表中删除该条目。喜欢的东西(常规伪代码):
assert actualLines.size() == expectedLines.size()
actualLines.each { line->
assert line in expectedLines
expectedLines.remove(line)
}
这应该测试你是否有线条的预期数量以及是否有预期的线值,而不考虑顺序。
这很容易,我什至没有想到它......谢谢! – Ben
对期望行和实际csv进行排序,然后测试是否相等。 –
@JBNizet本来可以是 – Ben