016、py43-day16-sky-20210828 (三) (unittest框架,ddt,html,操作xlsx表格)

 

作业:day16-继续优化day15的作业,将excel的操作加入进来。

1、自己封装一个excel操作类 ;

2、在unitest和ddt的测试中,测试数据从excel当中读取 ;

 

答案如下:

第一步:设计测试用例,这次加入了小数016、py43-day16-sky-20210828 (三)  (unittest框架,ddt,html,操作xlsx表格)

 

第二步:代码层级目录如下:

016、py43-day16-sky-20210828 (三)  (unittest框架,ddt,html,操作xlsx表格)

 

第三步: 各代码如下:

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,执行结果如下:

016、py43-day16-sky-20210828 (三)  (unittest框架,ddt,html,操作xlsx表格)

 

上一篇:django集成Apscheduler


下一篇:配置本地DNS服务器地址