公司使用TestLink作為T(mén)est case管理工具,有時(shí)需要將Test link中的數據作為數據源進(jìn)行一些分析。手工?No!
思路:
Test case in Testlink ----export-----> XML file -----parse----> data structure ----analyze----> Result
著(zhù)重說(shuō)怎么解析,其他都很好辦:)
Python中解析XML的工具很多,SAX,DOM,各種,個(gè)人偏愛(ài)使用直觀(guān)的樹(shù)形結構來(lái)解析xml,在python中的實(shí)現就是ElementTree.
首先導入lib。
ElementTree在 Python 標準庫中有兩種實(shí)現。一種是純 Python 實(shí)現例如 xml.etree.ElementTree ,另外一種是速度快一點(diǎn)的 xml.etree.cElementTree 。盡量使用 C 語(yǔ)言實(shí)現的那種,因為它速度更快,而且消耗的內存更少。以下代碼會(huì )在有C實(shí)現的etree系統上優(yōu)先使用C的實(shí)現,如果沒(méi)有,使用Python的實(shí)現,避免trigger exception。
- try:
- import xml.etree.cElementTree as ET
- except ImportError:
- import xml.etree.ElementTree as ET
好了,接下來(lái)我們來(lái)解析testlink導出的xml文件。下面一段是導出的xml文件,現在我需要的是解析出externalid, name,summary,steps,expected result,
- <?xml version="1.0" encoding="UTF-8"?>
- <testsuite name="New DH Group Support" >
- <node_order><![CDATA[1]]></node_order>
- <details><![CDATA[]]>
- </details><testsuite name="DH Group 14" >
- <node_order><![CDATA[1]]></node_order>
- <details><![CDATA[]]>
- </details>
- <testcase internalid="270258" name="BOVPN-Interop-Encryptions-Route-Main-P1-SHA1-DES-DHG14">
- <node_order><![CDATA[0]]></node_order>
- <externalid><![CDATA[108852]]></externalid>
- <summary><![CDATA[<p>pc1--fb1(external)---(external)fb2--pc2</p>]]></summary>
- <steps><![CDATA[<p>1.Config bovpn gateway:set fb1 & fb2 to main mode,</p>
- <p>P1:SHA1-DES-DHG14,others are default settings.</p>
- <p>2.Check the traffic can pass through the tunnel. </p>]]></steps>
- <expectedresults><![CDATA[<p>Step2:the traffic can pass through the tunnel. </p>]]></expectedresults>
- </testcase>
-
- <testcase internalid="270260" name="BOVPN-Interop-Encryptions-Route-Main-P1-SHA1-3DES-DHG14">
- <node_order><![CDATA[0]]></node_order>
- <externalid><![CDATA[108853]]></externalid>
- <summary><![CDATA[<p>pc1--fb1(external)---(external)fb2--pc2</p>]]></summary>
- <steps><![CDATA[<p>1.Config bovpn gateway:set fb1 & fb2 to main mode,</p>
- <p>P1:SHA1-3DES-DHG14,others are default settings.</p>
- <p>2.Check the traffic can pass through the tunnel. </p>]]></steps>
- <expectedresults><![CDATA[<p>Step2:the traffic can pass through the tunnel. </p>]]></expectedresults>
- </testcase>
-
- <testcase internalid="270262" name="BOVPN-Interop-Encryptions-Route-Main-P1-SHA1-AES-128bit-DHG14">
- <node_order><![CDATA[0]]></node_order>
- <externalid><![CDATA[108854]]></externalid>
- <summary><![CDATA[<p>pc1--fb1(external)---(external)fb2--pc2</p>]]></summary>
- <steps><![CDATA[<p>1.Config bovpn gateway:set fb1 & fb2 to main mode,</p>
- <p>P1:SHA1-AES-128bit-DHG14,others are default settings.</p>
- <p>2.Check the traffic can pass through the tunnel. </p>]]></steps>
- <expectedresults><![CDATA[<p>Step2:the traffic can pass through the tunnel. </p>]]></expectedresults>
- </testcase>
- </testsuite></testsuite>
下面一個(gè)類(lèi)我們來(lái)解析每一個(gè)我需要的數據
- class TestCaseXml:
-
- def __init__(self, xmlFile):
- self.tree = ET.parse(xmlFile)
- self.root = self.tree.getroot()
- # return self.root
-
- def getTCName(self, tc):
- # get name attribute
- return tc.get('name')
-
- def getTCId(self, tc):
- # get externalid child data
- return tc.find('externalid').text
-
- def getTCStep(self, tc):
- return tc.find('steps').text
-
- def getTCExpect(self, tc):
- return tc.find('expectedresults').text
-
- def getTCSummary(self, tc):
- return tc.find('summary').text
-
- def rootObj(self):
- return self.root
-
- def test(self):
- for tc in self.root.findall('.//testcase'):
- print self.getTCName(tc).lower()+'-'+self.getTCId(tc)
代碼不做過(guò)多解釋?zhuān)芎?jiǎn)單,self.root.findall()找到所有的testcase對象,然后遍歷每個(gè)對象,獲得每個(gè)對象中包含對應字段的值,注意這里使用tc.find().text直接可以返回CDATA的內容,非常方便。
這里只是一個(gè)例子,實(shí)際工作中可以將其保存在一個(gè)元素為dict的list中,進(jìn)行各種分析之類(lèi)的,就是很簡(jiǎn)單的事情了
這里只使用了基本的方法,更多使用幫助見(jiàn)官方文檔:
http://docs.python.org/2/library/xml.etree.elementtree.html
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。