網(wǎng)站做百度推廣搜狐綜合小時報(bào)2022113011
汽車軟件開發(fā)自動化測試攻略
隨著軟件開發(fā)在造車行業(yè)中占有越來越重要的地位,敏捷開發(fā)的思想在造車領(lǐng)域中也逐漸地被重視起來,隨之而來的是整車廠對自動化測試需求越來越強(qiáng)烈。本文結(jié)合北匯在自動化測試方面的豐富經(jīng)驗(yàn),簡單介紹一下實(shí)施自動化測試可能需要具備的技能及具體實(shí)踐流程。
自動化測試城門-Python
要實(shí)現(xiàn)完全的自動化測試,我們首先要做的是先實(shí)現(xiàn)半自動化測試,即編寫自動化測試腳本。俗話說 Life is short,I use Python,Python,作為一種簡單易上手的高級編程語言,憑借其“無所不包”的庫,成為測試腳本開發(fā)的不二之選。這里簡單介紹一下,測試腳本開發(fā)常用的一些Python標(biāo)準(zhǔn)庫。
城門士卒-os庫
在編寫測試腳本時,不可避免地會遇到對文件路徑的獲取及編輯,os庫里的path函數(shù)
可以方便地實(shí)現(xiàn)這些操作,如絕對路徑獲取os.path.abspath()、路徑拼接os.path.join()、路徑存在判斷os.path.exist()等;如果你需要在Python中運(yùn)行測試工具提供的命令,那么os庫的system函數(shù)或popen函數(shù)
可以讓你方便地調(diào)用cmd(Windows)或shell(Linux)。
· 城門士卒-sys庫
如果你所編寫的測試腳本有跨平臺運(yùn)行的需求,那么你可以通過sys庫的platform函數(shù)
獲取腳本的運(yùn)行環(huán)境。根據(jù)運(yùn)行環(huán)境的不同,編寫不同的批處理命令;sys庫中的argv函數(shù),還可以為你的測試腳本提供簡單的命令行接口,當(dāng)你的腳本需要接收外部傳遞的參數(shù)時,你可以通過sys.argv[]方便地獲取。而如果你需要編寫更復(fù)雜更友好的命令行接口,你需要使用Python的另外一個標(biāo)準(zhǔn)庫argparse
來實(shí)現(xiàn)。
· 城門隊(duì)長-re庫
正則表達(dá)式是編寫測試腳本的必備技能,因?yàn)橛袝r我們會遇到復(fù)雜的文本處理,如在工程文件中查找需要修改的配置,并將其修改為我們所需要的內(nèi)容。此時一般的查找替換函數(shù)
就很難實(shí)現(xiàn)這個功能,我們只能借助強(qiáng)大的re庫
(正則表達(dá)式)來解決這個棘手的問題。re庫提供的函數(shù)有:
re.compile():編譯 正則表達(dá)式
,生成一個 Pattern 對象;
re.findall():搜索所有滿足條件的字符串;
re.match():從第一個字符開始匹配模式;
re.search():搜索第一個滿足條件的字符串,查找到第一個停止;
re.sub():替換滿足條件的字符串。
在使用re模塊時,我們一般先用re.compile()將正則表達(dá)式編譯生成為一個Pattern對象,然后再基于這個對象進(jìn)行findall、match等操作,這樣既可以提高代碼的可讀性,也可以提高代碼的運(yùn)行效率。
使用正則表達(dá)式進(jìn)行查找替換是很方便的,但是在很多時候我們需要在匹配的字符串前后添加內(nèi)容,并且保留匹配的內(nèi)容,這時普通的查找替換是難以實(shí)現(xiàn)的。
現(xiàn)在我也找了很多測試的朋友,做了一個分享技術(shù)的交流群,共享了很多我們收集的技術(shù)文檔和視頻教程。
如果你不想再體驗(yàn)自學(xué)時找不到資源,沒人解答問題,堅(jiān)持幾天便放棄的感受
可以加入我們一起交流。而且還有很多在自動化,性能,安全,測試開發(fā)等等方面有一定建樹的技術(shù)大牛
分享他們的經(jīng)驗(yàn),還會分享很多直播講座和技術(shù)沙龍
可以免費(fèi)學(xué)習(xí)!劃重點(diǎn)!開源的!!!
qq群號:691998057【暗號:csdn999】
如:希望將hour: minute格式后添加:00,形成hour: minute: seconds這種格式。此時可以采用如下方式來實(shí)現(xiàn):
查找的正則表達(dá)式:
(\d:\d)
替換為:
\1\:00
這里,我們在替換的字符中使用\1,來引用正則表達(dá)式中第一個分組匹配到的內(nèi)容,如果正則表達(dá)式中有多個分組,可以依次使用\2\3等進(jìn)行引用,可以使用\0來引用整個正則表達(dá)式的內(nèi)容。
· 小結(jié)
在掌握了Python基礎(chǔ)語法和這三個標(biāo)準(zhǔn)庫后,自動化測試的大門就為我們敞開了。但是想要編寫一個可以驅(qū)動測試工具進(jìn)行測試的腳本,我們還需要了解測試工具在headless模式【1】下的接口情況,如果工具提供的接口豐富,可以實(shí)現(xiàn)在headless模式下對測試工程進(jìn)行配置和執(zhí)行等操作,那么我們的測試腳本
開發(fā)工作將會順利地進(jìn)行。
但是如果工具提供的headless模式接口有限,無法滿足測試腳本的需求,那么進(jìn)入自動化測試大門后,等待我們的就是另一個棘手的問題:如何對工程文件進(jìn)行解析與修改??紤]到大部分的工程文件都是XML格式的,因此后續(xù)我們就簡單介紹一下如何通過Python解析和修改XML文件。
【1】:這里的headless模式是指在不使用工具GUI的情況下,以純命令行的方式進(jìn)行工具使用的模式。
自動化測試甕城——XML文件
· 甕城守備——XML解析
在Python的標(biāo)準(zhǔn)庫中,有專門處理XML文件的庫,無需安裝第三方庫就可以使用Python進(jìn)行XML文件的解析,但是要想準(zhǔn)確地從XML文件中解析出想要的信息,我們首先需要簡單了解一下XML的文件結(jié)構(gòu)。如下是一個簡單的XML文檔。
<bookstore>
<book category="COOKING"><title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price>
</book>
<book category="CHILDREN"><title lang ="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price>
</book>
<book category="WEB"><title lang ="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price>
</book>
</bookstore>
其中Harry Potter元素的結(jié)構(gòu)如下圖所示:
圖片來源于https://www.w3school.com.cn/xml/xml_tree.asp
在該XML文本中,根元素是 <bookstore>,文檔中的所有 <book> 元素都被包含在 <bookstore> 里。<book> 元素有 4 個子元素:<title>、< author>、<year>、<price>。每個子元素都包含一個文本內(nèi)容,但只有子元素title和元素book擁有屬性。
我們在解析XML時,一般需要獲取的就是元素的屬性值以及元素的文本內(nèi)容。以下我們就簡單介紹一下,如何通過python獲取元素的屬性值及文本內(nèi)容。
Python的XML庫提供了一個通過標(biāo)簽名稱獲取元素的函數(shù) getElementsByTagName(),該函數(shù)返回的是一個包含元素對象的list,通過調(diào)用元素對象的attributes方法,我們就可以方便地獲取元素的屬性值。如,我們可以使用如下命令獲取XML文件中第一個標(biāo)簽為title的lang屬性值:
root.getElementsByTagName("title")[0].attributes.getNamedItem("lang").nodeValue
獲取第一個標(biāo)簽為title的元素的文本信息的代碼如下:
root.getElementsByTagName("title")[0].firstChild.data
· 甕城參將
——XML修改
XML元素的屬性和文本內(nèi)容修改很簡單,在上小節(jié)中獲取對應(yīng)的元素信息后,直接對其進(jìn)行賦值即可。但是,修改后的信息保存在XML對象中。要完成對實(shí)際XML文件的修改,我們還需要用XML對象中的內(nèi)容覆蓋原有的XML文件,這一步存在很多棘手的問題。
在XML文件中,為了避免元素文本內(nèi)容中存在的特殊字符引起解析器錯誤,在文本內(nèi)容中引入實(shí)體引用來替代可能導(dǎo)致錯誤的字符,如回車
、雙引號"、單引號'。如果使用python的xml.dom.minidom庫解析并使用writexml輸出XML文件,該庫會將這些實(shí)體引用轉(zhuǎn)義為其實(shí)際字符進(jìn)行保存。如果不對XML對象中的內(nèi)容進(jìn)行處理,導(dǎo)出的XML文件將會存在很多錯誤。
為了避免這個情況的出現(xiàn),我們需要使用之前小節(jié)介紹的正則表達(dá)式將這些字符再替換為其實(shí)體引用。這個過程需要我們能熟練使用正則表達(dá)式進(jìn)行文本查找與替換。
除了XML文件中的實(shí)體引用外,如果XML文件中存在中文字符,那么還有一個需要注意的事情:不要使用with open as
的方式讀寫XML文件,要使用open指定文件
的編碼為 'utf-8' 的方式,對XML文件進(jìn)行寫入。如下所示:
f = open(self.JenkinsJobXMLPath, 'w', encoding="utf-8")
dom.writexml(f, indent='', addindent='\t', newl='', encoding='utf-8')
f.close()
· 小結(jié)
上述兩個問題是修改XML文件時普遍會遇到的問題。解決了這兩個問題,我們基本上就可以完美實(shí)現(xiàn)XML文件的修改了。此時,我們就可以編寫自動化程度更高的測試腳本,然而我們依然無法實(shí)現(xiàn)完全的自動化測試,因?yàn)槲覀內(nèi)匀恍枰謩拥厝?zhí)行測試腳本。那么,我們該如何實(shí)現(xiàn)測試腳本的自動執(zhí)行呢?這就需要我們打通自動化測試的最后一個關(guān)卡,Jenkins。
自動化測試總兵——Jenkins
Jenkins 是一個開源、免費(fèi)的可擴(kuò)展持續(xù)集成引擎
,主要用于:
持續(xù)、自動地構(gòu)建/測試軟件項(xiàng)目;
監(jiān)控一些定時執(zhí)行的任務(wù)。
為了實(shí)現(xiàn)測試腳本的自動化運(yùn)行,我們需要配置Jenkins Job,使Jenkins在設(shè)置的觸發(fā)條件滿足時,自動搭建測試腳本的運(yùn)行環(huán)境,然后執(zhí)行測試腳本,最后將測試結(jié)果發(fā)送給相關(guān)人員。因此我們需要了解Jenkins的源碼管理、構(gòu)建觸發(fā)器、構(gòu)建及郵件通知等設(shè)置。
· 總兵的連招1——源碼管理
Jenkins服務(wù)器最基本的作用是監(jiān)視版本控制器,當(dāng)版本庫
有新的更改時,檢出版本庫中的文件,或者,你可以選擇只是定期檢出版本庫中最新的文件。無論哪種方式,Jenkins與版本控制軟件
的集成是必不可少的。
Jenkins開箱即用
式支持Git、CVS和SVN,還通過插件與大量其他版本控制工具進(jìn)行集成,如ClearCase、Perforce、PVCS等等。
不同的版本控制軟件在Jenkins端的需要的配置并不相同,有的甚至差異很大。但是只要你熟悉你所使用的版本控制軟件,那么在Jenkins端,就可以很容易地對版本庫進(jìn)行配置。
以SVN為例,為了從SVN倉庫中獲取源碼,我們需要提供相應(yīng)SVN版本庫的URL,在完成URL輸入后,Jenkins會檢查URL的有效性,如果所提供的URL要求身份認(rèn)證,Jenkins將會自動提示選擇相應(yīng)的憑據(jù)以驗(yàn)證賬號信息,如下圖所示。
默認(rèn)情況下,Jenkins會將給定的代碼庫中的文件檢出到Jenkins Job的Workspace中。如果你需要將代碼庫檢出到指定的目錄中,你可以在Local module directory
中輸入你想要的目錄名或相對Workspace的路徑。
如果你需要從多個SVN版本庫中獲取文件,可以點(diǎn)擊“Add module ...”按鈕,來添加別的版本庫。
· 總兵的連招2
——構(gòu)建觸發(fā)器
常用的構(gòu)建觸發(fā)器有周期性構(gòu)建
和SCM輪詢構(gòu)建,兩者都是使用相同corn風(fēng)格語法進(jìn)行設(shè)置,如下圖所示。
我們只需要了解corn風(fēng)格
的語法,就可以方便地進(jìn)行構(gòu)建觸發(fā)器的設(shè)置。corn風(fēng)格的語法包含五個由空格分隔的字段:
MINUTE HOUR DOM MONTH DOW
每個字段使用下面的值:
MINUTE 小時內(nèi)的分鐘數(shù)(0-59)
HOUR 一天的小時數(shù)(0-23)
DOM 本月的天數(shù)(1-31)
MONTH 月份(1-12)
DOW 本周的一天(0-7),其中0和7都是星期日
要為一個字段指定多個值,可以使用以下操作符:
“*”代表一個字段的所有可能的值。如,“* * * * *”表示周期為一分鐘;
使用“M-N”定義范圍。如,在DOW中“1-5”表示周一到周五;
使用“/”定義范圍間隔時間。如,MINUTE字段“*/5”表示每5分鐘;
逗號分隔的列表表示有效值。如,MINUTE字段“15,45”表示在每小時的第15和第45分鐘運(yùn)行;
通常,我們只需要在這個字段中寫一行,但是對于更復(fù)雜的調(diào)度配置,我們可能需要寫多行。
· 總兵的連招3
——構(gòu)建
在完成了之前的配置后,Jenkins應(yīng)該知道在何時從何處獲取測試工程及源碼?,F(xiàn)在我們需要做的事情是,告訴Jenkins在獲取測試工程和源碼后該如何做。一般情況下,我們會將之前編寫的測試腳本放在測試工程的版本庫中,或者從專門的測試腳本庫中檢出到Jenkins Job的Workspace中,因此我們在這里只需要執(zhí)行編寫好的測試腳本即可。
執(zhí)行腳本的方式可以根據(jù)具體腳本的運(yùn)行環(huán)境,選擇執(zhí)行Shell或Windows批處理命令。因此我們需要簡單地了解Shell或Windows的常用批處理命令。為了避免編寫復(fù)雜的批處理命令,我們應(yīng)盡量把工作放在測試腳本中完成。本文以如下圖所示的簡單的Windows批處理為例,簡單介紹一下構(gòu)建步驟的編寫。
在上圖中,有兩行命令:
第一行的作用是將目錄由初始的Workspace目錄切換到Workspace下的Script目錄;
第二行的作用是運(yùn)行Script目錄中的測試腳本Script.py,并為該腳本傳遞一個參數(shù),該參數(shù)為Jenkins的環(huán)境變量JOB_NAME,即當(dāng)前Jenkins Job的名稱。
這樣就完成了對測試腳本的調(diào)用。
· 總兵的連招4——郵件通知
自動化測試的一個重要環(huán)節(jié),就是將測試結(jié)果通知到相關(guān)人員,如開發(fā)\測試人員,或項(xiàng)目管理人員等。Jenkins對電子郵件提供了開箱即用的支持,我們可以在構(gòu)建后處理中勾選E-mail Notification,如下圖所示。然后輸入需要通知的人員郵箱,即可使Jenkins在構(gòu)建完成后,向指定的人員發(fā)送一封友好的電子郵件。
如果你想對郵件內(nèi)容進(jìn)行高度定制,那么E-mail Notification就無法滿足需求,我們需要安裝可編輯的電子郵件插件Editable Email Notification,來實(shí)現(xiàn)電子郵件的定制化工作。
在Editable Email Notification中,我們可以用HTML編寫電子郵件的內(nèi)容,并引用Jenkins的環(huán)境變量,這樣我們就可以在郵件中描述當(dāng)前Jenkins Job的測試執(zhí)行概況,讓收件人快速地了解當(dāng)前的測試狀態(tài)。但是這要求我們對HTML和Jenkins環(huán)境變量都有比較深的了解。
有些情況下,我們需要在郵件中執(zhí)行一些數(shù)據(jù)提取等復(fù)雜工作,比如將控制臺輸出中的一些數(shù)據(jù)在郵件中進(jìn)行展示,這時我們需要借助email-ext-plugin插件提供的Groovy接口,用Groovy編寫郵件內(nèi)容。
總之,Jenkins的郵件通知功能非常強(qiáng)大,我們可以在自動化測試的工作中不斷進(jìn)行探索。
小結(jié)
本節(jié)簡單介紹了Jenkins的傳統(tǒng)表單類型的Freestyle Job,然而目前Jenkins的發(fā)展方向是 Pipeline Job,Jenkins將Pipeline作為優(yōu)先開發(fā)項(xiàng)目。這就意味著Pipeline在應(yīng)用程序中是作為實(shí)體被設(shè)計(jì)和支持的,而不是通過在Jenkins中連接一堆任務(wù)而形成流水線。Pipeline類型的Job可以通過編程實(shí)現(xiàn),可以實(shí)現(xiàn)更復(fù)雜構(gòu)建邏輯和工作流,更重要的是在Pipeline中有專門的用于流水線編程的結(jié)構(gòu)化DSL,其可以在工作空間中輕松地實(shí)現(xiàn)文件共享功能。同時Pipeline具有全新的Jenkins可視化界面 ——Blue Ocean,其為Pipeline的每個階段添加了圖形化的展示,如下圖所示。
因此我們在熟悉了表單類型的 Freestyle Job后,可以嘗試將其轉(zhuǎn)換為Pipeline的Job,當(dāng)然目前并非所有的Jenkins插件都支持Pipeline,有些老舊的插件還無法支持Pipeline,我們需要根據(jù)實(shí)際的工作情況進(jìn)行Jenkins工程類型的選擇。
end今天的分享就到處結(jié)束了!底贊關(guān)注不迷路!