Python+Selenium筆記(十二):資料驅動測試,pythonselenium
(一) 前言
通過使用資料驅動測試,實現對輸入值和預期結果的參數化。(例如:輸入資料和預期結果可以直接讀取Excel文檔的資料)
(二) ddt
使用ddt執行資料驅動測試,ddt庫可以將測試中的變數參數化。使用ddt的時候,在測試類別上使用@ddt裝飾符,在測試方法上使用@data裝飾符。@data裝飾符將參數當作測試資料,參數可以是單個值、列表、元組、字典。對於列表和元組,需要用@unpack裝飾符把列表和元組解析成多個參數。
使用下面的命令安裝ddt庫
pip install ddt
(三) 通過Excel擷取資料
讀取Excel檔案,需要用到xlrd庫。
安裝xlrd的庫
pip install xlrd
如果要往Excel表格寫資料,需要用到xlwt庫
pip install xlwt
(四) 樣本中用到的excel檔案
郵箱 |
手機 |
登陸名稱 |
暱稱 |
密碼 |
確認密碼 |
預期結果 |
test@outlook.com |
1 |
bky_110 |
Apsara Distributed File System |
test>100 |
test>100 |
手機號碼有誤 |
test@outlook.com |
18898989878 |
b |
Apsara Distributed File System |
test>100 |
test>100 |
不合要求,至少2個字元,最多30個字元 |
(五) 樣本
1 from selenium import webdriver 2 from ddt import ddt,data,unpack 3 import xlrd 4 import unittest 5 #讀取excel檔案的函數 6 def get_data(file_name): 7 rows = [] 8 #讀取excel的資料 9 book = xlrd.open_workbook(file_name)10 #通過索引訪問第一個sheet頁11 sheet = book.sheet_by_index(0)12 #迭代讀取excel第一個sheet頁的資料,sheet.nrows指excel的行數13 for r_idx in range(1, sheet.nrows):14 #row_values讀取第r_idx行的資料(0代表讀取第1列及後面所有列的資料)15 #讀取資料的時候,我們一般說的第一行、第一列,索引都是016 #所以r_idx=1的時候,讀取的其實是excel第二行的資料17 rows.append(list(sheet.row_values(r_idx,0)))18 #先將手機號刪除並賦值給pthone,然後轉換為字串並添加回原來的位置19 pthone = rows[r_idx - 1].pop(1)20 rows[r_idx - 1].insert(1, str(int(pthone)))21 return rows22 @ddt23 class RegisterNewUserDDT(unittest.TestCase):24 @classmethod25 def setUpClass(cls):26 cls.driver = webdriver.Chrome()27 cls.driver.implicitly_wait(20)28 cls.driver.maximize_window()29 cls.driver.get('https://www.cnblogs.com/')30 login_area = cls.driver.find_element_by_css_selector('#login_area')31 register = login_area.find_element_by_link_text('註冊')32 register.click()33 #讀取excel檔案的資料作為參數34 @data(*get_data('data/reTest.xlsx'))35 @unpack36 def test_register_new_user(self,email,phone,login_name,nickname,password,confirm_password,expected_result):37 driver = self.driver38 self.assertTrue('使用者註冊 - 部落格園' == driver.title)39 # 定位註冊頁面各個欄位40 user_email = driver.find_element_by_id('Email')41 user_phone_country = driver.find_element_by_id('CountryCode')42 user_phone = driver.find_element_by_id('PhoneNum')43 user_login_name = driver.find_element_by_id('LoginName')44 user_nickname = driver.find_element_by_id('DisplayName')45 user_password = driver.find_element_by_id('Password')46 user_confirm_password = driver.find_element_by_id('ConfirmPassword')47 #清除各欄位的值(如果有)48 user_email.clear()49 user_phone.clear()50 user_login_name.clear()51 user_nickname.clear()52 user_password.clear()53 user_confirm_password.clear()54 #輸入郵箱、手機號等資訊55 user_email.send_keys(email)56 user_phone.send_keys(phone)57 user_login_name.send_keys(login_name)58 user_nickname.send_keys(nickname)59 user_password.send_keys(password)60 user_confirm_password.send_keys(confirm_password)61 #判斷提示是否正確(這邊應該有辦法可以擷取當前是第幾次執行,下面的寫法太死板了)62 if phone == '1':63 phone_error = driver.find_element_by_id('PhoneNum-error')64 self.assertTrue(phone_error.text == expected_result)65 elif login_name == 'b':66 loginName_error = driver.find_element_by_id('LoginName-error')67 self.assertTrue(loginName_error.text == expected_result)68 69 @classmethod70 def tearDownClass(cls):71 cls.driver.quit()