|
前段時間充忙的學(xué)習(xí)RF,系統(tǒng)學(xué)習(xí)完之后就開始動手做各種接口的測試,雖然各類的接口測試基本能跑通了,但是重復(fù)造車的問題存在太明顯。RF本身內(nèi)置庫就已經(jīng)比較豐富,比如不需要import直接就加載到內(nèi)存的BuiltIn庫,還有需要import的常用模塊String,Collections,XML庫。在前面的接口測試中,使用最多的就是這幾個內(nèi)置庫,接口返回的數(shù)據(jù)基本都是xml格式的居多,然后自己也重復(fù)造車了,為此特地花了幾天時間去學(xué)習(xí)了下內(nèi)置庫,主要還是學(xué)了下XML庫,以下的分享都是基于XML庫。 學(xué)習(xí)XML內(nèi)置庫,我認為需要掌握以下幾個知識點: 第一:內(nèi)置庫的概念?有哪些內(nèi)置庫,大概都有什么關(guān)鍵字?有區(qū)分版本嗎?跟RF版本有關(guān)么?為什么內(nèi)置庫有些需要import,有些不需要import? 第二:XML內(nèi)置庫使用的是python的哪個標準庫?對這個標準庫需要有哪些基本的了解? 第三:內(nèi)置庫是怎么構(gòu)建起來的?基本關(guān)鍵字是否能靈活的使用? 第四:有時候可能需要稍微修改下內(nèi)置庫,比如增加一些關(guān)鍵字等,該怎么修改? 從網(wǎng)上和官網(wǎng)(http://)上搜到一些資料,整理如下: 第一:內(nèi)置庫的基本概念? 內(nèi)置庫實際在官網(wǎng)稱為standard library,就是標準庫。常見的其他庫比如Request,SeleniumLibrary庫,官網(wǎng)稱之為external library,就是外部庫,也稱第三方庫。標準庫和外部庫首先要正確的進行區(qū)分,對于標準庫,這些庫是直接綁定在RF內(nèi)的,在 D:\Python27\Lib\site-packages\robot\libraries(視python安裝目錄變化) 下可以看到,無須再下載;而外部庫,是需要根據(jù)個人需要,下載后再安裝導(dǎo)入才能使用的。 對于標準庫,又分兩類,類似BuiltIn庫是RF自動加載到內(nèi)存的,安裝后按下F5就能直接使 用,不需要再次import,而XML庫需要再次import才能正常使用。因為BuiltIn library 提供了很多常用的關(guān)鍵字,比如Should Be Equal,Convert To Integer等,所以RF就把這個常用的庫自動加載到了內(nèi)存。 不同版本的RF,支持不同的內(nèi)置庫而且相同的內(nèi)置庫里的關(guān)鍵字可能也是不一樣的,以RF3.0(使用命令robot --version查看RF版本)為例,3.0是目前最新的RF的版本,支持很多的內(nèi)置庫,查看D:\Python27\Lib\site-packages\robot下的py文件,可以看到: 基本官網(wǎng)寫的10個標準庫都能在這里面找到相應(yīng)的py文件。BuiltIn,Collections,DateTime,Dialogs,Process,OperatingSystem,Remote(沒有關(guān)鍵字,暫時不算在內(nèi)),Screenshot,String,Telnet,XML.這11個庫,有些是在RF2.0的時候就已經(jīng)有了的,最晚的DateTime,Process,XML是在RF2.8之后才內(nèi)置的,也就是說如果當(dāng)前使用的是RF2.8之前的版本,內(nèi)置庫是無法直接import XML就是使用的,需要下載安裝才能使用,這點需要注意下,不同的RF版本,相同的標準庫之間也是會細微的區(qū)別,這需要仔細的去查看保準庫內(nèi)每個版本的使用文檔。 10個標準庫,又都是做什么用的呢,這還真需要了解,而且還需要多花時間去了解每個標準庫里面的關(guān)鍵字,這10個標準庫,介紹如下: 這個表的來源是來自官網(wǎng)的,官網(wǎng)的用戶手冊文檔已經(jīng)描述的非常詳細了。學(xué)習(xí)的時候可以詳細的查看官網(wǎng)的相關(guān)文檔。 第二:XML內(nèi)置庫的學(xué)習(xí)。 從內(nèi)置庫的XML的源碼可以看出,RF使用的是ETree來對xml進行解析的,部分源碼如下:
import copy import re import os try: from lxml import etree as lxml_etree except ImportError: lxml_etree = None from robot.api import logger from robot.libraries.BuiltIn import BuiltIn from robot.utils import (asserts, ET, ETSource, is_string, is_truthy, plural_or_not as s) from robot.version import get_version should_be_equal = asserts.assert_equal should_match = BuiltIn().should_match class XML(object): ROBOT_LIBRARY_SCOPE = 'GLOBAL' ROBOT_LIBRARY_VERSION = get_version() _xml_declaration = re.compile('^<\?xml .*\?>') def __init__(self, use_lxml=False): use_lxml = is_truthy(use_lxml) if use_lxml and lxml_etree: self.etree = lxml_etree self.modern_etree = True self.lxml_etree = True else: self.etree = ET self.modern_etree = ET.VERSION >= '1.3' self.lxml_etree = False if use_lxml and not lxml_etree: logger.warn('XML library reverted to use standard ElementTree ' 'because lxml module is not installed.') def parse_xml(self, source, keep_clark_notation=False): with ETSource(source) as source: tree = self.etree.parse(source) if self.lxml_etree: strip = (lxml_etree.Comment, lxml_etree.ProcessingInstruction) lxml_etree.strip_elements(tree, *strip, **dict(with_tail=False)) root = tree.getroot() if not is_truthy(keep_clark_notation): NameSpaceStripper().strip(root) return root python提供了幾個標準庫都可以對xml進行解析,之前我使用的是DOM,基于RF使用的是ETree,便開始學(xué)習(xí)了下ETree的開發(fā)文檔。學(xué)習(xí)對XML文件的操作,那肯定也得對XML本身有最基本的了解,比如XML的用途,樹結(jié)構(gòu),節(jié)點類型(DOM),帶命名空間的xml。下面是部分的知識點的總結(jié): xml是一種可擴展的標記語言。要求標記需要成對的出現(xiàn)(有時候會進行簡寫<b/>)。一個典型的xml文檔如下所示: <example> <first id="1">text</first> <second id="2"> <child/> </second> <third> <child>more text</child> <second id="child"/> <child><grandchild/></child> </third> </example> A. 整個xml文檔是一個文檔節(jié)點,屬于根節(jié)點,比如上述文檔的<example>節(jié)點就是一個根節(jié)點,一個xml文件只能有一個根節(jié)點,否則解析的時候胡報錯的 B.每個 XML 標簽是一個元素節(jié)點,比如<first> 和<second>, <third>都屬于元素節(jié)點,卻屬于<example>的子節(jié)點。 C.attribute值:表示節(jié)點元素的屬性值,比如first 有一個屬性id,屬性值為1;second也有id屬性,屬性值為2,而third沒有屬性。 D.Text值:表示元素中的文本內(nèi)容。比如:first 的text值就為1;second沒有,third也沒有; 一個xml還包含其他的內(nèi)容:比如處理指令和一些注釋;在python的etree標準庫解析的過程中,是直接把這二個給剔除掉了。有興趣的可以根據(jù)官網(wǎng)給出的開發(fā)文檔,把常用的一些方法都敲一遍,主要的還是使用2個類 Element Objects和ElementTree Objects。 第三:RF中XML庫的學(xué)習(xí)。 在使用sudslibrary做soap協(xié)議的測試時,返回的xml是帶命名空間的,之前一直不理解,對XML庫進行整體的學(xué)習(xí)之后就有了很大的理解。 XML庫主要有以下幾個作用(翻譯于原文手冊): A. 解析一個XML文件,或一個包含XML的字符串,在一個XML元素結(jié)構(gòu)中,并從中尋找某些元素,用于進一步分析 (e.g. Parse XML and Get Element keywords). B. 獲取元素的文本或?qū)傩?e.g. Get Element Text and Get Element Attribute). C. 直接驗證文本、屬性或全部元素 (e.g Element Text Should Be and Elements Should Be Equal). D. 修改和保存它(e.g. Set Element Text, Add Element and Save XML). 下面按照關(guān)鍵字的類型大致做了以下的學(xué)習(xí):解析的xml都是前面的xml例子 A.最常用關(guān)鍵字的學(xué)習(xí): B. 通過xpath來搜素子節(jié)點。 C. 簡單的帶命名空間的xml的解析 D. 復(fù)雜的命名空間的xml解析(之前soap協(xié)議返回的xml的解析部分補充) 這些操作基本都是圍繞著對XML的讀寫,之前做報文測試的時候,遇到過返回的的xml是沒有根元素的,如果直接使用XML庫是無法進行解析的,需要加上根節(jié)點,再進行解析,于是直接寫了用戶自定義的庫。而且當(dāng)時需要從xml中讀取報文字段,與測試數(shù)據(jù)組合后,再一起發(fā)給服務(wù)器,這部分也是XML庫沒有提供的內(nèi)容。但是對返回的xml的數(shù)據(jù)進行解析,xml庫做的還是比較到位。如果覺得系統(tǒng)帶的xml庫功能不夠使用,或者想把幾個功能整成一個功能使用,通過以上的學(xué)習(xí)基本可以修改下代碼,然后自定義一個庫了。 還有幾點的學(xué)習(xí),后面還需要對RF有更深刻的了解才能有所感悟,這次的學(xué)習(xí)給我?guī)砹艘恍┤碌氖斋@,以前我查找資料很少看官方文檔,雖然英文過了六級,但是一看英文文檔還是會頭暈?zāi)X脹,這次逼著自己看了官網(wǎng)的標準庫的開發(fā)文檔和用戶手冊,真感覺很不錯,簡潔又明了,學(xué)習(xí)官網(wǎng)手冊果然是很不錯的學(xué)習(xí)方法,比去看某些博客收獲更全面更權(quán)威~~~這個技能get了~~~
|
|
|