La comparaison de fichiers de texte avec Junit
Je compare des fichiers texte en utilisant junit:
public static void assertReaders(BufferedReader expected,
BufferedReader actual) throws IOException {
String line;
while ((line = expected.readLine()) != null) {
assertEquals(line, actual.readLine());
}
assertNull("Actual had more lines then the expected.", actual.readLine());
assertNull("Expected had more lines then the actual.", expected.readLine());
}
Est-ce une bonne façon de comparer des fichiers texte? Qu'est-ce que préféré?
Vous devez vous connecter pour publier un commentaire.
junit-addons a nice le support: FileAssert
Il vous donne des exceptions comme:
Voici une approche simple pour vérifier si les fichiers sont exactement le même:
Où
file1
etfile2
sontFile
cas, etFileUtils
est de Apache Commons IO.Pas beaucoup de code pour vous permettre de maintenir, qui est toujours un plus. 🙂 Et très facile si vous avez déjà arriver à l'utilisation d'Apache Commons dans votre projet. Mais pas de belles, des messages d'erreur détaillés comme dans la marque, solution de.
Modifier:
Heh, en regardant de plus près la
FileUtils
API, il y a une même moyen plus simple:Comme un bonus, cette version fonctionne pour tous les fichiers, pas seulement du texte.
Files.toString(file1, Charset.forName("UTF-8"));
Il n'y a pas beaucoup de différence dans un cas comme celui-ci, mais dans l'ensemble de la Goyave est plus propre, mieux documenté et activement maintenu bibliothèque.new String(Files.readAllBytes(Paths.get("/path/to/file.txt")), StandardCharsets.UTF_8)
Voici une liste plus exhaustive de Fichier du comparateur dans divers de la 3e partie de bibliothèques Java:
À compter de 2015, je recommande AssertJ, un élégant et complet affirmation de la bibliothèque. Pour les fichiers, vous pouvez faire valoir à l'encontre d'un autre fichier:
ou contre inline chaînes:
Les messages d'échec sont très instructives. Si une ligne est différente, vous obtenez:
et si l'un des fichiers a plus de lignes, vous bénéficiez de:
hasContentEqualTo
est obsolète depuis la de ce commentaire. UtilisationhasSameContentAs
à la place.Je suggérerais à l'aide de l'Affirmer.assertThat et un hamcrest matcher (junit 4.5 ou plus tard - peut-être même 4.4).
Je finirais avec quelque chose comme:
où mon matcher est:
Comparateur de pros:
Contre:
FileUtils
est sûr, c'est un bon. Voici encore un autre approche simple pour vérifier si les fichiers sont exactement les mêmes.Tandis que le assertEquals() donne un peu plus de réactions que la assertTrue(), le résultat de checksumCRC32() est un long. Oui, c'est peut-être pas intrinsèquement utile.
Aussi simple comparaison du contenu de deux fichiers avec java.nio.fichier API.
Ou si vous voulez comparer les différentes lignes:
S'attendre a plus de lignes que le réel, vous allez échouer une assertEquals avant d'arriver à la assertNull plus tard.
Il est assez facile à corriger si:
actualLine
est limitée à la boucle while. Le champ d'application deactual
est l'ensemble de la méthode.C'est ma propre mise en œuvre de
equalFiles
, pas besoin d'ajouter une bibliothèque à votre projet.Et pour l'utiliser, il suffit d'utiliser régulièrement
AssertTrue
JUnit méthode