一、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模块和注册模块函数 import unittest from Day13_2020_03_04.pack01.homework_practice.register import register_test class TestRegister(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) # 注册方法 def test_register(self): # 将入参进行参数化,将字符串中的数据进行读取 data = eval(self.case_date["data"]) # 将预期结果参数化,将字符串中的数据进行读取 excepted = eval(self.case_date["excepted"]) # 第一步:调用功能函数,传入参数(实际结果),*data将元祖进行拆包 result = register_test(*data) # 对比预期结果和实际结果 self.assertEqual(excepted, result) def setUp(self): # 每一条测试用例执行之前都会执行 print("{}开始执行了".format(self)) def tearDown(self): # 每一条测试用例执行之后都会执行 print("{}执行完了".format(self)) @classmethod def setUpClass(cls): # 执行这个测试用例类中的测试用例之前会执行 print("{}开始执行测试用例类执行完了".format(cls)) @classmethod def tearDownClass(cls): # 执行测试用例类全部执行完了,就会执行该方法 print("{}执行测试用例类全部执行完了,就会执行该方法".format(cls)) # 上面已经被注册的账号:python23 # 入参三个: 账号 密码1 密码2 # 账号未被注册过,两个密码一样才能注册成功,其他情况都注册失败,对应的结果如下: # 注册成功 预期结果:{"code": 1, "msg": "注册成功"} # 两次密码不一致 预期结果:{"code": 0, "msg": "两次密码不一致"} # 账户已存在 预期结果:{"code": 0, "msg": "该账户已存在"} # 密码不在6-18位之间 预期结果:{"code": 0, "msg": "账号和密码必须在6-18位之间"}
# 读取excel类 import openpyxl class ReadExcle(object): def __init__(self,filename,sheetname): self.filename = filename self.sheetname = sheetname def open(self): "打开工作薄和表单" self.wb = openpyxl.load_workbook(self.filename) self.sh = self.wb[self.sheetname] def read_date(self): "读取数据的方法" # 打开文件和工作薄 self.open() # 将表单中的内容,按行获取所有的格子 rows = list(self.sh.rows) # 创建一个空列表,用例存放所有的用例数据 cases = [] # 获取表头放到列表中 title = [] for c in rows[0]: title.append(c.value) # print(title) # 获取除表头以外的其他行的数据 for r in rows[1:]: # 没遍历一行,创建一个列表,用例存放该行的数据 data = [] for c in r: data.append(c.value) # 将表头和该行的数据进行聚合打包,转换字典 case_data = dict(zip(title, data)) # 将该行的用例数据加入到cases这个列表中 cases.append(case_data) print(cases) # 将读取好的数据返回回去 return cases def write_data(self): "写入数据" pass # 魔法变量 if __name__ =="__main__": read = ReadExcle("cases.xlsx","register") data = read.read_date() print(data)
""" 测试程序启动文件 第一步:创建一个测试套件(unittest.TestSuite) 第二步:将测试用例加入到测试套件中 第三步:创建一个测试运行程序对象(unittest.TextTestRunner) 第四步:通过运行程序,去执行测试套件中的测试用例 """ from HTMLTestRunnerNew import HTMLTestRunner import unittest from Day14_2020_03_05.pack01.test_register_case import TestRegister from Day14_2020_03_05.pack01.read_excel import ReadExcle # 创建测试套件对象 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 in cases: 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:projectclass23Day13_2020_03_04pack01homework_practice")) """ stream:测试文件名字 verbosity: title:报告的标题 description:相关的描述 tester:测试人员姓名 """ runner = HTMLTestRunner(stream=open("report.html","wb"), verbosity=2, title="python第二份测试报告", description="注册类测试报告", tester="chen") # 第四步:通过运行程序,去执行测试套件中的测试用例 runner.run(suite)