Пример #1
0
def login():
    """登录,获取 token, member_id"""
    req = RequestsHandler()
    # 登录, 测试账号来登录
    res = req.json('post',
                   # 也可以读取Excel测试数据  采用配置文件,读取配置文件的数据📕
                   config.read('http', 'base_url') + config.read('http', 'login_url'),
                   json={"mobile_phone": config.read('accounts', 'mobile_phone'),
                         "pwd": config.read('accounts', 'password')},
                   headers=eval(config.read('http', 'headers')))
    data = {"token": res['data']['token_info']['token'], "member_id": res['data']['id']}
    return data
Пример #2
0
class Context:
    """保存临时替换的数据 配置文件读取"""
    phone = config.read('accounts', 'mobile_phone')
    pwd = config.read('accounts', 'password')
    member_id = config.read('accounts', 'member_id')

    @property
    def loan_id(self):
        # Context().loan_id
        """查询数据库,获取最新的 loan.id 作为 Context的 loan_id 属性。"""
        db = MyDBHandler()
        loan = db.query("SELECT * FROM loan ORDER BY id DESC;", one=True)  # 根据 id 降序排列
        return str(loan['id'])

    @property
    def above_balance(self):
        db = MyDBHandler()
        user = db.query('SELECT * FROM member WHERE id=%s;', args=[self.member_id])
        return str(user['leave_amount'] + 1)
class TestRecharge(unittest.TestCase):
    # 通过读取配置文件得到 cases.xlsx
    file_name = config.read('excel', 'file_name')
    # 拼接配置文件的路径和名称
    file_path = os.path.join(p_path.DATA_PATH, file_name)
    # Excel 表格名称
    sheet_name = config.read('excel', 'recharge_sheet')
    # url 地址
    url = config.read('http', 'base_url')
    # 读取 headers 信息 获取 请求头
    # TODO  cls.headers['Authorization'] = 'Bearer ' + cls.user_info['token']
    #  TypeError: 'str' object does not support item assignment
    headers = eval(config.read('http', 'headers'))
    # 读取 excel 数据
    test_data = ExcelHandler(file_path).read(sheet_name)

    # 写入,写入
    excel_headers = ExcelHandler(file_path).headers(sheet_name)
    # TODO 写入断言结果的表格
    result_index = excel_headers.index('result')

    # 测试类方法,每一个测试类之前运行一次
    @classmethod
    def setUpClass(cls):
        # HTTP请求
        cls.req = RequestsHandler()
        # 登录 提前准备好的测试账号来登录
        # 1、先登录获取token 用户id member_id
        cls.user_info = login()
        # 2、组装、Authorization 请求头是v2必传需要拼接是由:Bearer + '空格' + token
        cls.headers['Authorization'] = 'Bearer ' + cls.user_info['token']

    @classmethod
    def tearDownClass(cls):
        pass

    def setUp(self):  # 每个用例执行一次
        self.db = MyDBHandler()

    def tearDown(self):  # 每个之后运行,关闭游标和数据连接
        self.db.close()

    @data(*test_data)
    def test_recharge(self, test_info):  # test_info里面是测试文档里的数据

        if '#member_id#' in test_info[
                'data']:  # TypeError: 参数二必须是 str 类型,不能是 int 类型
            test_info['data'] = test_info['data'].replace(
                '#member_id#', str(self.user_info['member_id']))

        if '*wrong_member_id*' in test_info['data']:  # 只要用户id不是他自己就可以了,后面加一
            test_info['data'] = test_info['data'].replace(
                '*wrong_member_id*', str(self.user_info['member_id'] + 1))

        # 3、发送请求  之前需要把表格里的用户member_id进行替换,表格里是“member”占位
        # 5、查询数据库,对比余额,
        # 投资之前金额
        user_info = self.db.query('select * from member where id = %s;',
                                  args=[self.user_info['member_id']])
        amount = user_info['leave_amount']  # 查询数据库获取用户金额

        res = self.req.json(
            test_info['method'],  # 请求方式
            self.url + test_info['url'],  # url地址
            # 测试数据  获取json的默认是字典格式,所以要进行转换
            json=eval(test_info['data']),
            # 读取 headers 信息 标题头 是字符串,需要转化成字典
            headers=self.headers)

        # 4、替换member_id
        self.assertEqual(test_info['expected'], res['code'])

        # 4.1、再次查询数据库,对比两个数据库查到的结果相减 == 投资金额
        # 投资之后金额
        user_info_after = self.db.query('select * from member where id = %s;',
                                        args=[self.user_info['member_id']])
        amount_after = user_info_after['leave_amount']  # 查询数据库获取用户金额

        # 5、查询数据库,对比余额,
        if res['code'] == 0:
            print(amount, amount_after)
            self.assertEqual(amount_after - amount,
                             json.loads(test_info['data'])['amount'])
