domingo, 15 de octubre de 2017

Aprende a comparar ficheros XML con XMLUnit

Por asuntos del trabajo tenía que realizar pruebas de comparación de ficheros XML. Con DOM se podría hacer pero sería algo rudimentario. Así que busque una herramienta que nos facilitará dicho trabajo y de esta forma encontré XMLUnit. 

Dependiendo de la prueba podemos o bien comparar con 'CompareMatcher' y que nos diga si son iguales, o bien que nos indique cuantas diferencias hay. Un ejemplo de lo primero sería este:

String file1 = FileUtils.readFileToString(new File("src/test/resources/file1.xml"), Charset.defaultCharset());
String file1Bis = FileUtils.readFileToString(new File("src/test/resources/file1Bis.xml"), Charset.defaultCharset());
assertThat(file1, CompareMatcher.isIdenticalTo(file1Bis));

Para verificar si son iguales y poder ver las diferencias usariamos 'DiffBuilder'. De esta forma a través del objeto que realiza la comparación podremos imprimir por pantalla cuales son los campos que difieren. Un ejemplo sería:

String file1 = FileUtils.readFileToString(new File("src/test/resources/file1.xml"), Charset.defaultCharset());
String file1Bis = FileUtils.readFileToString(new File("src/test/resources/file1Bis.xml"), Charset.defaultCharset());
Diff myDiff = DiffBuilder.compare(file1).withTest(file1Bis).build();
Assert.assertFalse(myDiff.toString(), myDiff.hasDifferences());

Hay otra propiedad interesante y es anteriormente hemos usado el método 'isIdenticalTo' pero también existe 'isSimilarTo'. Este método por defecto funciona igual al anterior pero nos permite configurarlo y que archivos que no sean literalmente iguales, pero si tengan el mismo contenido nos lo compare correctamente. En este ejemplo le diremos que compare no por orden sino por nombre de los elementos.

String file1 = FileUtils.readFileToString(new File("src/test/resources/file1.xml"), Charset.defaultCharset());
String file1Similar = FileUtils.readFileToString(new File("src/test/resources/file1Similar.xml"), Charset.defaultCharset());
assertThat(file1, CompareMatcher.isIdenticalTo(file1Similar).withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName)));

Por último tanto un método como otro nos permite un poco más de configuración. Como puede ser ignorar comentarios, borrar espacios, etc. Pero haremos un ejemplo de algo más util, como es poder comparar el contenido de los ficheros sin tener en cuenta un nodo concreto (como puede ser aquel que contiene la fecha de creación del mismo). Para este caso crearemos un objeto 'Predicate' que nos permita filtrar por nombre de nodos e indicar uno concreto.

String file1 = FileUtils.readFileToString(new File("src/test/resources/file2.xml"), Charset.defaultCharset());
String file1Bis = FileUtils.readFileToString(new File("src/test/resources/file2DiffTimestamp.xml"), Charset.defaultCharset());
Diff myDiff = DiffBuilder.compare(file1).withTest(file1Bis).withNodeFilter(new Predicate<Node>() {
 public boolean test(final Node n) {
  return !"timestamp".equals(Nodes.getQName(n).getLocalPart());
 }
}).build();
Assert.assertFalse(myDiff.toString(), myDiff.hasDifferences());

No hay comentarios:

Publicar un comentario