隨著軟件開發在造車行業中占有越來越重要的地位,敏捷開發的思想在造車領域中也逐漸地被重視起來,隨之而來的是整車廠對自動化測試需求越來越強烈。本文結合北匯信息在自動化測試方面的豐富經驗,簡單介紹一下實施自動化測試可能需要具備的技能及具體實踐流程。
自動化測試城門-Python
要實現完全的自動化測試,我們首先要做的是先實現半自動化測試,即編寫自動化測試腳本。俗話說Life is short,I use Python,Python作為一種簡單易上手的高級編程語言,憑借其“無所不包”的庫,成為測試腳本開發的不二之選。這里簡單介紹一下,測試腳本開發常用的一些Python標準庫。
城門士卒-os庫
在編寫測試腳本時,不可避免地會遇到對文件路徑的獲取及編輯,os庫里的path函數可以方便地實現這些操作,如絕對路徑獲取os.path.abspath()、路徑拼接os.path.join()、路徑存在判斷os.path.exist()等;如果你需要在Python中運行測試工具提供的命令,那么os庫的system函數或popen函數可以讓你方便地調用cmd(Windows)或shell(Linux)。
城門士卒-sys庫
如果你所編寫的測試腳本有跨平臺運行的需求,那么你可以通過sys庫的platform函數獲取腳本的運行環境。根據運行環境的不同,編寫不同的批處理命令;sys庫中的argv函數,還可以為你的測試腳本提供簡單的命令行接口,當你的腳本需要接收外部傳遞的參數時,你可以通過sys.argv[]方便地獲取。而如果你需要編寫更復雜更友好的命令行接口,你需要使用Python的另外一個標準庫argparse來實現。
城門隊長-re庫
正則表達式是編寫測試腳本的必備技能,因為有時我們會遇到復雜的文本處理,如在工程文件中查找需要修改的配置,并將其修改為我們所需要的內容。此時一般的查找替換函數就很難實現這個功能,我們只能借助強大的re庫(正則表達式)來解決這個棘手的問題。re庫提供的函數有:
re.compile():編譯正則表達式,生成一個 Pattern對象;
re.findall():搜索所有滿足條件的字符串;
re.match():從第一個字符開始匹配模式;
re.search():搜索第一個滿足條件的字符串,查找到第一個停止;
re.sub():替換滿足條件的字符串。
在使用re模塊時,我們一般先用re.compile()將正則表達式編譯生成為一個Pattern對象,然后再基于這個對象進行findall、match等操作,這樣既可以提高代碼的可讀性,也可以提高代碼的運行效率。
使用正則表達式進行查找替換是很方便的,但是在很多時候我們需要在匹配的字符串前后添加內容,并且保留匹配的內容,這時普通的查找替換是難以實現的。
如:希望將hour: minute格式后添加:00,形成hour: minute: seconds這種格式。此時可以采用如下方式來實現:
查找的正則表達式:
替換為:
這里,我們在替換的字符中使用\1,來引用正則表達式中第一個分組匹配到的內容,如果正則表達式中有多個分組,可以依次使用\2\3等進行引用,可以使用\0來引用整個正則表達式的內容。
小結
在掌握了Python基礎語法和這三個標準庫后,自動化測試的大門就為我們敞開了。但是想要編寫一個可以驅動測試工具進行測試的腳本,我們還需要了解測試工具在headless模式[1]下的接口情況,如果工具提供的接口豐富,可以實現在headless模式(這里的headless模式是指在不使用工具GUI的情況下,以純命令行的方式進行工具使用的模式)下對測試工程進行配置和執行等操作,那么我們的測試腳本開發工作將會順利地進行。
但是如果工具提供的headless模式接口有限,無法滿足測試腳本的需求,那么進入自動化測試大門后,等待我們的就是另一個棘手的問題:如何對工程文件進行解析與修改。考慮到大部分的工程文件都是XML格式的,因此后續我們就簡單介紹一下如何通過Python解析和修改XML文件。
自動化測試甕城——XML文件
甕城守備——XML解析
在Python的標準庫中,有專門處理XML文件的庫,無需安裝第三方庫就可以使用Python進行XML文件的解析,但是要想準確地從XML文件中解析出想要的信息,我們首先需要簡單了解一下XML的文件結構。如下是一個簡單的XML文檔。
其中Harry Potter元素的結構如下圖所示:
注:圖片來源于w3school
在該XML文本中,根元素是 <2;bookstore>,文檔中的所有 <2;book> 元素都被包含在 <2;bookstore> 里。<2;book> 元素有 4 個子元素:<2;title>、< author>、<2;year>、<2;price>。每個子元素都包含一個文本內容,但只有子元素title和元素book擁有屬性。
我們在解析XML時,一般需要獲取的就是元素的屬性值以及元素的文本內容。以下我們就簡單介紹一下,如何通過python獲取元素的屬性值及文本內容。
Python的XML庫提供了一個通過標簽名稱獲取元素的函數getElementsByTagName(),該函數返回的是一個包含元素對象的list,通過調用元素對象的attributes方法,我們就可以方便地獲取元素的屬性值。如,我們可以使用如下命令獲取XML文件中第一個標簽為title的lang屬性值:
root.getElementsByTagName("title")[0].attributes.getNamedItem("lang").nodeValue
獲取第一個標簽為title的元素的文本信息的代碼如下:
root.getElementsByTagName("title")[0].firstChild.data
甕城參將——XML修改
XML元素的屬性和文本內容修改很簡單,在上小節中獲取對應的元素信息后,直接對其進行賦值即可。但是,修改后的信息保存在XML對象中。要完成對實際XML文件的修改,我們還需要用XML對象中的內容覆蓋原有的XML文件,這一步存在很多棘手的問題。
在XML文件中,為了避免元素文本內容中存在的特殊字符引起解析器錯誤,在文本內容中引入實體引用來替代可能導致錯誤的字符,如回車 、雙引號"、單引號'。如果使用python的xml.dom.minidom庫解析并使用writexml輸出XML文件,該庫會將這些實體引用轉義為其實際字符進行保存。如果不對XML對象中的內容進行處理,導出的XML文件將會存在很多錯誤。
為了避免這個情況的出現,我們需要使用之前小節介紹的正則表達式將這些字符再替換為其實體引用。這個過程需要我們能熟練使用正則表達式進行文本查找與替換。
除了XML文件中的實體引用外,如果XML文件中存在中文字符,那么還有一個需要注意的事情:不要使用with openas的方式讀寫XML文件,要使用open指定文件的編碼為'utf-8’的方式,對XML文件進行寫入。如下所示:
f =open(self.JenkinsJobXMLPath,'w',encoding="utf-8")
dom.writexml(f,indent='',addindent='\t',newl='',encoding='utf-8')
f.close()
小結
上述兩個問題是修改XML文件時普遍會遇到的問題。解決了這兩個問題,我們基本上就可以完美實現XML文件的修改了。此時,我們就可以編寫自動化程度更高的測試腳本,然而我們依然無法實現完全的自動化測試,因為我們仍然需要手動地去執行測試腳本。那么,我們該如何實現測試腳本的自動執行呢?這就需要我們打通自動化測試的最后一個關卡,Jenkins。
自動化測試總兵——Jenkins
Jenkins是一個開源、免費的可擴展持續集成引擎,主要用于:
- 持續、自動地構建/測試軟件項目;
- 監控一些定時執行的任務。
為了實現測試腳本的自動化運行,我們需要配置JenkinsJob,使Jenkins在設置的觸發條件滿足時,自動搭建測試腳本的運行環境,然后執行測試腳本,最后將測試結果發送給相關人員。因此我們需要了解Jenkins的源碼管理、構建觸發器、構建及郵件通知等設置。
總兵的連招1——源碼管理
Jenkins服務器最基本的作用是監視版本控制器,當版本庫有新的更改時,檢出版本庫中的文件,或者,你可以選擇只是定期檢出版本庫中最新的文件。無論哪種方式,Jenkins與版本控制軟件的集成是必不可少的。
Jenkins開箱即用式支持Git、CVS和SVN,還通過插件與大量其他版本控制工具進行集成,如ClearCase、Perforce、PVCS等等。
不同的版本控制軟件在Jenkins端的需要的配置并不相同,有的甚至差異很大。但是只要你熟悉你所使用的版本控制軟件,那么在Jenkins端,就可以很容易地對版本庫進行配置。
以SVN為例,為了從SVN倉庫中獲取源碼,我們需要提供相應SVN版本庫的URL,在完成URL輸入后,Jenkins會檢查URL的有效性,如果所提供的URL要求身份認證,Jenkins將會自動提示選擇相應的憑據以驗證賬號信息,如下圖所示。
默認情況下,Jenkins會將給定的代碼庫中的文件檢出到JenkinsJob的Workspace中。如果你需要將代碼庫檢出到指定的目錄中,你可以在Localmoduledirectory中輸入你想要的目錄名或相對Workspace的路徑。
如果你需要從多個SVN版本庫中獲取文件,可以點擊“Addmodule...”按鈕,來添加別的版本庫。
總兵的連招2——構建觸發器
常用的構建觸發器有周期性構建和SCM輪詢構建,兩者都是使用相同corn風格語法進行設置,如下圖所示。
我們只需要了解corn風格的語法,就可以方便地進行構建觸發器的設置。corn風格的語法包含五個由空格分隔的字段:
MINUTE HOUR DOM MONTH DOW
每個字段使用下面的值:
MINUTE小時內的分鐘數(0-59)
HOUR一天的小時數(0-23)
DOM本月的天數(1-31)
MONTH月份(1-12)
DOW本周的一天(0-7),其中0和7都是星期日。
要為一個字段指定多個值,可以使用以下操作符:
- “*”代表一個字段的所有可能的值。如,“* * * * *”表示周期為一分鐘;
- 使用“M-N”定義范圍。如,在DOW中“1-5”表示周一到周五;
- 使用“/”定義范圍間隔時間。如,MINUTE字段“*/5”表示每5分鐘;
- 逗號分隔的列表表示有效值。如,MINUTE字段“15,45”表示在每小時的第15和第45分鐘運行;
通常,我們只需要在這個字段中寫一行,但是對于更復雜的調度配置,我們可能需要寫多行。
總兵的連招3——構建
在完成了之前的配置后,Jenkins應該知道在何時從何處獲取測試工程及源碼。現在我們需要做的事情是,告訴Jenkins在獲取測試工程和源碼后該如何做。一般情況下,我們會將之前編寫的測試腳本放在測試工程的版本庫中,或者從專門的測試腳本庫中檢出到JenkinsJob的Workspace中,因此我們在這里只需要執行編寫好的測試腳本即可。
執行腳本的方式可以根據具體腳本的運行環境,選擇執行Shell或Windows批處理命令。因此我們需要簡單地了解Shell或Windows的常用批處理命令。為了避免編寫復雜的批處理命令,我們應盡量把工作放在測試腳本中完成。本文以如下圖所示的簡單的Windows批處理為例,簡單介紹一下構建步驟的編寫。
在上圖中,有兩行命令:
第一行的作用是將目錄由初始的Workspace目錄切換到Workspace下的Script目錄;
第二行的作用是運行Script目錄中的測試腳本Script.py,并為該腳本傳遞一個參數,該參數為Jenkins的環境變量JOB_NAME,即當前JenkinsJob的名稱。
這樣就完成了對測試腳本的調用。
總兵的連招4——郵件通知
自動化測試的一個重要環節,就是將測試結果通知到相關人員,如開發\測試人員,或項目管理人員等。Jenkins對電子郵件提供了開箱即用的支持,我們可以在構建后處理中勾選E-mail Notification,如下圖所示。然后輸入需要通知的人員郵箱,即可使Jenkins在構建完成后,向指定的人員發送一封友好的電子郵件。
如果你想對郵件內容進行高度定制,那么E-mail Notification就無法滿足需求,我們需要安裝可編輯的電子郵件插件Editable Email Notification,來實現電子郵件的定制化工作。
在Editable Email Notification中,我們可以用HTML編寫電子郵件的內容,并引用Jenkins的環境變量,這樣我們就可以在郵件中描述當前JenkinsJob的測試執行概況,讓收件人快速地了解當前的測試狀態。但是這要求我們對HTML和Jenkins環境變量都有比較深的了解。
有些情況下,我們需要在郵件中執行一些數據提取等復雜工作,比如將控制臺輸出中的一些數據在郵件中進行展示,這時我們需要借助email-ext-plugin插件提供的Groovy接口,用Groovy編寫郵件內容。
總之,Jenkins的郵件通知功能非常強大,我們可以在自動化測試的工作中不斷進行探索。
小結
本節簡單介紹了Jenkins的傳統表單類型的FreestyleJob,然而目前Jenkins的發展方向是 Pipeline Job,Jenkins將Pipeline作為優先開發項目。這就意味著Pipeline在應用程序中是作為實體被設計和支持的,而不是通過在Jenkins中連接一堆任務而形成流水線。Pipeline類型的Job可以通過編程實現,可以實現更復雜構建邏輯和工作流,更重要的是在Pipeline中有專門的用于流水線編程的結構化DSL,其可以在工作空間中輕松地實現文件共享功能。同時Pipeline具有全新的Jenkins可視化界面 ——BlueOcean,其為Pipeline的每個階段添加了圖形化的展示,如下圖所示。
因此我們在熟悉了表單類型的 FreestyleJob后,可以嘗試將其轉換為Pipeline的Job,當然目前并非所有的Jenkins插件都支持Pipeline,有些老舊的插件還無法支持Pipeline,我們需要根據實際的工作情況進行Jenkins工程類型的選擇。
攻城總結
古人云:知所不豫,行且通焉。雖然通過本文,我們全面地了解了自動化測試的流程,但是只有在自動化測試的實踐中不斷探索,我們才能真正窺得自動化測試的全貌。北匯信息作為專業的自動化測試服務供應商,也可以為客戶提供優質全面的自動化測試服務。
-
自動化測試
+關注
關注
0文章
204瀏覽量
26895 -
python
+關注
關注
56文章
4783瀏覽量
84473
發布評論請先 登錄
相關推薦
評論