class TestLogin(unittest.TestCase):
    # 通过读取配置文件得到 cases.xlsx
    file_name = config.read('excel', 'file_name')
    # 拼接配置文件的路径和名称
    file_path = os.path.join(p_path.DATA_PATH, file_name)
    # Excel 表格名称
    sheet_name = config.read('excel', 'login_sheet')
    # url 地址
    url = config.read('http', 'base_url')
    # 读取 headers 信息
    headers = config.read('http', 'headers')
    # 读取 excel 数据
    test_data = ExcelHandler(file_path).read(sheet_name)

    # 测试类方法,每一个测试类之前运行一次
    @classmethod
    def setUpClass(cls):
        # 导入HTTP请求
        cls.req = RequestsHandler()

    def setUp(self):  # 每个用例执行一次
        self.db = MyDBHandler()

    def tearDown(self):  # 每个之后运行,关闭游标和数据连接
        self.db.close()

    @data(*test_data)
    def test_register(self, test_info):

        # 测试数据中有 *exist_phone* 判断数据在数据库中
        if '#phone#' in test_info['data']:
            # 手机号码已存在,查找已存在的手机号
            user = self.db.query('select * from member;')
            # 替换手机号码
            test_info['data'] = test_info['data'].replace(
                '#phone#', user['mobile_phone'])

        # 测试中有'*phone*'
        if '*phone*' in test_info['data']:
            # 正常的测试用例, 生成一个手机号码
            while True:  # 判断数据库中有没有随机生成的号码
                phone = mk_phone()
                user = self.db.query(
                    'select * from member where mobile_phone=%s;',
                    args=[
                        phone,
                    ])
                if not user:
                    break
            # 替换手机号码
            test_info['data'] = test_info['data'].replace('*phone*', phone)

        # 调用 requests 模块访问接口
        res = self.req.json(
            test_info['method'],  # 请求方式
            self.url + test_info['url'],  # url地址
            # 测试数据  获取json的默认是字典格式,所以要进行转换
            json=eval(test_info['data']),
            # 读取 headers 信息 标题头 是字符串,需要转化成字典
            headers=eval(self.headers))
        print(res)
        # 预期结果,实际结果
        self.assertEqual(test_info['expected'], res['msg'])  # 部分断言,判断msg里面的数据
class TestInvest(unittest.TestCase):
    # 读取配置文件
    file_name = config.read('excel', 'file_name')
    file_path = os.path.join(p_path.DATA_PATH, file_name)
    # Excel 表格名称
    sheet_name = config.read('excel', 'invest_sheet')
    # url 地址
    url = config.read('http', 'base_url')
    # 读取 headers 信息 获取 请求头

    headers = eval(config.read('http', 'headers'))
    # 读取 excel 数据
    test_data = ExcelHandler(file_path).read(sheet_name)

    # 写入,写入
    excel_headers = ExcelHandler(file_path).headers(sheet_name)
    # TODO 写入断言结果的表格
    result_index = excel_headers.index('result')

    @classmethod
    def setUpClass(cls):
        cls.req = RequestsHandler()
        # 登录, 测试账号来登录
        cls.user_info = login()
        cls.headers['Authorization'] = 'Bearer ' + cls.user_info['token']

    @classmethod
    def tearDownClass(cls):
        pass

    def setUp(self):  # 每个测试用例执行前运行
        self.db = MyDBHandler()

    def tearDown(self):  # 每个测试用例之后运行
        self.db.close()

    @data(*test_data)
    def test_invest(self, test_info):
        # 1 登录,拿到 token_id, 作为接下来的接口请求头信息
        # 2,创建标
        # 3, 审核标
        # 4, 投资
        # 余额是否相等
        test_info['data'] = replace_label(test_info['data'])
        print(test_info['data'])

        user_info = self.db.query('SELECT * FROM member WHERE id=%s;',
                                  args=[self.user_info['member_id']])
        before_money = user_info['leave_amount']

        res = self.req.json(test_info['method'],
                            self.url + test_info['url'],
                            json=json.loads((test_info['data'])),
                            headers=self.headers)
        # 替换 member_id
        print(res)
        self.assertEqual(test_info['expected'], res['code'])
        if res['code'] == 0 and test_info['url'] == '/member/invest':
            user_info_after = self.db.query(
                'SELECT * FROM member WHERE id=%s;',
                args=[self.user_info['member_id']])
            after_money = user_info_after['leave_amount']
            self.assertEqual(
                before_money - json.loads(test_info['data'])['amount'],
                after_money)
