Web UI 自動化測試方案(超級干貨)看完不會你找我

項目討論

一吨拗、項目中符合自動化測試的部分有哪些?(目標和范圍 scope婿斥, 準入準出標準)

1劝篷、穩(wěn)定的需求點、變動較少的頁面
2民宿、每日構建后的測試驗證 daily build
3娇妓、比較頻繁的回歸測試
4、需要在多平臺上運行的相同測試案例活鹰、組合遍歷型的測試哈恰、大量的重復任務
二、自動化用例在整個項目的測試用例的覆蓋率
1志群、一般的要求 50% +
2着绷、重點的要求 80% +
3、根據(jù)項目的具體要求锌云,變動特別大的項目需要額外單獨考慮覆蓋率

本文純干貨荠医,自備飲料免得自己[噎住] ( *⊙~⊙)

加入我們,642830685桑涎,群子漩。領取最新軟件測試大廠面試資料和Python自動化、接口石洗、框架搭建學習資料幢泼!

團隊建設

建立自動化測試的組,理想狀態(tài)下有4個人員讲衫,測試開發(fā)缕棵、中高級自動化測試工程師孵班、2個初級自動化工程師;非理想的情況下招驴,可能只有一個人篙程。

測試開發(fā):

基礎答案:自動化框架的建設,確定自動化框架的設計模式别厘、第三方代碼工具的封裝虱饿、中間公共模塊的設計和調用、測試用例触趴、測試套件的管理和執(zhí)行氮发、測試報告和測試結果的輸出(文件輸出和郵件通知)

可選高級:如果可能的話,需要搭建持續(xù)集成服務器(CI冗懦,Continuous Integration Server)的環(huán)境爽冕,進行持續(xù)交付和自動化的冒煙測試等。

培訓的任務披蕉,需要將設計的框架以及封裝的驅動颈畸,對其他成員進行培訓。

有自動化方案的實施經驗没讲、有開發(fā)背景眯娱、以及持續(xù)集成的背景等。

中高級自動化測試工程師:

配合測試開發(fā)人員爬凑,實施測試框架的建設困乒。主要負責中間公共模塊的實現(xiàn)和實例化等,以及部分高難度和流程復雜的自動化用例腳本編寫和調試等工作贰谣。

有參與過自動化方案的建設娜搂、腳本編寫經驗豐富、會代碼調試吱抚、懂Web測試等百宇。

初級自動化測試工程師:

根據(jù)中間公共模塊的設計,進行實例化公共模塊秘豹、方法組合携御,實現(xiàn)自動化用例腳本的編寫。
有計算機編程思維既绕、有代碼經驗啄刹、可以讀懂腳本和HTML等。

若只有我一個人:

首先實現(xiàn)自動化用例的維護和執(zhí)行凄贩。在這個基礎上不斷的抽取實現(xiàn)公共模塊的設計以及測試報告的生成等工作誓军。通過經驗的積累,以及后續(xù)人員的補充疲扎,早日做好自動化框架的建設工作昵时。

加入我們捷雕,642830685,群壹甥。領取最新軟件測試大廠面試資料和Python自動化救巷、接口、框架搭建學習資料句柠!技術大牛解惑答疑浦译,同行一起交流

技術方案

Selenium WebDriver、Python(unittest) Java(JUnit)溯职、CI Server

技術方案:

選擇Python + Selenium 的技術方案精盅。

首先技術工具是免費的,Python的工具用PyCharm社區(qū)版缸榄,Selenium的WebDriver是開源工具渤弛。利用比較簡潔的Python語言進行自動化測試祝拯,對于人員的學習成本來講比較實用甚带,學習時間短,有優(yōu)勢佳头。

另外Python自帶的unittest單元測試框架可以很方便的實現(xiàn)自動化用例的設計和執(zhí)行以及自動化用例套件的管理等任務鹰贵。Python是純面向對象的語言,后續(xù)也可以過渡到Java + Selenium進行更加豐富的自動化測試康嘉。
此外碉输,可以選擇Jenkins作為持續(xù)集成服務器,配合Python+Selenium的方案進行自動化冒煙測試亭珍。

