day16作业:  将day15的作业优化。加上ddt和html测试报告, 操作excel表格

说明:操作 xlsx表格 属于下节课内容,可不用表格保存测试数据;只需要用ddt、html 完成作业即可。

 

ddt数据驱动时,使用unittestreport库生成html测试报告,关于用例描述,作者木森 有说明,如下:

原文:https://unittestreport.readthedocs.io/en/latest/doc5_ddt/

第一步:沿用 day14 已设计好的测试用例表格 ( test_register_cases.xlsx ),如下:

第一步:沿用 day14 已设计好的测试用例表格 ( test_register_cases.xlsx ),如下:

第二步:建立项目结构,含一个存放测试报告的 reports 目录,目录如下:

第三步:安装相关的 第三方库:

a、openpyxl   : 操作xlsx表格用 ;

b、unittestreport  :生成html测试报告用  ;

c、ddt  : 数据驱动用 ;

第4步:写代码,各py文件代码如下:

a、被测函数  register.py  代码如下(讲师提供) :

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位之间"}

#
if __name__ == "__main__":
    res = register('python28', '123456', '123456')
    print(res)

b、common.py 代码( 封装,获取xlsx表格数据  )如下:

import openpyxl


def get_cases_from_xlsx():
    """
    用做读取 test_register_cases.xlsx 表格数据,返回一个 cases 列表
    :return:
    """
    # 读取excel中的数据
    # 第一步:打开工作簿
    # 表格的行、列
    wb = openpyxl.load_workbook('test_register_cases.xlsx')

    # 第二步:选取表单
    sh = wb['register_case']

    cases = []
    # 第三步:读取数据
    for row in range(2, sh.max_row+1):
        dict_temp = {}
        data = []

        for column in range(2, sh.max_column+1):
            if column == 2:
                dict_temp['title'] = sh.cell(row=row, column=column).value
            if column == 3:
                data_username = sh.cell(row=row, column=column).value
                # 如果读取到的用户名为None,把None替换成''
                if data_username is None:
                    data.append('')
                else:
                    data.append(data_username)
            if column == 4:
                data_password1 = sh.cell(row=row, column=column).value
                # 如果读取到的密码1为None,把None替换成''
                if data_password1 is None:
                    data.append('')
                else:
                    data.append(str(data_password1))
            if column == 5:
                data_password2 = sh.cell(row=row, column=column).value
                # 如果读取到的密码2为None,把None替换成''
                if data_password2 is None:
                    data.append('')
                else:
                    data.append(str(data_password2))
            if column == 6:
                dict_temp['expected'] = sh.cell(row=row, column=column).value
        dict_temp['data'] = data
        # print(dict_temp)
        cases.append(dict_temp)
    return cases


if __name__ == '__main__':
    print(get_cases_from_xlsx())

c、test_register.py 代码如下:

import unittest
from unittestreport import ddt, list_data
import register
import common


@ddt
class TestClass(unittest.TestCase):

    # 以下 data 在第2个位置或第3个位置都适配 unittestreport 中的 list_data;
    # cases = [{'title': '验证 用户名已经被注册', 'data': ['python26', '123456', '123456'], 'expected': '该账户已存在'},
    #          {'title': '验证 正确的用户名、密码', 'data': ['test123', '1234567', '1234567'], 'expected': '注册成功'},
    #          ]
    # cases = [{'title': '验证 用户名已经被注册', 'expected': '该账户已存在', 'data': ['python26', '123456', '123456']},
    #          {'title': '验证 正确的用户名、密码', 'expected': '注册成功', 'data': ['test123', '1234567', '1234567']},
    #          ]

    # 调用common中已封装好的方法get_cases_from_xlsx() 获取测试数据
    cases = common.get_cases_from_xlsx()

    @list_data(cases)
    def test_register(self, data):
        actual_results = register.register(*data['data'])['msg']
        self.assertEqual(data['expected'], actual_results)

d、run_test.py 代码如下:

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='测试人员—nicole',
                                   filename="register函数测试报告_样式2",
                                   report_dir="./reports",
                                   title='register函数测试报告',
                                   desc='register函数单元测试报告',
                                   templates=2)

# 3、运行测试用例
runner.run()

e、执行结果如下:

生成的测试报告,如下:

 

posted @ 2022-01-26 15:59  nicole_cute  阅读(80)  评论(0)    收藏  举报