目的:我们之前传测试数据是事先在装饰器中传入数据,太麻烦了,这时候我们让他从 excel 表中获取数据,这样极大的简便了操作数据的传递,这种操作也称之为数据驱动
引子:
我们刚开始在装饰器传三组数据是不是这样写
然后我们是不是可以把后面的数据用一个变量接收它,然后再放到后面传入装饰器?例如这样
赋值给变量
将变量填上去
我们以这种方式往装饰器中传入了变量
之后我们从 excel 中获取数据传给变量 list_data 是不是就可以实现从 excel 表中获取数据了,并且表中有几行数据则程序自动运行几次,非常的人性化
接着我们去D 盘根目录创建一个 tpshop.xls 表
表中字段以及信息如下(仅仅是将 list_data 也就是装饰器里的数据放到了 excel 表中而已)
此处值得注意的是要在账号和密码的前面输入一个英文的单引号使其转换为字符串

接着我们去创建一个 s_load_excel.py 文件,并在里面创建一个load_excel_xls函数,该函数的目的是从 excel 表中获取数据,并将数据传给 list_data 变量
具体语法如下:
import xlrd
def load_excel_xls(name, sheet="Sheet1"):
# 打开文件 生成一个文件对象
wb = xlrd.open_workbook(name)
# 打开表 Sheet1 生成一个表对象
st = wb.sheet_by_name(sheet)
list_data = []
for n in range(0, st.nrows):
# print(st.row_values(n))
list_row = st.row_values(n)
list_data.append(list_row)
return list_data
# 测试使用
list_data = load_excel_xls("E:/tpshop.xls")
#🌟此处要从第二行开始,因为第一行是字段名,我们不需要
print(list_data[1:])
该运行结果为:
跟我们想让传入的 list_data 中 的数据一模一样~
此时我们注意到一个问题,输出的结果为 [ [ ] , [ ] , [ ] ] 形式,跟之前装饰器中的 [ ( ) , ( ) , ( ) ]不一样这里就要讲列表跟元组的区别啦哈哈
我们知道其实列表跟元组一样,只不过元组不可以修改而已,况且他们都是有顺序的,还都是靠下标(索引)来定位元素,所以在这里,我们可以直接把 return 返回的 list_data 传入装饰器中
至此,数据驱动思想讲解完毕
为什么好用?
因为他可以 excel 表中有多少行数据就可以传入多少次,也就是循环运行几遍,再用不也专门去装饰器里传参数了,那样真的很麻烦。
以下是完整代码展示
此处是用 selenium 模拟的三个用户的登录用例(正确账号,正确密码)(正常账号,错误密码)(错误账号,正确密码)
import time
import s_page
#导入我们创建的load_excel_xls函数
from s_load_excel import load_excel_xls
from s_page import MyPage
import pytest
# 调用load_excel_xls函数
list_data = load_excel_xls("E:/tpshop.xls")
#username账号 password密码 url预期打开的网址 text预期网页上显示的文字
class TestTPshop:
@pytest.mark.parametrize('username,password,url,text',list_data[1:])
def test_login1(self,username,password,url,text):
mp = MyPage()
mp.open('http://192.168.1.28/index.php')
time.sleep(2)
mp.click_css('body > div.tpshop-tm-hander > div.top-hander.clearfix > div > div > div.fl.nologin > a.red')
mp.send_key('#username',username)
time.sleep(0.5)
mp.send_key('#password',password)
time.sleep(0.5)
mp.send_key('#verify_code','8888')
time.sleep(2)
mp.click_css('#loginform > div > div.login_bnt > a')
#点击登录之后睡两秒
time.sleep(2)
#添加截图到allure测试报告
#我暂时没安装allure
#网址断言
mp.assert_url(url)
time.sleep(2)
#页面上的文字做断言
mp.assert_text(text)
time.sleep(2)
mp.quit()