源代碼管理工具(VCS, version control system)

選擇SVN(git)作為代碼的源代碼管理工具敷钾。集成在PyCharm中的步驟如下
1、把代碼放到SVN在本地簽出(check out)的文件夾目錄中肄梨,例如 D:\SVN\XXProject\Trunck
2阻荒、用PyCharm打開 剛剛部署的代碼
3、選擇PyCharm的 VCS|Enable VCS integration众羡,選擇 Subversion(svn) 或者 Git
4铛纬、右鍵項目文件的根目錄坚洽,選擇 Subversion | add to VCS
5、右鍵項目文件的根目錄,或者選 VCS | Commit Directory...
6侈净、每天打開代碼后,首先 Subversion | update project

硬件:

硬件的要求不高单匣,主要需要獨立的測試環(huán)境矮冬。另外測試人員用的電腦最好是Windows桌面操作系統(tǒng),需要安裝Firefox瀏覽器柠偶,避免47.0的最新版本眨攘。測試人員最好也使用Chrome瀏覽器輔助進行Web元素的定位主慰。

Selenium 學習總結

Selenium IDE (火狐的插件)
1、Selenium IDE
一個基于火狐瀏覽器的插件
2鲫售、錄制(需要確保右上角的錄制按鈕是按下去的)共螺,為了我們熟悉Selenium WebDriver/ RC
3、保存和另存為測試用例
4情竹、無論是否保存用例藐不,都可以直接回放
5、導出測試用例的對應的編程腳本
6秦效、C# Nunit WebDriver
7雏蛮、Java Junit / testNG WebDriver
8、Python unittest WebDriver
9阱州、Ruby Test::Unit WebDriver
10挑秉、插入、編輯苔货、刪除命令
11犀概、學習Selenium的WebDriver/ RC

Python + Selenium WebDriver

一、搭建環(huán)境步驟

a 安裝 python3.x (windows xp 不支持 python3.5+)
b 設置環(huán)境變量 path(安裝時候也可以解決 勾上 add python.ext to path)
c 安裝Selenium 用pip命令安裝 pip install -U selenium
有無問題夜惭?
路徑姻灶,pip可能定位不到,pip也可能定位到別的文件夾(perl)
方案:cd c:\python34\scripts
外網(wǎng)ip問題诈茧。交換機的原因产喉,局域網(wǎng)里面是同一個ip,造成安裝超時
火狐的版本 46.0以及以下
windows 7 x64以上的系統(tǒng)敢会,需要用管理員模式運行cmd曾沈,否則會安裝失敗。
普通的使用

二鸥昏、定位方式

by id, name, class_name, tag_name, css_selector, xpath, link_text, partial_link_text
主要用的 是 id,name, css_selector, xpath, link_text

Selenium 基本使用

Python + Selenium 環(huán)境搭建

安裝Python塞俱,3.x(3.4 3.5 3.6)
注意:環(huán)境變量path
需要添加 "C:\Python34;C:\Python34\Scripts;"到Path
步驟:

右鍵 我的電腦 屬性 | 高級系統(tǒng)設置 | 環(huán)境變量
找 系統(tǒng)變量 | Path 并 雙擊 | Ctrl+C | 編輯 | Ctrl+V
安裝 Selenium
cmd | pip install -U selenium

-U = --upgrade 升級安裝

類似于linux命令
command -x param
容易出現(xiàn)的問題

1、環(huán)境變量
cd C:\Python34\Scripts
再安裝
2互广、管理員權限
右鍵 管理員方式運行

WebDriver的基本使用

1敛腌、實例化一個WebDriver的對象(使用默認的火狐瀏覽器 v46或者以下)
driver = webdriver.Firefox()

注意,一定要寫括號惫皱,代表實例化對象
2像樊、打開網(wǎng)址
driver.get("http://localhost/ranzhi/www")

3、查找元素
用id : driver.find_element_by_id("account")
用name: driver.find_element_by_name("password")
用xpath css_selector

