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