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.

0
Abrar Ahamed 19 feb. 2018 a las 16:01

2 respuestas

La mejor respuesta

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>
2
Daemon Painter 22 feb. 2018 a las 07:54

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>
0
Abrar Ahamed 24 feb. 2018 a las 04:51