2017-06-26 5 views
0

soapui TESTS-TestSuites.xmlファイルからカスタマイズされたレポートを作成しています。私は失敗したTestCaseの名前を取得できますかPython2で失敗したテストケースを取得するXMLを読む

import os 
import os.path 
import codecs 
import xml.etree.ElementTree 
import xml.etree.ElementTree as ET 
from BeautifulSoup import BeautifulSoup 
from shutil import copyfile 

data = open(r'H:\Scripts\report\TESTS-TestSuites.xml') 
root = ET.parse(data).getroot() 
projectName = root.find('testsuite').get('package') 
totalTime = 0 
totalTestCases = 0 
totalTestFailure = 0 
for testsuites in root.findall('testsuite'):  
    totalTestCases += int(testsuites.get('tests')) 
    totalTime += float(testsuites.get('time')) 
    totalTestFailure += int(testsuites.get('failures')) 
successRate = "%.2f" % ((float(totalTestCases) - float(totalTestFailure))/float(totalTestCases)*100) 
print "SuccessRate", successRate 

# Get All Test Cases 
for testcases in root.iter('testcase'): 
    print testcases.get('name') 

# Get All Failed Test Cases 
for testcases in root.getiterator(): 
    if testcases.tag == 'failure': 
     print testcases.text 

# Get All Failed TestSuites 
for testsuites in root.findall('testsuite'): 
    if int(testsuites.get('failures')) !=0: 
     print "Failed TestSuite name", testsuites.get('name') 

- 以下

<?xml version="1.0" encoding="UTF-8" ?> 
<testsuites> 
    <testsuite errors="0" failures="0" id="0" name="APIs and API Versions retrieval" package="PAD API Regression" tests="11" time="1.535"> 
    <testcase name="GET-APIs" time="0.942" /> 
    <testcase name="GET-flight-inspiration-search-SearchnShoppingFamily" time="0.064" /> 
    <testcase name="GET-top-flight-destinations_SearchnShoppingFamily" time="0.059" /> 
    <testcase name="GET-flight-search-by-calendar_SearchnShoppingFamily" time="0.058" /> 
    <testcase name="GET-top-flight-destinations_TravelIntelligenceFamily" time="0.064" /> 
    <testcase name="GET-fare-search-history_TravelIntelligenceFamily" time="0.089" /> 
    <testcase name="GET-checked-in-links_UtilitiesFamily" time="0.067" /> 
    <testcase name="GET-nearest-relevant-airport_UtilitiesFamily" time="0.062" /> 
    <testcase name="GET-airport-lists-by-city/country_UtilitiesFamily" time="0.054" /> 
    <testcase name="GET-hotel-search_HotelAPIsFamily" time="0.052" /> 
    <testcase name="GET-APIs_with_invalid_ID" time="0.024" /> 
</testsuite> 
<testsuite errors="0" failures="1" id="1" name="Service and API Catalogue" package="PAD API Regression" tests="13" time="0.629"> 
    <testcase name="GET-List_of_catalogues" time="0.058" /> 
    <testcase name="GET-Catalogue_AirlineIT2" time="0.01"> 
    <failure message="Cancelling due to failed test step" type="Cancelling due to failed test step"> 
    <![CDATA[<h3><b>Catalogue_AirlineIT2 Failed</b></h3><pre>[Valid HTTP Status Codes] Response status code:200 is not in acceptable list of status codes 
</pre><hr/>]]> 
    </failure> 
    </testcase> 
    <testcase name="GET-Catalogue_Distribution" time="0.05" /> 
    <testcase name="GET-Catalogue_Self-service" time="0.035" /> 
    <testcase name="GET-All_Families_of_Self-Service_Catalogue" time="0.065" /> 
    <testcase name="GET-Families_Level_1_of_Self-Service_Catalogue" time="0.053" /> 
    <testcase name="GET-Families_Level_2_of_Self-Service_Catalogue" time="0.058" /> 
    <testcase name="GET-Family_Air API_of_Self-Service_Catalogue" time="0.03" /> 
    <testcase name="GET-Family_Hotel API_of_Self-Service_Catalogue" time="0.067" /> 
    <testcase name="GET-Family_Search_and_Shopping_from_Air_APIs_of_Self-Service_Catalogue" time="0.052" /> 
    <testcase name="GET-Family_Travel Intelligence API_of_Self-Service_Catalogue" time="0.036" /> 
    <testcase name="GET-Family_Utilities API_of_Self-Service_Catalogue" time="0.105" /> 
    <testcase name="GETFamily_Search_and_Shopping_from_Hotel_API_of_Self-Service_Catalogue" time="0.01" /> 
    </testsuite> 
