Python+Selenium笔记(十二):数据驱动测试
(一) 前言
通过使用数据驱动测试,实现对输入值和预期结果的参数化。(例如:输入数据和预期结果可以直接读取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文件
邮箱 |
手机 |
登陆名称 |
昵称 |
密码 |
确认密码 |
预期结果 |
1 |
bky_110 |
盘古 |
test>100 |
test>100 |
手机号码有误 |
|
18898989878 |
b |
盘古 |
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 #读取数据的时候,我们一般说的第一行、第一列,索引都是0 16 #所以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 rows 22 @ddt 23 class RegisterNewUserDDT(unittest.TestCase): 24 @classmethod 25 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 @unpack 36 def test_register_new_user(self,email,phone,login_name,nickname,password,confirm_password,expected_result): 37 driver = self.driver 38 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 @classmethod 70 def tearDownClass(cls): 71 cls.driver.quit()