使用随机行顺序测试csv文件是否相等(Junit)

时间:2015-04-08 12:29:04

标签: java csv testing junit apache-flink

我正在使用Apache Flink开发一个项目,并且我正在使用junit来测试我的运营商。

但是我遇到了一个问题:由于并行性,flink会将其输出csv文件写成" random"行顺序,因此我不能轻易断言输出文件等于带有Junit的预期输出文件。

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

有一个简单的解决方案吗?

2 个答案:

答案 0 :(得分:5)

测试您是否有预期的行数。然后,将预期的行存储在List中。迭代实际行并确保它们“在”预期行列表中并从列表中删除该条目。像(groovy伪代码):

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

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

这应测试您是否具有预期的行数,并且您具有预期的行值而不考虑订单。

答案 1 :(得分:5)

您可以分两个阶段检查您的计划:

  1. 单独测试您的个人功能,例如MapFunction。在这里,您只检查自己的代码,输出应该是确定性的(假设您的函数是确定性的)。

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