剛接觸自動化測試,由於沒有編程語言的基礎,是搞不懂代碼里面的函數、封裝、包以及其他概念,只是了解字符串、數組、元組及字典這種最基本的名詞,更不懂自動化測試框架了。
在我這種外門漢的角度來看,代碼不就是一頁word文件寫進去,從頭執行到尾嗎?其實不然,代碼可不止一頁word,很多頁啊。
看着蟲師的書籍學習自動化測試,邊看邊敲還是會忘記,想想還是做做筆記比較合宜。這篇筆記來粗略記下學習自動化測試的幾種模型,可能再之后回來看會有特別的感受,先這樣記着吧。
1、線性測試
線性測試,顧名思義,就是一條路按照一條直線走到底。它的每個腳本都是獨立的,都可以拿出來單獨運行,來驗證一個功能點,上兩段小代碼舉個栗子:
打開百度主頁:
# coding:utf-8 from time import sleep # 從time中引入sleep from selenium import webdriver # 從selenium中引入webdriver driver = webdriver.Firefox() # 選擇打開的瀏覽器 driver.maximize_window() # 瀏覽器窗口最大化 driver.implicitly_wait(3) # 隱式等待 driver.get("https://www.baidu.com") # 獲取URL,打開頁面 driver.quit() # 退出相關瀏覽器
打開百度主頁,並輸入查找內容:
# coding:utf-8 from time import sleep # 從time中引入sleep from selenium import webdriver # 從selenium中引入webdriver driver = webdriver.Firefox() # 選擇打開的瀏覽器 driver.maximize_window() # 瀏覽器窗口最大化 driver.implicitly_wait(3) # 隱式等待 driver.get("https://www.baidu.com") # 獲取URL,打開頁面 search = driver.find_element_by_id("kw") # 通過id定位搜索框 search.send_keys("selenium") # 填入"selenium" sleep(5) # 直接等待 driver.quit() # 退出相關瀏覽器
以上兩段代碼,分別做了實現打開百度首頁和打開百度首頁后輸入查找內容的功能,都可以單獨拿出來執行。如果需要修改查找訪問頁面,那么我需要兩段代碼都需要修改。當這類獨立的腳本數量多了起來,去修改這些內容花費的工作量太大,將會失去了自動化的目的。
2、模塊化與類庫
login.py
# coding:utf-8 from time import sleep from selenium import webdriver # 從selenium中引入webdriver def login_mantis(): driver = webdriver.Firefox() # 選擇打開的瀏覽器 driver.maximize_window() # 瀏覽器窗口最大化 driver.implicitly_wait(3) # 隱式等待 driver.get("http://192.168.1.201/mantisbt-1.2.19/login_page.php") # 獲取URL,打開頁面 sleep(1) # 直接等待 username = driver.find_element_by_xpath("html/body/div[3]/form/table/tbody/tr[2]/td[2]/input") # 通過Xpath定位獲取輸入賬號框 username.send_keys("wuhaobo") # 輸入賬號 sleep(1) password = driver.find_element_by_xpath("html/body/div[3]/form/table/tbody/tr[3]/td[2]/input") # 通過Xpath定位獲取輸入密碼框 password.send_keys("123456") # 輸入密碼 sleep(1) login = driver.find_element_by_xpath("html/body/div[3]/form/table/tbody/tr[6]/td/input") # 通過Xpath定位獲取登錄按鈕 login.click() # 點擊登錄按鈕 sleep(3)
上面的代碼實現了mantis登錄功能。
quit.py
# coding:utf-8 from selenium import webdriver # 從selenium中引入webdriver def quit_mantis(): driver = webdriver.Firefox() # 選擇打開的瀏覽器 driver.quit() # 退出相關瀏覽器
上面的代碼實現了mantis退出功能。
do_something_in_mantis.py
# coding:utf-8 from time import sleep # 從time中引入sleep from selenium import webdriver # 從selenium中引入webdriver import login # 引入登錄模塊 import quit # 引入退出模塊 login.login_mantis() # 調用登錄模塊 print ">>>以下操作為在登錄界面后的操作" # 需要做的操作放在登錄和退出中間 print ">>>以上操作為在登錄界面后的操作" quit.quit_mantis() # 調用退出模塊
上面的代碼實現了調用登錄模塊和退出模塊。
通過以上代碼可以發現,登錄模塊和退出模塊可以讓任意操作類腳本調用,省去了該部分代碼的重復量,便於維護的同時,也加快了代碼的開發速度。
3、數據驅動
直接理解成參數化輸入,不同結果輸出。
(1)、讀取TXT方式
將存好登錄的賬號密碼放置在兩個TXT文件中:
# coding:utf-8 from time import sleep from selenium import webdriver # 從selenium中引入webdriver username_file = open("G:\\joker_study\\username.txt") # 打開賬號文本路徑 username = username_file.read() # 取出賬號 password_file = open("G:\\joker_study\\password.txt") # 打開密碼文本路徑 password = password_file.read() # 取出密碼def login_mantis_by_txt(): driver = webdriver.Firefox() # 選擇打開的瀏覽器 driver.maximize_window() # 瀏覽器窗口最大化 driver.implicitly_wait(3) # 隱式等待 driver.get("http://192.168.1.201/mantisbt-1.2.19/login_page.php") # 獲取URL,打開頁面 sleep(1) # 直接等待 username_input = driver.find_element_by_xpath("html/body/div[3]/form/table/tbody/tr[2]/td[2]/input") # 獲取輸入賬號框 username_input.send_keys(username) # 輸入賬號 sleep(1) password_input = driver.find_element_by_xpath("html/body/div[3]/form/table/tbody/tr[3]/td[2]/input") # 獲取輸入密碼框 password_input.send_keys(password) # 輸入密碼 sleep(1) login_button = driver.find_element_by_xpath("html/body/div[3]/form/table/tbody/tr[6]/td/input") # 獲取登錄按鈕 login_button.click() # 點擊登錄按鈕 sleep(3) driver.quit() # 退出瀏覽器
上面的代碼實現了從TXT文件中讀出賬號和密碼,再傳入函數中,進行登錄操作。
(2)、通過函數
userconfig.py
# coding:utf-8 def username_password(username="CJOLER",password="123456"): return username,password
login.py
# coding:utf-8 from time import sleep from selenium import webdriver # 從selenium中引入webdriver import userconfig # 引入userconfig文件 un, pw = userconfig.username_password() print un, pw def login_mantis_by_txt(): driver = webdriver.Firefox() # 選擇打開的瀏覽器 driver.maximize_window() # 瀏覽器窗口最大化 driver.implicitly_wait(3) # 隱式等待 driver.get("http://192.168.1.201/mantisbt-1.2.19/login_page.php") # 獲取URL,打開頁面 sleep(1) # 直接等待 username_input = driver.find_element_by_xpath("html/body/div[3]/form/table/tbody/tr[2]/td[2]/input") # 獲取輸入賬號框 username_input.send_keys(un) # 輸入賬號 sleep(1) password_input = driver.find_element_by_xpath("html/body/div[3]/form/table/tbody/tr[3]/td[2]/input") # 獲取輸入密碼框 password_input.send_keys(pw) # 輸入密碼 sleep(1) login_button = driver.find_element_by_xpath("html/body/div[3]/form/table/tbody/tr[6]/td/input") # 獲取登錄按鈕 login_button.click() # 點擊登錄按鈕 sleep(3) driver.quit() # 退出瀏覽器
上面的代碼實現了將賬號密碼放在一個函數內,再去調用,進行登錄操作。
(3)、讀取字典
userconfig.py
# coding:utf-8 def username_password(): config = {"username": "CJOKER", "password": "123456"} return config
login.py
# coding:utf-8 from time import sleep from selenium import webdriver # 從selenium中引入webdriver import userconfig # 引入userconfig文件 Data = userconfig.username_password() un = Data["username"] pw = Data["password"] def login_mantis_by_txt(): driver = webdriver.Firefox() # 選擇打開的瀏覽器 driver.maximize_window() # 瀏覽器窗口最大化 driver.implicitly_wait(3) # 隱式等待 driver.get("http://192.168.1.201/mantisbt-1.2.19/login_page.php") # 獲取URL,打開頁面 sleep(1) # 直接等待 username_input = driver.find_element_by_xpath("html/body/div[3]/form/table/tbody/tr[2]/td[2]/input") # 獲取輸入賬號框 username_input.send_keys(un) # 輸入賬號 sleep(1) password_input = driver.find_element_by_xpath("html/body/div[3]/form/table/tbody/tr[3]/td[2]/input") # 獲取輸入密碼框 password_input.send_keys(pw) # 輸入密碼 sleep(1) login_button = driver.find_element_by_xpath("html/body/div[3]/form/table/tbody/tr[6]/td/input") # 獲取登錄按鈕 login_button.click() # 點擊登錄按鈕 sleep(3) driver.quit() # 退出瀏覽器
上面的代碼實現了將賬號密碼放在一個字典內,再去調用,進行登錄操作。
(4)、csv文件
# coding:utf-8 import os # 引入os模塊 import csv # 引入csv包 from time import sleep # 引入sleep方法 from selenium import webdriver # 從selenium中引入webdriver list_username = [] list_password = [] data = csv.reader(file('G:\\joker_study\\userconfig.csv', 'rb')) # 獲取每列數據 for user in data: print user[0] # 獲取第一列中從上往下的數據 list_username.append(user[0]) # 將每次讀取的字符串加入到數組中 print user[1] # 獲取第二列中從上往下的數據 list_password.append(user[1]) # 將每次讀取的字符串加入到數組中 def login_mantis_by_csv(): for i in range(len(list_username)): driver = webdriver.Firefox() # 選擇打開的瀏覽器 driver.maximize_window() # 瀏覽器窗口最大化 driver.implicitly_wait(3) # 隱式等待 driver.get("http://192.168.1.201/mantisbt-1.2.19/login_page.php") # 獲取URL,打開頁面 sleep(1) # 直接等待 username_input = driver.find_element_by_xpath("html/body/div[3]/form/table/tbody/tr[2]/td[2]/input") # 獲取輸入賬號框 username_input.send_keys(str(list_username[i])) # 輸入賬號 sleep(1) password_input = driver.find_element_by_xpath("html/body/div[3]/form/table/tbody/tr[3]/td[2]/input") # 獲取輸入密碼框 password_input.send_keys(str(list_password)) # 輸入密碼 sleep(1) login_button = driver.find_element_by_xpath("html/body/div[3]/form/table/tbody/tr[6]/td/input") # 獲取登錄按鈕 login_button.click() # 點擊登錄按鈕 sleep(3) driver.quit() # 退出瀏覽器
上 面的代碼實現了將賬號密碼分別存在一個CSV表格中,通過csv.reader將每列都讀取出來,user[0]第一列,user[1]第二列,一次類 推。需要注意的是,要講CSV文件打開的格式和工具格式保持一致:在簡體中文環境下,EXCEL打開的CSV文件默認是ANSI編碼,如果CSV文件的編 碼方式為utf-8、Unicode等編碼可能就會出現文件亂碼的情況。
4、關鍵字驅動
采用EXCEL或者QTP及robot framework等工具大部分都是以關鍵字驅動來實現自動化測試,這種方式由於只需要關注"我要做什么(命令)?對誰做(對象)?怎么做(值)?",目前還沒有去采用這種方式去寫作腳本,等學習了robot framework或者用到這種方式的時候,再記錄補充下吧。
例如這種EXCEL表格(網上隨意復制過來)中所示: