2017-08-29 4 views
-1

Nous utilisons actuellement FitNesse pour nos tests d'automatisation. Je suis en train de l'intégrer dans nos builds en utilisant VSTS et j'ai besoin de publier les résultats des tests. Les résultats des tests FitNesse sont sauvegardés en XML et doivent être convertis en un format JUnit compréhensible par VSTS. Idéalement, je voudrais utiliser un script powershell qui rendra possible la transformation en JUnit.Convertir le résultat du test XML FitNesse au format JUnit

Quelqu'un a-t-il déjà fait cela ou a-t-il un exemple de script à convertir au format JUnit?

Merci beaucoup

+2

Qu'avez-vous essayé? XSLT est-il une option? – MartinByers

+0

J'ai un fichier XSLT que je ne peux malheureusement pas partager ... La partie difficile est d'ouvrir les résultats pour chaque test individuel dans la suite de tests, à l'intérieur de 'FitNesseRoot/files/testResults' (utilisez la fonction XSLT' document') , puis en extrayant le niveau de détail que vous voulez voir. – legoscia

+0

merci @legoscia, cela semble être une bonne option. Utilisez-vous la fonction XSLT pour convertir en JUnit? Je vise à en faire un script PowerShell. Est-ce quelque chose que vous avez fait? Ou avez un exemple qui pourrait m'aider à démarrer s'il vous plaît? – Sej

Répondre

0

Merci pour l'aide les gars. Nous avons créé notre propre script PowerShell à la fin pour prendre les noms de classes, les suites et les types d'échec. Posté ci-dessous si quelqu'un voudrait utiliser.

param([string]$outpath, [string]$testserver, [string]$suitename) 
 

 
$uri = "http://" + $testserver + "/" + $suitename + "?suite&format=xml" 
 
$resultString = Invoke-WebRequest -Uri $uri 
 
$xml = New-Object xml 
 
$xml.LoadXml($resultString) 
 

 
$tests = @{} 
 

 
foreach($result in $xml.testResults.result) 
 
{ 
 
    $pageName = $result.pageHistoryLink.Substring(0, $result.pageHistoryLink.IndexOf("?")) 
 
    foreach ($ir in $result.instructions.instructionResult) 
 
    { 
 
     $i =$ir.instruction.Replace("=",":") 
 
     $argsloc = $i.LastIndexOf(', args:') 
 
     if ($argsloc -gt 0) 
 
     { 
 
      $i=$i.Substring(0, $argsloc) + "}" 
 
     } 
 

 
     $instr =convertFrom-Json $i 
 
     if ($instr.instruction -eq "import") 
 
     { 
 
      continue 
 

 
     } 
 

 
     if ($instr.instruction -eq "make") 
 
     { 
 
      $t=New-Object psobject 
 
      $classname = $pagename + "." + $instr.className 
 
      Add-Member -InputObject $t -MemberType NoteProperty -Name className -Value $classname 
 
      Add-Member -InputObject $t -MemberType NoteProperty -Name scenarios -Value @{} 
 
      $tests.add($pagename + "." + $instr.instanceName, $t)  
 
     } 
 

 
     if ($instr.instruction -eq "call") 
 
     { 
 
     
 
      $t=$tests[$pagename + "." + $instr.instanceName] 
 
      if (-not($t.scenarios.ContainsKey($ir.expectation.row))) 
 
      { 
 
      $s=New-Object psobject 
 
      Add-Member -InputObject $s -MemberType NoteProperty -Name pass -Value $true 
 
      Add-Member -InputObject $s -MemberType NoteProperty -Name failures -Value @() 
 
      $t.scenarios.add($ir.expectation.row, $s)  
 
      } 
 

 
      if ($ir.expectation.status -eq $null) 
 
      { 
 
      continue 
 
      } 
 

 
      if ($ir.expectation.status -eq "pass") 
 
      { 
 
      continue 
 
      } 
 

 
      $LASTEXITCODE = 1 
 
      $scenario = $t.scenarios[$ir.expectation.row] 
 
      $scenario.pass =$false 
 
      $scenario.failures += ("Method Name: "+ $instr.methodName + " - Expected: " + $ir.expectation.expected + ", Actual: " + $ir.expectation.actual) 
 

 
     } 
 
    } 
 
} 
 

 
$doc = New-Object System.Xml.XmlDocument 
 
    
 
$suites = $doc.CreateElement("testsuites") 
 
$res=$doc.AppendChild($suites) 
 

 
$ts = $doc.CreateElement("testsuite") 
 
$res=$suites.AppendChild($ts) 
 

 
foreach ($testkey in $tests.Keys) 
 
{ 
 
    $test = $tests[$testkey] 
 
    $test 
 
    foreach ($scenariokey in $test.scenarios.Keys) 
 
    { 
 
     $scenario =$test.scenarios[$scenariokey] 
 
     $tc = $doc.CreateElement("testcase") 
 

 
     $attr=$doc.CreateAttribute("classname") 
 
     $res=$attr.Value= $test.className 
 
     $res=$tc.Attributes.Append($attr) 
 
     
 
     $attr=$doc.CreateAttribute("name") 
 
     $res=$attr.Value= $test.className 
 
     $res=$tc.Attributes.Append($attr) 
 

 
     if (-not($scenario.pass)) 
 
     { 
 
      $errString = [string]::Join(": ", $scenario.failures) 
 
      $scenario.failures.GetType() 
 
      $fail = $doc.CreateElement("failure") 
 
      $attr=$doc.CreateAttribute("message") 
 
      $res=$attr.Value= $errString 
 
      $res=$fail.Attributes.Append($attr) 
 
      #$fail.innertext = $errString 
 
      $res=$tc.AppendChild($fail) 
 
     } 
 

 
     $res=$ts.AppendChild($tc) 
 
    } 
 
} 
 

 
$doc.Save($outpath)