4旅敷、對元素的操作
clear()
click()
send_keys()
使用python的休眠生棍,給瀏覽器留出時間加載頁面
sleep(2)

5、關閉退出火狐
driver.quit()

selenium WebDriver的進階操作

unittest 單元測試框架的使用

驗證:斷言 self.assertEqual(expected, actual, msg)

管理測試用例: 每一個以 test_ 開頭的方法

可以在自動化測試用例中忽略的部分:
 編號 名稱 優(yōu)先級 模塊(項目) ## 忽略
必須在自動化用例中強調的部分:
    前置條件    setUp()
    輸入數(shù)據(jù)    
    步驟       test_ 開頭的方法
    預期結果   test_ 開頭的方法
    清理      tearDown()

新增的一個知識點: 測試的初始化 以及 測試的結束

setUpClass() 和 tearDownClass()

注意 上述方法 與 setUp() 和 tearDown() 的調用順序

1媳谁、定位方式的使用

css_selector

方法調用:

driver.find_element_by_css_selector("#langs > button")
CSS的3種選擇器:

1涂滴、id: 使用#+id
2友酱、tag: 使用tag
3、class: 使用.+class

CSS selector的獲取

可以使用開發(fā)者工具柔纵,定位的元素缔杉,右鍵 | 復制 selector(復制CSS路徑)

1、Chrome使用了相對路徑 #langs > button
2搁料、Firefox(firebug)使用了絕對路徑 html.screen-desktop-wide.device-desktop body.m-user-login div.container div#login div.panel-head div.panel-actions div#langs.dropdown.open button.btn

class_name

通過 class定位元素或详,必須保持 class唯一,否則定位會失敗

driver.find_element_by_class_name("btn")

link_text 和 partial_link_text

文字選擇正確就行了
xpath

chrome內核的開發(fā)者工具郭计,復制的是相對的xpath
firefox內核的開發(fā)者工具(firebug)霸琴,復制的絕對的xpath

特定的元素的處理

frame


<iframe>
 <html>
     <head></head>
      <body>
           <我們需要定位的元素>
      </body>
  </html>
</iframe>

上述代碼中,我們需要定位的元素昭伸,處于 一個frame中:我們需要先切換到對應的frame中梧乘,然之操作,之后再退出


## 我們需要先切換到對應的frame中
## 切換frame
driver.switch_to.frame("frame_name")
## 或者用保險的辦法切換frame
frame_element = driver.find_element_by_css_selector("#frame_id")
driver.switch_to.frame(frame_element)
## 開始做定位操作
## <----------------->
## 結束做定位操作
## 切換frame必須成對的出現(xiàn)庐杨。
## 退出切換的frame到默認的網(wǎng)頁html中
driver.switch_to.default_content()
select

select定位有個前提选调,元素標簽必須是 select


<select>
  
</select>
## 部門是個 select 元素  <select></select>
## 需要3步驟:
##    1. 找到 select 的元素,賦值給變量 dept_select
##    2. 實例化 dept_select 為 Select()的對象 為 user_adding_dept
##    3. 調用 user_adding_dept 的方法 select_by_index()給元素賦值

示例代碼


# 找到 select 的元素辑莫,賦值給變量 dept_select
dept_select = driver.find_element_by_id("dept")
 
# 實例化 dept_select 為 Select()的對象 為 user_adding_dept
user_adding_dept = Select(dept_select)
 
# 調用 user_adding_dept 的方法 select_by_index()給元素賦值
user_adding_dept.select_by_index(2)
清除 cookie

在打開瀏覽器的時候学歧,需要清理cookie罩引。

from selenium import webdriver
 
driver = webdriver.Firefox()
driver.delete_all_cookies()
driver.get("...")

數(shù)據(jù)驅動的方式編寫用例

主要有兩種形式進行數(shù)據(jù)驅動
數(shù)據(jù)驅動:用外部數(shù)據(jù)來驅動測試用例的執(zhí)行

數(shù)據(jù)庫驅動:MySQL各吨、Oracle、PostgreSQL袁铐、SQL Server

import pymysql
 
