2015-04-08 1 views
4

Je développe un projet avec Apache Flink et j'utilise junit pour tester mes opérateurs. Cependant, je suis confronté à un problème: en raison du parallélisme, flink va écrire son fichier csv de sortie avec un ordre de ligne "aléatoire", donc je ne peux pas facilement affirmer que le fichier de sortie est égal à un fichier de sortie attendu avec Junit .Test de l'égalité des fichiers csv avec un ordre de ligne aléatoire (Junit)

La performance n'est pas un problème puisque nous parlons de petits fichiers (< 100 lignes) et seulement pour les tests.

Existe-t-il une solution facile?

+1

Triez les lignes des csv attendues et réelles, puis testez l'égalité. –

+0

@JBNizet aurait pu l'être aussi – Ben

Répondre

4

Vous pouvez vérifier votre programme en deux étapes:

  1. votre fonction individuelle dans l'isolement, par exemple, un MapFunction. Ici, vous ne vérifiez que votre propre code et la sortie doit être déterministe (étant donné que votre fonction est déterministe).

  2. Testez le programme complet. Ici, votre code sera exécuté par Flink et l'ordre du résultat n'est pas déterministe (à moins que vous ne le triez). Dans Flink, nous avons quelques classes d'utilité pour tester des programmes complets (principalement utilisés pour exécuter nos propres tests d'intégration). Ces classes affichent une petite instance locale de Flink, exécutent les tests et la comparent à un résultat attendu (trié ou non ordonné). Découvrez le MultipleProgramsTestBase et comment il est utilisé par exemple dans le DegreesITCase. Vous pouvez utiliser MultipleProgramsTestBase en incluant la dépendance Maven flink-test-utils. Selon la version de Flink que vous utilisez, les choses peuvent sembler un peu différentes de la version actuelle. Laissez un commentaire ici ou envoyez une requête ping à la liste de diffusion Flink si vous avez des questions.

+1

Merci, la méthode 'compareResultsByLinesInMemory' de' TestBaseUtils' fait exactement ce que je cherchais! – Ben

4

Vérifiez que vous avez le nombre attendu de lignes. Ensuite, stockez les lignes attendues dans une liste. Itérer sur les lignes réelles et s'assurer qu'elles sont "dans" la liste des lignes attendues et supprimer cette entrée de la liste. Quelque chose comme (code pseudo groovy):

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

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

Cela devrait vérifier que vous avez le nombre prévu de lignes et que vous avez les valeurs de ligne attendues sans ordre.

+0

C'est si facile que je n'y ai même pas pensé ... Merci! – Ben