一、openpyxl介绍和安装:
安装方式:
pip install openpyxl
1、为什么要学操作excel
存测试数据:
有时候大批量的数据,存在txt里面显然不是最佳的方式,我们可以存在excel里面去,第一方便我们存储数据和做数据,一方面方便我们读取数据,比较明朗,测试的时候就从数据库中读取出来,这点是非常重要的!
存测试结果:
可以批量把结果存到excel中,也比较好整理数据点,比txt更好
2、安装openpyxl
puthon中与excel操作相关的模块
xlrd:从excel中读取数据,支持xls,xlsx
xlwt库:对excel进行修改操作、不支持对xlsx格式的修改
xlutils库:在xlwt和xlrd中,对一个已存在文件进行修改
openpyxl:主要针对xlsx格式的excel进行读取和编辑
官方说法:
网址:http://www.python-excel.org/
3、Excel中的三大对象:
WorkBook:工作簿对象
Sheet:表单对象
Cell:表格对象
excel表格内容:
#导入unittest模块和注册模块函数
importunittestfrom Day13_2020_03_04.pack01.homework_practice.register importregister_testclassTestRegister(unittest.TestCase):"""账号注册类"""
#TestRegister中的init只能传递两个参数,需要重写父类TestRegister的init方法,添加一个参数
#method_name:方法名,case_dat:用例
def __init__(self,method_name,case_data):#将参数传递给实例属性
self.case_date =case_data#对原来的__init__进行获取
super().__init__(method_name)#注册方法
deftest_register(self):#将入参进行参数化,将字符串中的数据进行读取
data = eval(self.case_date["data"])#将预期结果参数化,将字符串中的数据进行读取
excepted = eval(self.case_date["excepted"])#第一步:调用功能函数,传入参数(实际结果),*data将元祖进行拆包
result = register_test(*data)#对比预期结果和实际结果
self.assertEqual(excepted, result)defsetUp(self):#每一条测试用例执行之前都会执行
print("{}开始执行了".format(self))deftearDown(self):#每一条测试用例执行之后都会执行
print("{}执行完了".format(self))
@classmethoddefsetUpClass(cls):#执行这个测试用例类中的测试用例之前会执行
print("{}开始执行测试用例类执行完了".format(cls))
@classmethoddeftearDownClass(cls):#执行测试用例类全部执行完了,就会执行该方法
print("{}执行测试用例类全部执行完了,就会执行该方法".format(cls))#上面已经被注册的账号:python23#入参三个: 账号 密码1 密码2#账号未被注册过,两个密码一样才能注册成功,其他情况都注册失败,对应的结果如下:#注册成功 预期结果:{"code": 1, "msg": "注册成功"}#两次密码不一致 预期结果:{"code": 0, "msg": "两次密码不一致"}#账户已存在 预期结果:{"code": 0, "msg": "该账户已存在"}#密码不在6-18位之间 预期结果:{"code": 0, "msg": "账号和密码必须在6-18位之间"}
#读取excel类
importopenpyxlclassReadExcle(object):def __init__(self,filename,sheetname):
self.filename=filename
self.sheetname=sheetnamedefopen(self):"打开工作薄和表单"self.wb=openpyxl.load_workbook(self.filename)
self.sh=self.wb[self.sheetname]defread_date(self):"读取数据的方法"
#打开文件和工作薄
self.open()#将表单中的内容,按行获取所有的格子
rows =list(self.sh.rows)#创建一个空列表,用例存放所有的用例数据
cases =[]#获取表头放到列表中
title =[]for c inrows[0]:
title.append(c.value)#print(title)
#获取除表头以外的其他行的数据
for r in rows[1:]:#没遍历一行,创建一个列表,用例存放该行的数据
data =[]for c inr:
data.append(c.value)#将表头和该行的数据进行聚合打包,转换字典
case_data =dict(zip(title, data))#将该行的用例数据加入到cases这个列表中
cases.append(case_data)print(cases)#将读取好的数据返回回去
returncasesdefwrite_data(self):"写入数据"
pass
#魔法变量
if __name__ =="__main__":
read= ReadExcle("cases.xlsx","register")
data=read.read_date()print(data)
"""测试程序启动文件
第一步:创建一个测试套件(unittest.TestSuite)
第二步:将测试用例加入到测试套件中
第三步:创建一个测试运行程序对象(unittest.TextTestRunner)
第四步:通过运行程序,去执行测试套件中的测试用例"""
from HTMLTestRunnerNew importHTMLTestRunnerimportunittestfrom Day14_2020_03_05.pack01.test_register_case importTestRegisterfrom Day14_2020_03_05.pack01.read_excel importReadExcle#创建测试套件对象
suite =unittest.TestSuite()#优化测试用例的数据,通过列表不好管理测试用例数据#cases = [#{"data": ("test_0001", "12345678", "12345678"), "excepted": {"code": 1, "msg": "注册成功"}},#{"data": ("test_0001", "12345678", "1234567"), "excepted": {"code": 0, "msg": "两次密码不一致"}},#{"data": ("python23", "1234567", "123456"), "excepted": {"code": 0, "msg": "该账户已存在"}#}#]#我们通过excel对测试数据进行读取#python操作excel
#加载用例到套件#case_data = {"data": ("test_0001", "12345678", "12345678"), "excepted": {"code": 1, "msg": "注册成功"}}
#TestRegister中的init只能传递两个参数,需要重写父类TestRegister的init方法,添加一个参数#对前面的列表cases进行遍历,通过for循环去遍历测试用例数据,每遍历一次就通过测试用例类,去创建一个测试用例对象,然后加载到测试用例里面
read = ReadExcle("cases.xlsx", "register")
cases=read.read_date()for case_data incases:
case= TestRegister("test_register",case_data)
suite.addTest(case)## 第三种方法:将一个模块中的所有测试用例,加载到测试套件#loader = unittest.TestLoader()## login_test_case 标黄不影响#suite.addTest(loader.loadTestsFromModule(test_register_case))
#第四种方法:通过一个目录,去导入改目录下的所有模块中的测试用例#loader = unittest.TestLoader()#r防止转义,注意测试用例的模块名称,要以test开头#suite.addTest(loader.discover(r"D:\project\class23\Day13_2020_03_04\pack01\homework_practice"))
"""stream:测试文件名字
verbosity:
title:报告的标题
description:相关的描述
tester:测试人员姓名"""runner= HTMLTestRunner(stream=open("report.html","wb"),
verbosity=2,
title="python第二份测试报告",
description="注册类测试报告",
tester="chen")#第四步:通过运行程序,去执行测试套件中的测试用例
runner.run(suite)