connect = pymysql.connect(host="xx", port=3306, user="root", passwd="xxx", db="xx")
cur = connect.cursor()
cur.execute("SELECT...")
mysql_data = cur.fetchall()
for row in mysql_data:
    # 進行測試
    # 使用字典類型
    data_to_test = {
      "key1": row[0],
      "key2": row[1]
    }
    
cur.close()
connect.close()
數(shù)據(jù)文件驅動:csv文件最典型揭蜒、xml文件、txt文件

import csv
 
csv_file = open("xxx.csv", "r", encoding="utf8")
csv_data = csv.reader(csv_file)
for row in csv_data:
    # 進行測試
    # 使用字典類型
    data_to_test = {
      "key1": row[0],
      "key2": row[1]
    }
 
csv_file.close()
需要掌握的知識點:

1剔桨、python的字典類型 dict 類型
2屉更、python的讀寫文件
3、python的讀寫數(shù)據(jù)庫
4洒缀、for循環(huán)
5瑰谜、注意資源的釋放
關閉數(shù)據(jù)庫游標和連接
關閉文件

模塊化的方式編寫用例

需要將每個用例都需要用的公共的功能,抽取出來树绩,放到一個公共類中萨脑,作為模塊化

創(chuàng)建一個Python Package "common",在里面創(chuàng)建一個ranzhi_common.py文件饺饭,里面添加RanzhiCommon類

1渤早、login() : 普通登錄,默認用admin/123456登錄
2瘫俊、logout():退出系統(tǒng)
3鹊杖、login_by_dict(user_to_login):使用字典類型的參數(shù)進行登錄悴灵,user_to_login 是一個字典類型 dict
4、change_language(lang):zh_CN, en_US, zh_TW 切換語言骂蓖,需要參數(shù)傳遞要切換的語言
5积瞒、select_app(app):crm, admin, oa, cash, team 選擇App,需要傳遞選擇 后臺管理 | 客戶管理 登下。赡鲜。。
6庐船、select_menu_for_admin(menu): organization 選擇了后臺管理以后银酬,選擇菜單 組織
7、add_user(user_to_add): 使用字典類型的參數(shù)進行添加

創(chuàng)建測試用例的類筐钟,比如 ranzhi_test_01.py ranzhi_test_02.py ranzhi_test_03.py... 在這些類中調用上面創(chuàng)建的類揩瞪,一般會放到setUp() 中

import unittest
from common.ranzhi_common import RanzhiCommon
 
class RanzhiTest01(unittest.TestCase):
    
    def setUp(self):
        ranzhi_common = RanzhiCommon()
        
    def test_xxx(self):
        ranzhi_common.login()
        ##...

Selenium 自動化測試方案

基礎方案

1、使用unittest篓冲,主要是用 TestCase(測試用例)
2李破、使用模塊化(基本的模塊化,抽取公共模塊)
3壹将、使用數(shù)據(jù)驅動的方式(主要包括 數(shù)據(jù)庫的形式 和文件讀取 )
4嗤攻、定制執(zhí)行需要測試的用例,使用unittest诽俯,主要用的是TestSuite(測試套件)妇菱、和 5、TextTestRunner(文本測試運行器)[或者HTMLTestRunner]
6暴区、生成測試報告(發(fā)送報告到指定郵箱)

方案實現(xiàn)的具體步驟:

1闯团、使用PyCharm創(chuàng)建新的PurePython項目

2、在項目中創(chuàng)建如下的文件夾(python package)

TestCase
Data
Common
TestRunner
Report
3仙粱、分別實現(xiàn)上述模塊

在Data中存放數(shù)據(jù)房交,CSV文件,或者也可以放到數(shù)據(jù)中伐割,使用數(shù)據(jù)驅動

## 使用csv文件
csv.reader()
## 使用數(shù)據(jù)庫(MySQL)候味,可以參考www.imooc.com的python操作MySQL的視頻
cur.fetchall()

在Common中,創(chuàng)建測試公共模塊隔心,實現(xiàn)模塊化的操作


## __init__(self, driver: webdriver.Firefox, base_url)
self.common = RanzhiCommon(self.driver, self.base_url)

在TestCase創(chuàng)建自動化測試用例白群,注意使用unittest.TestCase

def setUp()
def tearDown()
det test_xxx()

在TestRunner創(chuàng)建測試執(zhí)行器和測試套件,使用unittest.TestSuite和HTMLTestRunner(第三方)

test_suite = unittest.TestSuite()
test_suite.addTest(RanzhiLogonTc01("test_xxx"))
 
html_test_runner = HTMLTestRunner(stream=report_file, title="xxx", description="dddd")
html_test_runner.run(test_suite)

項目根目錄創(chuàng)建main.py济炎,作為測試項目的主入口川抡,運行測試。

檢查測試報告

Selenium 可能遇到的問題

有無問題?

a <iframe> 
    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"))
    自定義的添加測試用例侍咱,并執(zhí)行
unittest.TextTestRunner
    run(suite)
    執(zhí)行創(chuàng)建并維護好的測試套件
    
test_runner  test_suite  test_case
測試運行器    測試套件     測試用例

模塊化操作


面向對象的實踐: 
1. 編寫一個類,類里面描述公共的方法
2. 實例化這個類密幔,調用這個類的方法
有無問題楔脯?
類的構造方法,需要傳遞 webdriver.Firefox()
    self.common = RanzhiCommon(self.browser, self.base_url)

數(shù)據(jù)驅動測試
讀取csv胯甩,循環(huán)每一行數(shù)據(jù)進行操作
讀取MySQL昧廷,用例存到MySQL中

1. 中文編碼的問題。 
    # coding="utf-8"
    讀csv的時候偎箫,添加 encoding='utf-8'
    csv.reader(open("xxx.csv", "r", -1, encoding="utf-8")
2. 循環(huán)放到最外層
3. 文件路徑在控制臺讀取不到的問題木柬,需要用絕對路徑來指向文件
封裝WebDriver

1、避免第三方代碼的威脅淹办,防止大批量修改測試用例
2眉枕、節(jié)約人力的成本(如果封裝以后,不需要每個自動化測試工程師都會WebDriver)
3怜森、標準化自動化用例的操作速挑,只需要調用公共的標準模塊就好。

以上是我給大家整理的一個關于自動化的web ui的一個項目從開始到完成的方案

加入我們副硅,642830685姥宝,群。領取最新軟件測試大廠面試資料和Python自動化恐疲、接口腊满、框架搭建學習資料!

?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末流纹,一起剝皮案震驚了整個濱河市糜烹,隨后出現(xiàn)的幾起案子违诗,更是在濱河造成了極大的恐慌漱凝,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诸迟,死亡現(xiàn)場離奇詭異茸炒,居然都是意外死亡,警方通過查閱死者的電腦和手機阵苇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門壁公,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绅项,你說我怎么就攤上這事紊册。” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵囊陡,是天一觀的道長芳绩。 經常有香客問我,道長撞反,這世上最難降的妖魔是什么妥色? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮遏片,結果婚禮上嘹害,老公的妹妹穿的比我還像新娘。我一直安慰自己吮便,他們只是感情好笔呀,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著髓需,像睡著了一般凿可。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上授账,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天枯跑,我揣著相機與錄音,去河邊找鬼白热。 笑死敛助,一個胖子當著我的面吹牛,可吹牛的內容都是我干的屋确。 我是一名探鬼主播纳击,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼攻臀!你這毒婦竟也來了焕数?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤刨啸,失蹤者是張志新(化名)和其女友劉穎堡赔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體设联,經...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡善已,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了离例。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片换团。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖宫蛆,靈堂內的尸體忽然破棺而出艘包,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布想虎,位于F島的核電站衰絮,受9級特大地震影響,放射性物質發(fā)生泄漏磷醋。R本人自食惡果不足惜猫牡,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望邓线。 院中可真熱鬧淌友,春花似錦、人聲如沸骇陈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽你雌。三九已至器联,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間婿崭,已是汗流浹背拨拓。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留氓栈,地道東北人渣磷。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像授瘦,于是被迫代替她去往敵國和親醋界。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355