He simplificado mi pregunta.
Tengo un archivo de texto con los datos siguientes
package1| class1 | test case1 | Pass | endpoint | ref no |
package1| class1 | test case2 | Pass | endpoint | ref no |
package2| class2 | test case1 | Fail | endpoint | ref no | fail reason
package3| class3 | test case2 | | | |
Quiero crear un xml a partir de lo anterior, mientras que será como se muestra a continuación. lógica siempre que field1 difiera de la línea anterior field1 cree un nodo y pruebe los casos debajo de él. si el campo 4 es nulo, la prueba se cuenta como error. Quiero mantener el recuento del número de casos de prueba, el número de errores y el número de fallas a nivel de paquete, es decir, el nodo . y también llevar un recuento de casos de prueba, no de error y no de falla en cada nodo
<?xml version="1.0" encoding="UTF-8"?>
<testsuites errors="1" failures="1" tests="4">
<testsuite name="package1" errors="0" failures="0" tests="2">
<Testcase>
<class>class1</class>
<name>Testcase1</name>
<Result>Pass</Result>
<FailReason></FailReason>
</testcase>
<Testcase>
<class>class2</class>
<name>Testcase2</name>
<Result>Pass</Result>
<FailReason></FailReason>
</testcase>
</TestSuite>
<testsuite name="package2" errors="0" failures="1" tests="1">
<Testcase>
<class>class1</class>
<name>Testcase1</name>
<Result>Fail</Result>
<FailReason>FailReason</FailReason>
</testcase>
</TestSuite>
<testsuite name="package3" errors="1" failures="0" tests="1">
<Testcase>
<class>class1</class>
<name>Testcase1</name>
<Result>Fail</Result>
<FailReason>Error</FailReason>
</testcase>
</TestSuite>
</Testsuites>
`
Estaba usando awk para crear tantos códigos que probé, nada exitoso, no estoy seguro de qué código debo poner aquí, que probé casi 6 horas trabajando en él, sin poder averiguar cómo hacerlo y secar ahora. se agradece cualquier ayuda. cualquier solución de script es buena, no solo awk.
2 respuestas
Tenga en cuenta que esta no es una respuesta completa a su pregunta. No me siento cómodo compartiendo la respuesta completa como un programa completo en una sola ejecución: sería un código demasiado largo para comentar.
Por favor, regrese y dígame si está siguiendo el código hasta ahora, agregaré una explicación editando mi respuesta, si se me pregunta.
En primer lugar: me deshice a priori de todos los espacios en su archivo de entrada original. Ahora se ve así:
package1|class1|test case1|Pass|endpoint|ref no|
package1|class1|test case2|Pass|endpoint|ref no|
package2|class2|test case1|Fail|endpoint|ref no|fail reason
package3|class3|test case2| | | |
Luego, configuro el separador de campo en tubería y procedo a hacer un poco de procesamiento. Como muchos ya han señalado, su archivo de entrada no es consistente y su xml no es compatible. Estoy dispuesto a dejarle toda la implementación real (según las pautas de SO, para que pueda mostrar su esfuerzo)
Intente algo como esto: cree un script (que llamará como awk -f script.awk textfilewithdata.txt
) y haga que suene así:
BEGIN {
FS = "|"
numberOfPackages = 0
fails = "fails"
testcases = "testcases"
}
{
allTests++
if ($1 != currPackage) {
currPackage = $1
numberOfPackages++
if (!(currPackage in packages)) {
# creates it
packages[currPackage][testcases] = 0 # stores errors, failures and test
packages[currPackage][fails] = 0
}
packages[currPackage][testcases]++
if ($4 == "Fail" ) {packages[currPackage][fails]++;allFail++}
} else {
packages[currPackage][testcases]++
if ($4 == "Fail" ) {packages[currPackage][fails]++;allFail++}
}
}
END {
print "<?xml version="1.0" encoding="UTF-8"?>"
print "<testsuites failures=\""allFail"\" tests=\""allTests"\">"
for (j in packages) {
print "\t<testsuite name=\""j"\" failures=\""packages[j][fails]"\" tests=\""packages[j][testcases]"\">"
for (k in packages[j]) {
print "\t\t<Testcase>"
print "\t\t\t<class>"
print "\t\t<\\Testcase>"
}
print "\t<\\testsuite>"
}
}
Nuevamente, regrese a mí con comentarios, intentaré brindar explicaciones sobre el código anterior.
La salida se ve así (gawk 4.2, Windows 10)
<?xml version=1 encoding=-8?>
<testsuites failures="1" tests="4">
<testsuite name="package1" failures="0" tests="2">
<Testcase>
<class>
<\Testcase>
<Testcase>
<class>
<\Testcase>
<\testsuite>
<testsuite name="package2" failures="1" tests="1">
<Testcase>
<class>
<\Testcase>
<Testcase>
<class>
<\Testcase>
<\testsuite>
<testsuite name="package3" failures="0" tests="1">
<Testcase>
<class>
<\Testcase>
<Testcase>
<class>
<\Testcase>
<\testsuite>
Esta es la solución final que produjo el informe de prueba junit tipo xml. Casi dos días de lucha para encontrar la respuesta, pero aprendí mucho sobre awk :)
La entrada es
012_project_y2013 | 01_12.1_new_prodcodes | tc06_s2m_mc_0200_MBT.utt | Pass | MIG_MSI_EP1 MDS_S2A_EP1 |
012_project_y2013 | 01_12.1_new_prodcodes | tc07_s2m_mc_0200_MCW.utt | Fail | |
012_project_y2013 | 01_12.1_new_prodcodes | tc08_s2m_mc_0200_MCW.utt | | |
012_project_y2014 | 01_12.1_new_prodcodes | tc09_s2m_mc_0200_MCW.utt | | |
~
BEGIN {
FS = "|"
}NF==0 {next}
NF>=1{
allTests +=1;
if ($1 != package) {
package = $1;
class = $2;
testname = $3;
testresult = $4;
endpoint = $5;
rrn = $6;
failreason=$7
numberOfPackages +=1;
if(!(package in currPackage)){
if(length(prepkg)!=0){
testsuite[prepkg,tests,fails,errors];}
prepkg = package;
tests=0;
fails=0;
errors=0;
test_result[package,"fail"] = 0;
test_result[package,"error"] =0;
test_result[package,"testcase"]=0;
testcount =0;
}
}
# testcase +=1;
if ($4~/Fail/) {test_result[package,"fail"] +=1;fails +=1;allFail++}
if ($4~/^[ ]*$/) {$4="Fail";test_result[package,"error"] +=1; errors +=1;allErrors++}
if($7~/^[ ]*$/ || $7 == ""){failreason = "error";}
if($7~/^[ ]*$/ || $7 == ""){failreason = "error";}
tests +=1;
currPackage[package,$2,$3,$4,failreason];
test_result[package,"testcase"]++;
}
END {
testsuite[package,tests,fails,errors];
print "<?xml version="1.0" encoding="UTF-8"?>"
print "<testsuites errors=\""allErrors"\" failures=\""allFail"\" tests=\""allTests"\">"
for (k in testsuite)
{
split(k,tno,SUBSEP);
pname = tno[1];
testcnt = tno[2];
failcnt = tno[3];
errcnt = tno[4];
print "\t<testsuite errors=\42"errcnt"\42"" " "failures=\42"failcnt"\42"" " "hostname=\42localhost\42 id=\"0\42 name=\42"pname"\42"" ""package=\42"pname"\42"" " "tests=\42"testcnt"\42"" " "timestamp=\42"date"\42"">";
for (y in currPackage)
{
split(y,sep,SUBSEP);
if (pname == sep[1]){
print "\t\t<testcase classname=\42"sep[2]"\42"" " "name=\42"sep[3]"\42"" " "time=\42"10"\42"">"
tresult = sep[4];
reason = sep[5];
if(tresult~/Fail/)
{
print "\t\t\t<failure message=\42""Assertion FAILED""\42"" " "type=\42""failure""\42"">"reason"</failure>\n";
}
}
}
print "\t</testsuite>";
}
print "</testsuites>";
}
La salida es
<?xml version=1 encoding=-8?>
<testsuites errors="2" failures="1" tests="4">
<testsuite errors="1" failures="0" hostname="localhost" id="0" name="012_project_y2014 " package="012_project_y2014 " tests="1" timestamp="">
<testcase classname=" 01_12.1_new_prodcodes " name=" tc09_s2m_mc_0200_MCW.utt " time="10">
<failure message="Assertion FAILED" type="failure">error</failure>
</testsuite>
<testsuite errors="1" failures="1" hostname="localhost" id="0" name="012_project_y2013 " package="012_project_y2013 " tests="3" timestamp="">
<testcase classname=" 01_12.1_new_prodcodes " name=" tc07_s2m_mc_0200_MCW.utt " time="10">
<failure message="Assertion FAILED" type="failure">error</failure>
<testcase classname=" 01_12.1_new_prodcodes " name=" tc06_s2m_mc_0200_MBT.utt " time="10">
<testcase classname=" 01_12.1_new_prodcodes " name=" tc08_s2m_mc_0200_MCW.utt " time="10">
<failure message="Assertion FAILED" type="failure">error</failure>
</testsuite>
</testsuites>
Preguntas relacionadas
Nuevas preguntas
xml
XML (Extensible Markup Language) es un formato de documento estructurado que define reglas de codificación de texto. Cuando utilice esta etiqueta, incluya etiquetas adicionales como lenguaje de programación, conjuntos de herramientas, tecnologías XML que se estén utilizando y otras etiquetas que describan el entorno del problema publicado. La flexibilidad de XML se presta a una amplia variedad de usos para la transferencia de datos de humanos y máquinas, así que sea específico en cuanto a herramientas y bibliotecas.