</testsuites> 

を読み、レポートの結果を得るために私のコードです - 以下

は、XML形式の結果であり、 。

私は次のような場合は、私はチャット上の議論に基づいてNone

for testsuites in root.findall('testsuite'): 
    if int(testsuites.get('failures')) !=0: 
     print "Failed TestSuite name", testsuites.get('name') 
     for testcases in root.getiterator(): 
     if testcases.tag == 'failure': 
      print testcases.get('name') 
+0

あなたのオブジェクトは 'のapache-ant'を使用し、その後、HTML形式のレポートを作成し、入力として上記のXMLを提供することを目的とする場合。詳細はこちらを参照してください。 - https://stackoverflow.com/questions/12855740/coversion-of-junit-xml-report-into-html-form – Rao

+0

私はそれを確認しました。私の意図はダメージコントロールレポートのようなレポートを作成することです。 。ここをクリックしてください - 私の他の質問 - https://stackoverflow.com/questions/44453012/surefire-report-generating-duplicate-result-in-the-report 私の質問の以下の部分をチェックしてください。そしてもしあなたが何か考えがあれば、素晴らしいだろう。 – royki

+0

pythonやmavenについてよく知らないでください。あなたは 'groovy'を使ってXMLを処理しても構いませんか? – Rao

答えて

1

を取得し、OPは質問で述べたように、XMLファイルを読み込んでグルーヴィーなスクリプト のために要求され、別のXMLファイルを作成しますテストケースごとに

以下は、ファイルを書き込むためのテンプレートアプローチを使用しています。

テンプレートで置き換えられるデフォルトのマップファイルの使用。各インスタンスについて、それぞれのテストケースの値をテンプレートに置き換えます。ここで

はGroovyのスクリプトです:

//Provide the absolute path of the report xml 
def inputXml = '/absolute/path/report.xml' 

//Define the location where files needs to be written 
def outputDir = '/absolute/path/output/directory' 

def templateXml = '''<?xml version="1.0" encoding="UTF-8"?> 
<testsuite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report.xsd" name="$className" time="$suiteTime" tests="$tests" errors="$errors" skipped="$skipped" failures="$failures"> 
<testcase name="$caseName" classname="$className" time="$caseTime"/> 
</testsuite>''' 

def binding = [failures:'0', errors: '0', skipped:'0', suiteTime: '0.00', caseTime:'0.00', caseName:'', tests: '1', suite: '', className: 'com.amadeus.developers.pad.amp.catalogue.Catalogue_TryIt_002_SoapSpec'] 

def xml = new XmlSlurper().parseText(new File('report.xml').text) 
def testcases = xml.'**'.findAll{it.name() == 'testcase'} 
def engine = new groovy.text.SimpleTemplateEngine() 

//Save the contents to a file 
def saveToFile(file, content) { 
    if (!file.parentFile.exists()) { 
     file.parentFile.mkdirs() 
     println "Directory did not exist, created" 
    } 
    file.write(content) 
    assert file.exists(), "${file.name} not created" 
} 

def writeCaseData = { kase -> 
    def bindingKase = binding.clone() 
    bindingKase.errors = kase.parent()[email protected] 
    bindingKase.suiteTime = kase.parent()[email protected] 
    bindingKase.suite = kase.parent()[email protected] 
    bindingKase.caseName = [email protected] 
    bindingKase.caseTime = [email protected] 
    kase.failure.size() == 0 ?: (bindingKase.failures = '1') 
    def template = engine.createTemplate(templateXml).make(bindingKase) 
    saveToFile(new File("${outputDir}/${[email protected]}.xml"), template.toString()) 
} 

testcases.each { writeCaseData it } 
関連する問題