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