Python 領(lǐng)域運(yùn)用之:自動(dòng)化測(cè)試
1. 自動(dòng)化測(cè)試簡(jiǎn)介
1.1 手工測(cè)試
手工測(cè)試是由人逐個(gè)的輸入測(cè)試用例,然后觀(guān)察程序運(yùn)行結(jié)果,和預(yù)期結(jié)果進(jìn)行比對(duì)。人工測(cè)試是一種低效的測(cè)試方法,對(duì)程序進(jìn)行修改后,都需要人工重新執(zhí)行測(cè)試用例,屬于典型的重復(fù)勞動(dòng)。
根據(jù) 51testing 的《中國(guó)軟件測(cè)試從業(yè)人員調(diào)查報(bào)告》,在軟件項(xiàng)目的測(cè)試環(huán)節(jié),手工測(cè)試占到 89%,相對(duì)開(kāi)發(fā)來(lái)說(shuō),測(cè)試的門(mén)檻底,薪資普遍較底,所要求的知識(shí)面雖然有一定廣度,但缺乏深度。
因?yàn)槭止y(cè)試人門(mén)檻不高,使大量的畢業(yè)生、甚至是非專(zhuān)業(yè)人員涌入這個(gè)行業(yè),從而加劇了這個(gè)行業(yè)的激烈競(jìng)爭(zhēng)。對(duì)于工作幾年仍處于手工測(cè)試的人員來(lái)說(shuō),都會(huì)有強(qiáng)烈的危機(jī)感。由于工作的技術(shù)含量不高,薪資的漲幅遇到瓶頸,另一方面受到新進(jìn)入者的威脅,公司花 5K 招來(lái)的人能夠勝任測(cè)試工作,那么就不會(huì)花 8K 招聘人做同樣的工作。
因此,從自身的發(fā)展來(lái)說(shuō),測(cè)試人員非常需要通過(guò)自動(dòng)化技術(shù)來(lái)增加自己有競(jìng)爭(zhēng)力。
1.2 自動(dòng)化測(cè)試
自動(dòng)化測(cè)試是通過(guò)編寫(xiě)腳本的方式模擬手工測(cè)試的過(guò)程。通過(guò)運(yùn)行腳本來(lái)執(zhí)行測(cè)試用例,代替人工對(duì)系統(tǒng)的功能進(jìn)行驗(yàn)證,從而節(jié)省了大量的人力。
一切通過(guò)工具的方式來(lái)代替或輔助手工測(cè)試的行為都可以看做自動(dòng)化,包括性能測(cè)試、接口測(cè)試等,但凡用到測(cè)試工具的測(cè)試都稱(chēng)為自動(dòng)化測(cè)試。
自動(dòng)化測(cè)試得到廣泛的應(yīng)用,在招聘測(cè)試職位時(shí),都需要自動(dòng)化測(cè)試經(jīng)驗(yàn)。在計(jì)算機(jī)專(zhuān)業(yè)招聘網(wǎng)站,以 “自動(dòng)化測(cè)試” 作為關(guān)鍵字進(jìn)行搜索,能夠搜索到大量的職位,如下圖所示:
1.3 自動(dòng)化測(cè)試的優(yōu)點(diǎn)和缺點(diǎn)
自動(dòng)測(cè)試的優(yōu)點(diǎn):
- 避免測(cè)試人員因重復(fù)勞動(dòng)產(chǎn)生厭倦
- 提高測(cè)試效率
- 保證每次測(cè)試地一致性和可重復(fù)性
- 更好的利用無(wú)人值守時(shí)間
- 能夠進(jìn)行一些手工無(wú)法進(jìn)行的測(cè)試
自動(dòng)測(cè)試的缺點(diǎn):
- 編寫(xiě)和維護(hù)自動(dòng)化測(cè)試程序需要花費(fèi)成本
- 部分測(cè)試工作還是依賴(lài)手工測(cè)試
2. 自動(dòng)化測(cè)試的前提條件
2.1 適合采用自動(dòng)化測(cè)試
考慮否采用自動(dòng)化測(cè)試,需要從三個(gè)方面進(jìn)行權(quán)衡:
- 軟件需求變動(dòng)不頻繁
測(cè)試腳本的穩(wěn)定性決定了自動(dòng)化測(cè)試的維護(hù)成本。如果軟件需求變動(dòng)過(guò)于頻繁,測(cè)試人員需要根據(jù)變動(dòng)的需求來(lái)更新測(cè)試用例以及相關(guān)的測(cè)試腳本,而腳本的維護(hù)本身就是一個(gè)代碼開(kāi)發(fā)的過(guò)程,需要修改、調(diào)試,必要的時(shí)候還要修改自動(dòng)化測(cè)試的框架。如果開(kāi)發(fā)、維護(hù)測(cè)試腳本的成本高于利用其節(jié)省的測(cè)試成本,即投入產(chǎn)出比太高,那么自動(dòng)化測(cè)試就失去了意義。
項(xiàng)目中的某些模塊相對(duì)穩(wěn)定,而某些模塊需求變動(dòng)性很大。我們便可對(duì)相對(duì)穩(wěn)定的模塊進(jìn)行自動(dòng)化測(cè)試,而變動(dòng)較大的仍是用手工測(cè)試。
- 項(xiàng)目周期足夠長(zhǎng)
軟件測(cè)試包含有如下環(huán)節(jié):
- 自動(dòng)化測(cè)試需求的確定
- 自動(dòng)化測(cè)試框架的設(shè)計(jì)
- 自動(dòng)測(cè)試腳本的編寫(xiě)與調(diào)試
這樣的過(guò)程本身就是一個(gè)測(cè)試軟件的開(kāi)發(fā)過(guò)程,需要較長(zhǎng)的時(shí)間來(lái)完成。如果項(xiàng)目的周期比較短,沒(méi)有足夠的時(shí)間去支持這樣一個(gè)過(guò)程,則無(wú)法實(shí)施自動(dòng)化測(cè)試。
- 自動(dòng)化測(cè)試腳本可重復(fù)使用
通常情況下,專(zhuān)職的測(cè)試人員對(duì)多個(gè)產(chǎn)品進(jìn)行測(cè)試,需要考慮自動(dòng)化測(cè)試腳本能否重復(fù)使用:
- 所測(cè)試的項(xiàng)目之間是否很大的差異性
- 所選擇的測(cè)試工具是否適應(yīng)這種差異
如果測(cè)試腳本的重復(fù)使用率很低,致使其間所耗費(fèi)的成本大于所創(chuàng)造的價(jià)值,自動(dòng)化測(cè)試就失去了意義。
- 敏捷開(kāi)發(fā)、頻繁的版本迭代
敏捷開(kāi)發(fā),增量式開(kāi)發(fā),持續(xù)集成項(xiàng)目由于這種開(kāi)發(fā)模式是頻繁的發(fā)布新版本,需要頻繁的回歸測(cè)試,自動(dòng)化能把能從回歸測(cè)試中解脫出來(lái)測(cè)試新的功能。
2.2 不適合采用自動(dòng)化測(cè)試
如果項(xiàng)目具備如下特征,則不適合做自動(dòng)化測(cè)試:
- 被測(cè)系統(tǒng)或需求不穩(wěn)定
在自動(dòng)化測(cè)試用例的更新、維護(hù)、調(diào)試的頻率太高,自動(dòng)化測(cè)試完全得不償失。
- 項(xiàng)目時(shí)間非常緊張
建自動(dòng)化測(cè)試框架,開(kāi)發(fā)測(cè)試腳本需要時(shí)間,對(duì)時(shí)間比較緊張的項(xiàng)目可以先不考慮自動(dòng)化。
- 項(xiàng)目周期很短
測(cè)試腳本不能得到重復(fù)的利用,不值得花精力去進(jìn)行自動(dòng)化測(cè)試。
- 涉及人的感觀(guān)、物理交互等方面的測(cè)試
易用性測(cè)試、需要人的主觀(guān)判斷,涉及物理交互,自動(dòng)化工具無(wú)法完成與物理設(shè)備的交互,例如打印、攝像等操作,不適合采用自動(dòng)化測(cè)試。
4. 主流自動(dòng)化測(cè)試框架
4.1 PyUnit 單元測(cè)試框架
PyUnit 是 Python 內(nèi)置的 Python 單元測(cè)試框架(The Python unit testing framework),可對(duì)程序中的最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證。它的主要特點(diǎn)如下:
- 內(nèi)置的標(biāo)準(zhǔn)模塊,在 Python 3 中,PyUnit 是標(biāo)準(zhǔn)模塊,安裝 Python 后引入 unittest 模塊即可使用
- PyUnit 是 JUnit 的衍生產(chǎn)品,其工作原理與其他 JUnit 框架十分類(lèi)似,熟悉 JUnit 的開(kāi)發(fā)者可以很快上手
- 能夠以簡(jiǎn)單的方式運(yùn)行單個(gè)測(cè)試用例
- 能夠快速的生成各種測(cè)試報(bào)告
PyUnit 是 Kent Beck 和 Erich Gamma 設(shè)計(jì)的 JUnit 的 Python 版本,是 JUnit 的衍生產(chǎn)品,在工作原理、命名規(guī)則上保留了很多 Java 語(yǔ)言的特征。例如,PyUnit 要求所有的測(cè)試用例都必須繼承于 TestCast,示例如下:
#!/usr/bin/python3
import unittest
def add(a, b):
return a + b
def sub(a, b):
return a - b
class MathTest(unittest.TestCase):
def testAdd(self):
self.assertEqual(add(1, 1), 2)
def testSub(self):
self.assertEqual(sub(2, 1), 1)
unittest.main()
- 定義了類(lèi) MathTest,繼承于 unittest.TestCase
- 定義了測(cè)試用例 testAdd,測(cè)試函數(shù) add
- 定義了測(cè)試用例 testSub,測(cè)試函數(shù) sub
4.2 PyTest 測(cè)試框架
Pytest 是一個(gè)第三方單元測(cè)試框架,比內(nèi)置的 PyUnit 更簡(jiǎn)潔和高效,Pytest 主要特點(diǎn)有以下幾點(diǎn):
- 簡(jiǎn)單靈活,容易上手,測(cè)試的可讀性強(qiáng)
- 支持參數(shù)化,可以細(xì)粒度地控制要測(cè)試的測(cè)試用例
- 能夠支持單元測(cè)試、集成測(cè)試、功能測(cè)試、接口測(cè)試多種類(lèi)型
- Pytest 具有豐富的第三方插件,并且可以自定義擴(kuò)展,例如如 pytest-selenium(集成selenium)、pytest-html(完美html測(cè)試報(bào)告生成)等
- 可以很好的和 CI 工具結(jié)合,例如 jenkins
與其它測(cè)試框架相比 Pytest 簡(jiǎn)單易學(xué),舉例如下:
def add(a, b):
return a + b
def sub(a, b):
return a - b
def test_add():
assert add(1, 1) == 2
def test_sub():
assert sub(2, 1) == 1
- 定義了函數(shù) test_add,它測(cè)試函數(shù) add 的功能
- 定義了函數(shù) test_sub,它測(cè)試函數(shù) sub 的功能
- 運(yùn)行 pytest ,發(fā)現(xiàn)所有名稱(chēng)以 test_ 為前綴的函數(shù)、并運(yùn)行
憑借著其開(kāi)源和易學(xué)的特點(diǎn),該工具被質(zhì)量分析團(tuán)隊(duì)、開(kāi)發(fā)團(tuán)隊(duì)、個(gè)人團(tuán)隊(duì)、以及各種開(kāi)源項(xiàng)目廣泛使用。許多大型互聯(lián)網(wǎng)應(yīng)用,如 Dropbox 和 Mozilla,均采用 Pytest。
4.3 Robot 測(cè)試框架
Robot Framework 是一個(gè)基于 Python 的,可擴(kuò)展的關(guān)鍵字驅(qū)動(dòng)的測(cè)試自動(dòng)化框架,主要被用在測(cè)試驅(qū)動(dòng) (test-driven)類(lèi)型的開(kāi)發(fā)與驗(yàn)收中。
Robot Framework 具有高度模塊化的架構(gòu),用戶(hù)通過(guò)編寫(xiě) Python 腳本擴(kuò)展功能,如下圖所示:
- 測(cè)試數(shù)據(jù) (Test Data) 是簡(jiǎn)單、易于編輯表格格式
- 啟動(dòng) Robot Framework 時(shí),它會(huì)處理測(cè)試數(shù)據(jù),執(zhí)行測(cè)試用例并生成日志和報(bào)告
- 測(cè)試庫(kù) (Test library) 可以直接使用應(yīng)用程序接口
Robot Framework 具有如下優(yōu)點(diǎn):
-
通過(guò)使用關(guān)鍵字驅(qū)動(dòng)測(cè)試的方法,幫助測(cè)試人員創(chuàng)建具有可讀性的測(cè)試用例,進(jìn)而簡(jiǎn)化了整個(gè)自動(dòng)化的過(guò)程。
-
啟用易于使用的表格語(yǔ)法,以統(tǒng)一的方式創(chuàng)建測(cè)試用例。
-
提供易于閱讀的結(jié)果報(bào)告和 HTML 格式的日志。
-
提供一個(gè)簡(jiǎn)單的庫(kù) API,可以使用 Python 創(chuàng)建自定義測(cè)試庫(kù)。
4.4 Selenium Web 應(yīng)用程序測(cè)試
Selenium 是一個(gè)用于 Web 應(yīng)用程序測(cè)試的工具,它使用 JavaScript 模擬真實(shí)用戶(hù)對(duì)瀏覽器進(jìn)行操作。Selenium 支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。
Selenium 支持使用 Python 語(yǔ)言編寫(xiě)動(dòng)作測(cè)試腳本,測(cè)試腳本執(zhí)行時(shí),瀏覽器自動(dòng)按照腳本代碼做出點(diǎn)擊、輸入、打開(kāi)、驗(yàn)證等操作,就像真實(shí)用戶(hù)所做的一樣,從終端用戶(hù)的角度測(cè)試應(yīng)用程序。
用戶(hù)使用 Python 編寫(xiě)測(cè)試腳本:
- 測(cè)試應(yīng)用程序的瀏覽器兼容性,驗(yàn)證應(yīng)用程序是否能夠工作在不同瀏覽器和操作系統(tǒng)之上
- 創(chuàng)建回歸測(cè)試檢驗(yàn)軟件功能和用戶(hù)需求
Selenium 主要用于測(cè)試 Web 應(yīng)用程序,學(xué)習(xí) web 自動(dòng)化測(cè)試前,需要補(bǔ)充 Web 相關(guān)的知識(shí),包括:
- HTTP 協(xié)議
- HTML 的基礎(chǔ)知識(shí),如何使用 Javascript 操縱 DOM
- Firebug 或者 Chrome 開(kāi)發(fā)者工具的使用,用于抓取元素