對于如何開展一個Web項目的UI自動化測試,首先需要建立一個自動化測試的小組,小組理想狀态下有4個人員,測試開發、中進階自動化測試工程師、2個初級自動化工程師;非理想的情況下,可能隻需要一個人。
(1)測試開發:
-
基礎答案:
自動化架構的建設,确定自動化架構的設計模式、第三方代碼工具的封裝、中間公共子產品的設計和調用、測試用例、測試套件的管理和執行、測試報告和測試結果的輸出(檔案輸出和郵件通知)
-
可選進階:
如果可能的話,需要搭建持續內建伺服器(CI,Continuous Integration Server)的環境,進行持續傳遞和自動化的冒煙測試等。
-
基本要求:
有自動化方案的實施經驗、有開發背景、以及持續內建的背景等。
(2)中進階自動化測試工程師:
配合測試開發人員,實施測試架構的建設。主要負責中間公共子產品的實作和執行個體化等,以及部分高難度和流程複雜的自動化用例腳本編寫和調試等工作。
- 基本要求:有參與過自動化方案的建設、腳本編寫經驗豐富、會代碼調試、懂Web測試等。
(3)初級自動化測試工程師:
根據中間公共子產品的設計,進行執行個體化公共子產品、方法組合,實作自動化用例腳本的編寫。
- 基本要求:有計算機程式設計思維、有代碼經驗、可以讀懂腳本和HTML等
(4)若隻有一個人:
首先能夠實作自動化用例的維護和執行。在這個基礎上不斷的抽取實作公共子產品的設計以及測試報告的生成等工作。通過經驗的積累,以及後續人員的補充,早日做好自動化架構的建設工作。
技術選擇:
Selenium WebDriver、Python(unittest) Java(JUnit)、CI Server
技術方案:
選擇 Python + Selenium 的技術方案。
首先技術工具是免費的,Python的工具用PyCharm社群版,Selenium的WebDriver是開源工具。利用比較簡潔的Python語言進行自動化測試,對于人員的學習成本來講比較實用,學習時間短,有優勢。
另外Python自帶的unittest單元測試架構可以很友善的實作自動化用例的設計和執行以及自動化用例套件的管理等任務。Python是純面向對象的語言,後續也可以過渡到Java + Selenium進行更加豐富的自動化測試。
此外,可以選擇Jenkins作為持續內建伺服器,配合Python+Selenium的方案進行自動化冒煙測試。
适合自動化的項目子產品:
1、任務測試明确,不會頻繁變動
2、每日建構後的測試驗證
3、比較頻繁的回歸測試
4、軟體系統界面穩定,變動少
5、需要在多平台上運作的相同測試案例、組合周遊型的測試、大量的重複任務
6、軟體維護周期長
7、項目進度壓力不太大
8、被測軟體系統開發比較規範,能夠保證系統的可測試性
9、具備大量的自動化測試平台
10、測試人員具備較強的程式設計能力
硬體:
硬體的要求不高,主要需要獨立的測試環境。另外測試人員用的電腦最好是Windows桌面作業系統,需要安裝Firefox浏覽器,避免47.0的最新版本。測試人員最好也使用Chrome浏覽器輔助進行Web元素的定位。
01、Selenium 學習總結
Selenium IDE (火狐的插件)
- 錄制局部腳本
- 修改編輯腳本(插入指令、注釋)
- 3導出腳本(支援 C#、Java、Python、Ruby)
單元測試架構
- C# : NUnit
- Java: JUnit | TestNG
- Python:unittest
- Ruby:test-unit
02、學習研究 WebDriver
Python + Selenium WebDriver
01、搭建環境步驟
- 安裝 python3.x (windows xp 不支援 python3.5+)
- 設定環境變量 path(安裝時候也可以解決 勾上 add python.ext to path)
-
安裝Selenium
用pip指令安裝 pip install -U selenium
有無問題?
- 路徑,pip可能定位不到,pip也可能定位到别的檔案夾(perl)
方案:cd c:\python34\scripts
-
外網ip問題
交換機的原因,區域網路裡面是同一個ip,造成安裝逾時
- 火狐的版本 46.0以及以下
- windows 7 x64以上的系統,需要用管理者模式運作cmd,否則會安裝失敗
02、普通的使用
定位方式
by id, name, class_name, tag_name, css_selector, xpath, link_text, partial_link_text
主要用的是:
id,name, css_selector, xpath, link_text
滑鼠的操作
- 定位的問題:有無問題?
a <frame>
f1 = find_element_by_css_selector(frame)
switch_to.frame(f1)
b <select>
s1 = find_element_by_css_selector(select)
ss1 = Select(s1)
ss1.select_by_index(0)
ss1.select_by_value("人事部")
c 編碼問題 utf-8
d 時間等待問題 sleep(5)
單元測試架構:unittest
- 解決了什麼問題?
unittest.TestCase
前置條件
清理
測試過程步驟
斷言 assertEqual(期望值, 實際結果, 錯誤提示)
運作測試 test_開頭的方法
unittest.TestSuite
addTest(xxx("test_batch_login"))
自定義的添加測試用例,并執行
unittest.TextTestRunner
run(suite)
執行建立并維護好的測試套件
test_runner test_suite test_case
測試運作器 測試套件 測試用例
子產品化操作
面向對象的實踐:
- 編寫一個類,類裡面描述公共的方法
- 執行個體化這個類,調用這個類的方法
有無問題?
-
類的構造方法,需要傳遞 webdriver.Firefox()
self.common = RanzhiCommon(self.browser, self.base_url)
資料驅動測試
- 讀取csv,循環每一行資料進行操作
- 讀取MySQL,用例存到MySQL中
1. 中文編碼的問題。
# coding="utf-8"
讀csv的時候,添加 encoding='utf-8'
csv.reader(open("xxx.csv", "r", -1, encoding="utf-8")
2. 循環放到最外層
3. 檔案路徑在控制台讀取不到的問題,需要用絕對路徑來指向檔案
- 避免第三方代碼的威脅,防止大批量修改測試用例
- 節約人力的成本(如果封裝以後,不需要每個自動化測試工程師都會WebDriver)
- 标準化自動化用例的操作,隻需要調用公共的标準子產品就好