pytest失败继续 pytest addoption_读取excel

 

 

 这个错误,每次都犯这种低级错误,我怎么这么菜!

# 创建测试集合
suite=unittest.TestSuite  # 报错就是因为这个没有加括号
正确代码:
suite=unittest.TestSuite()

再贴一下unittest框架做单元测试的步骤吧

一、要测试的功能:比如说注册,函数名register,写在lianxi文件夹里面哦
users = [{'user': 'python', 'password': '123456'}]


def register(username, password1, password2):
    # 注册功能
    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位之间"}
二、写测试用例:testcase.py
import unittest
#从lianxi文件夹里导入register模块里的register函数
from lianxi.register import register

class RegisterTestCase(unittest.TestCase):

    def __init__(self, methodName, excpeted, data):
        self.excepted = excpeted
        self.data = data
        super().__init__(methodName)

    def test_register(self):
        res = register(*self.data)
        try:
            self.assertEqual(self.excepted, res)
        except AssertionError as e:
            print('该用例测试未通过')
            raise e
        else:
            print('该用例测试通过')


if __name__ == '__main__':
    unittest.main()

测试数据写在excel表 cases.xlsx 中,以后用代码去读取表中数据,请看下面的(三)

pytest失败继续 pytest addoption_数据_02

 

 

三、写读取excel表的类:read_excel.py
"""
封装一个读取用例的excel类

# 实现读取用例数据

# 实现写入数据的功能
"""
import openpyxl


class Case:
    # 这个类用来存储用例
    def __init__(self, attrs):
        """
        初始化用例
        :param attrs: zip类型-->[(key,value),(key1,value1)....]
        """
        for item in attrs:
            setattr(self, item[0], item[1])


class ReadExcel(object):
    """
    读取excel数据
    """
    def __init__(self, file_name, sheet_name):
        """
        这个是用例初始化读取对象的
        :param file_name:  文件名字  -->  str
        :param sheet_name: 表单名字  -->  str
        """
        self.file_name  = file_name
        # 打开工作簿
        self.wb = openpyxl.load_workbook(file_name)
        # 选择表单
        self.sheet = self.wb[sheet_name]

    def __del__(self):
        # 特殊的方法,在对象销毁的之后执行
        # 关闭文件
        self.wb.close()


    def read_data_obj(self, list1):
        # list1 参数为一个列表,传入的是指定读取数据的列,比如[1,2,3]
        # 每一行[1,3,5]列的数据,读取出来就作为一条测试用例,放在对象的属性中
        # 所有的用例对象放在列表中并且进行返回
        max_r = self.sheet.max_row
        # 定义一个空列表,用来存放所有用例
        cases = []
        titles = []  # 定义一个空列表,用来存放表头
        # 遍历出所有的行
        for row in range(1, max_r + 1):
            # 判断是否是第一行
            if row != 1:
                case_data = []  # 定义一个空列表,用来存放该行的数据
                for column in list1:
                    info = self.sheet.cell(row, column).value
                    case_data.append(info)
                # 将该条数据和表头进行打包组合,
                case = list(zip(titles, case_data))
                # 将一条用例存入一个对象中(每一列对应对象的一个属性)
                # case_obj=Case()
                # for i in case:
                #     setattr(case_obj,i[0],i[1]) # 这一部分已经写到类定义的地方去了
                # 不用上面注释的,直接像下面这样传入就可以了
                case_obj = Case(case)
                cases.append(case_obj)
            else:
                for column in list1:
                    title = self.sheet.cell(row, column).value
                    titles.append(title)
        return cases # 所有的用例对象放在列表中并且进行返回
四、创建测试集合并执行: suite.py
import unittest
from lianxi.testcase import RegisterTestCase
from HTMLTestRunnerNew import HTMLTestRunner #测试报告模块
from lianxi.read_excel import ReadExcel

# 创建测试集合
suite=unittest.TestSuite()  # 报错就是因为这个没有加括号
# 读取excel中的数据
r = ReadExcel('cases.xlsx','Sheet1')
cases = r.r_data_obj_new([2,3])
# print(cases)
# 把每条用例遍历出来
for case in cases:
    # suite.addTest(RegisterTestCase('test_register'))
    suite.addTest(RegisterTestCase("test_register", eval(case.excepted),eval(case.data)))

# 执行测试集合
with open('old_reports.html', 'wb') as f:
    runner = HTMLTestRunner(
        stream=f,
        verbosity=2,
        title='old_report',
        description='旧的测试报告',
        tester='Layla_zyh')
    runner.run(suite)