class TestRegister(unittest.TestCase):
    # 通过读取配置文件得到 cases.xlsx
    file_name = config.read('excel', 'file_name')
    # 拼接配置文件的路径和名称
    file_path = os.path.join(p_path.DATA_PATH, file_name)
    # Excel 表格名称
    sheet_name = config.read('excel', 'register_sheet')
    # url 地址
    url = config.read('http', 'base_url')
    # 读取 headers 信息 请求头
    headers = config.read('http', 'headers')
    # 读取 excel 数据
    test_data = ExcelHandler(file_path).read(sheet_name)

    # 写入,写入
    excel_headers = ExcelHandler(file_path).headers(sheet_name)
    # TODO 写入断言结果的表格
    result_index = excel_headers.index('result')

    # 测试类方法,每一个测试类之前运行一次
    @classmethod
    def setUpClass(cls):
        # HTTP请求
        cls.req = RequestsHandler()
        # 初始化日志操作
        cls.logger = logger

    def setUp(self):  # 每个用例执行一次
        # 操作数据库
        self.db = MyDBHandler()

    def tearDown(self):  # 每个用例执行之后运行,
        # 关闭游标和数据连接
        self.db.close()

    @data(*test_data)
    def test_register(self, test_info):  # test_info里面是测试文档里的数据
        # 测试数据中有 *exist_phone* 判断数据在数据库中
        if '*exist_phone*' in test_info['data']:  # 判断数据是否存在表格data里面
            # 去数据库中查找获取一条数据,用来测试手机号码已存在
            user = self.db.query('select * from member;')
            # 把在数据库中查询到的手机号,替换掉 '*exist_phone*'
            test_info['data'] = test_info['data'].replace(
                '*exist_phone*', user['mobile_phone'])

        # 测试中有'#phone#'
        if '#phone#' in test_info['data']:
            # 正常的测试用例, 生成一个手机号码
            while True:  # 判断数据库中有没有随机生成的号码
                phone = mk_phone()  # 获取随机生成的手机号码
                # 查询数据库中是否有随机生成的手机号
                user = self.db.query(
                    'select * from member where mobile_phone=%s;',
                    args=[
                        phone,
                    ])
                # 数据库中没有手机号码就跳出循环
                if not user:
                    break
            # 替换手机号码
            test_info['data'] = test_info['data'].replace('#phone#', phone)

        # 调用 requests 模块HTTP请求访问接口
        res = self.req.json(
            test_info['method'],  # 请求方式 POST
            self.url + test_info['url'],  # url地址
            # 测试数据  获取json的默认是字典格式,所以要进行转换
            json=eval(test_info['data']),
            # 读取 headers 信息 标题头 是字符串,需要转化成字典
            headers=eval(self.headers))
        print(res)

        # 断言 判断
        try:  # 先断言判断是否通过,再把结果写入表格
            self.assertEqual(test_info['expected'], res['code'])  # 只断言code
            # self.assertEqual(json.loads(['expected'])['msg'], res['msg'])  # 模拟断言 msg

            # 记录日志信息
            self.logger.info('断言成功')
            # 写回 Excel        # TODO 拼接配置文件的路径和名称
            ExcelHandler.write(
                self.file_path,
                # TODO 表格名称
                self.sheet_name,
                # TODO 当case_id是‘1’的时候他的行数是‘2’ 需要索引加一
                test_info['case_id'] + 1,
                # TODO 写入的表格数
                self.result_index + 1,
                # TODO 写入的断言结果
                '断言成功')
        except AssertionError as e:
            # 写入断言失败
            # 写回 Excel
            ExcelHandler.write(self.file_path, self.sheet_name,
                               test_info['case_id'] + 1, self.result_index + 1,
                               '断言失败')
            # 记录日志信息
            self.logger.error('断言失败')
            raise e