作业:day16-继续优化day15的作业,将excel的操作加入进来。
1、自己封装一个excel操作类 ;
2、在unitest和ddt的测试中,测试数据从excel当中读取 ;
答案如下:
第一步:设计测试用例,这次加入了小数 ;
第二步:代码层级目录如下:
第三步: 各代码如下:
common.py 代码如下:
import openpyxl # 封装一个xlsx表格操作类 class ExcelHandler: # 操作一个excel表格: # 第一步:打开工作簿 # 第二步:选取表单 # 第三步:读取数据 # 第四步:关闭打开的工作簿 def __init__(self, xlsx_file_path: str): """ 传入一个xlsx文件路径,用load_workbook()方法加载,如果文件加载不成功,抛出异常。如果成功,打开一个工作簿。 :param xlsx_file_path: xlsx文件路径 """ try: self.wb = openpyxl.load_workbook(xlsx_file_path) except FileNotFoundError: print('打开文件失败') raise # 不确定打开的是哪个表单 self.sh = None def close_workbook(self): """ 关闭当前打开的工作簿 :return: """ self.wb.close() def select_sheet_by_name(self, sheet_name: str): """ 根据传入的工作表的名字,打开工作表。 :param sheet_name: 作表的名字 """ self.sh = self.wb[f'{sheet_name}'] def read_all_rows_data(self): """ 从选定的表单当中,第一行作为key. 将后面的每一行数据,与第一行拼接成一个字典数据,作为一条测试用例数据。 将所有测试用例数据,添加到一个列表当中。 :return: 测试用例数据列表 """ # 获取表单的所有行,即获取表单的所有数据 sheet_all_rows = list(self.sh.values) # 把第一行作为数据的keys keys = sheet_all_rows[0] # print(keys) # 定义 cases_list 存放测试用例 cases_list = [] # 以下代码功能:excel表单第2行开始的每一行测试数据,与第一行的keys拼接成一个字典。 # 第一步:把除第一行以外的行都转化为字符串(非字符串—>str,None—>'') temp_all_rows = [] # 定义一个临时变量temp_all_rows,用来存放转化后的所有行 ; for single_row in sheet_all_rows[1:]: # 把元组类型的single_row转化为列表temp_single_row temp_single_row = list(single_row) for i in range(len(temp_single_row)): if temp_single_row[i] is None: temp_single_row[i] = '' if not isinstance(temp_single_row[i], str): temp_single_row[i] = str(temp_single_row[i]) temp_all_rows.append(temp_single_row) # print(temp_all_rows) # 第二步:以下代码片段是把第一行作为keys,其余的行作为values,用zip函数构造成字典 for temp_single_row in temp_all_rows: one_case = dict(zip(keys, temp_single_row)) cases_list.append(one_case) return cases_list if __name__ == '__main__': eh = ExcelHandler(r'D:\SkyWorkSpace\WorkSpace\Unittest\Temp\day015\unittest_ddt_html_xlsx\test_register_cases.xlsx') eh.select_sheet_by_name('register_case') print(eh.read_all_rows_data()) eh.close_workbook()
register.py 代码如下:
# 测试需求2:(不用你们实现,这是测试对象) users = [{'user': 'python26', 'password': '123456'}] def register(username, password1, password2): # 判断是否有参数为空 if not all([username, password1, password2]): return {"code": 0, "msg": "所有参数不能为空"} # 注册功能 for user in users: # 遍历出所有账号,判断账号是否存在 if username == user['user']: # 账号存在 return {"code": 0, "msg": "该账户已存在"} else: if password1 != password2: # 两次密码不一致 return {"code": 0, "msg": "两次密码不一致"} else: # 账号不存在 密码不重复,判断账号密码长度是否在 6-18位之间 if 6 <= len(username) >= 6 and 6 <= len(password1) <= 18: # 注册账号 users.append({'user': username, 'password': password2}) return {"code": 1, "msg": "注册成功"} else: # 账号密码长度不对,注册失败 return {"code": 0, "msg": "账号和密码必须在6-18位之间"} """ 函数入参: 注意:参数传字符串类型,不需要考虑其他类型。 参数1:账号 参数2:密码1 参数2:密码2 函数内部处理的逻辑: 判断是否有参数为空, 判断账号密码是否在6-18位之间, 判断账号是否被注册过, 判断两个密码是否一致。 上面添加都校验通过才能注册成功,其他情况都注册失败, 各种情况的返回结果如下: 注册成功 返回结果:{"code": 1, "msg": "注册成功"} 有参数为空, 返回结果 {"code": 0, "msg": "所有参数不能为空"} 两次密码不一致 返回结果:{"code": 0, "msg": "两次密码不一致"} 账户已存在 返回结果:{"code": 0, "msg": "该账户已存在"} 密码不在6-18位之间 返回结果:{"code": 0, "msg": "账号和密码必须在6-18位之间"} 账号不在6-18位之间 返回结果:{"code": 0, "msg": "账号和密码必须在6-18位之间"} 作业要求:请设计用例,对此功能函数进行单元测试, 提示:上面已经被注册的账号:python26。 提示:了解实现逻辑即可,即便函数本身有bug,也不要改函数里面的代码,直接复制过去就好。 不同的测试用例顺序,会有不同的测试结果哦!! 作业涵盖3个文件:register.py 为上面的功能函数。 test_register.py为测试用例文件。 """
run_test.py 代码如下:
# 用第三方html报告: https://gitee.com/lemon-test-official/unittestreport import os import unittestreport import unittest # 用 os.path 获取文件所在目录 file_path = os.path.realpath('__file__') file_dir = os.path.dirname(file_path) # 1、加载测试用例到套件中 suite = unittest.defaultTestLoader.discover(file_dir) # 2、创建一个用例运行程序 runner = unittestreport.TestRunner(suite, tester='测试人员—小柠檬', filename="register函数测试报告_样式1", report_dir="./reports", title='register函数测试报告', desc='register函数单元测试报告', templates=1) # 3、运行测试用例 runner.run()
test_register.py 代码如下:
import unittest import register from ddt import ddt, data import common import os @ddt class TestRegister(unittest.TestCase): # 用os.path找到 xlsx 文件 file_dir = os.path.dirname(os.path.realpath('__file__')) file_name = os.path.join(file_dir, 'test_register_cases.xlsx') # 调用common中已封装好的ExcelHandler类来操作excel表格 # 1、打开xlsx表格;2、根据表单名字获取表格数据;3、读取数据; excel_handler = common.ExcelHandler(file_name) excel_handler.select_sheet_by_name('register_case') all_cases = excel_handler.read_all_rows_data() # print(all_cases) @data(*all_cases) def test_register(self, case): actual_results = register.register(case['username'], case['password1'], case['password2'])['msg'] self._testMethodDoc = case['case_name'] self.assertEqual(case['expected_results'], actual_results) @classmethod def tearDownClass(cls): # 关闭excel 工作簿 cls.excel_handler.close_workbook()
在 run_test.py 中run,执行结果如下: