2015-04-08 72 views
4

我正在使用Apache Flink开发一个项目,并且我正在使用junit来测试我的操作员。测试csv文件与随机行顺序相等(Junit)

但是我遇到了一个问题:由于并行性,flink会用“随机”行顺序写入其输出csv文件,因此我不能轻易断言输出文件等于预期的输出文件与Junit 。

性能不是问题,因为我们正在讨论小文件(< 100行)并且仅用于测试。

有没有简单的解决方案?

+1

对期望行和实际csv进行排序,然后测试是否相等。 –

+0

@JBNizet本来可以是 – Ben

回答

4

你可以分两个阶段检查程序:

  1. 隔离测试您的个性化功能,例如,一个MapFunction。在这里你只检查你自己的代码,输出应该是确定性的(因为你的函数是确定性的)。

  2. 测试完整的程序。这里你的代码将由Flink执行,并且结果的顺序不是确定性的(除非你对它进行排序)。在Flink中,我们有一些实用程序类来测试完整的程序(主要用于运行我们自己的集成测试)。这些类调出一个小的本地Flink实例,运行测试,并将其与预期结果(有序或无序)进行比较。请查看MultipleProgramsTestBase以及如何在DegreesITCase中使用它。您可以通过包含flink-test-utils Maven依赖项来使用MultipleProgramsTestBase。取决于您使用的Flink版本,事情可能与当前主版本有所不同。如果您有任何疑问,请在此处留言或ping Flink用户邮件列表。

+1

谢谢,来自'TestBaseUtils'的'compareResultsByLinesInMemory'方法正是我所期待的! – Ben

4

测试您是否有预期的行数。然后,将预期的行存储在列表中。迭代实际行并确保它们位于预期的行列表中并从列表中删除该条目。喜欢的东西(常规伪代码):

assert actualLines.size() == expectedLines.size() 

actualLines.each { line-> 
    assert line in expectedLines 
    expectedLines.remove(line) 
}  

这应该测试你是否有线条的预期数量以及是否有预期的线值,而不考虑顺序。

+0

这很容易,我什至没有想到它......谢谢! – Ben