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

Test csv files equality with random line order (Junit)

我正在使用 Apache Flink 开发一个项目,我正在使用 junit 来测试我的运算符。

但是我面临一个问题:由于并行性,flink 将使用 "random" 行顺序写入其输出 csv 文件,因此我无法轻易断言输出文件等于预期输出用 Junit 归档。

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

有简单的解决方法吗?

测试您是否有预期的行数。然后,将预期的行存储在列表中。遍历实际行并确保它们是 "in" 预期的行列表并从列表中删除该条目。类似于 (groovy 伪代码):

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

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

这应该测试您是否具有预期的行数以及您是否具有预期的行值而不考虑顺序。

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

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

  2. 测试整个程序。这里你的代码将由 Flink 执行,结果的顺序是不确定的(除非你对它进行排序)。在 Flink 中,我们有一些实用程序 类 来测试完整的程序(主要用于 运行 我们自己的集成测试)。这些 类 调出一个小型本地 Flink 实例,运行 测试,并将其与预期结果(排序或无序)进行比较。检查 MultipleProgramsTestBase and how it is used for example in the DegreesITCase. You can use the MultipleProgramsTestBase by including the flink-test-utils Maven 依赖项。根据您使用的 Flink 版本,事情可能看起来与当前的 master 有点不同。如果您有任何疑问,请在此处发表评论或访问 Flink 用户邮件列表。