ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-08-28 22:01:26  阅读:212  来源: 互联网

标签:xlsx temp unittest register sky single file self row


 

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

 

标签:xlsx,temp,unittest,register,sky,single,file,self,row
来源: https://www.cnblogs.com/qq-2780619724/p/15201293.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有