Example #1
0
class TestLoans(unittest.TestCase):
    excel = HandleExcel(case_file, "loans")
    cases = excel.read_data()
    db = HandleMysql()
    @data(*cases)
    def test_loans(self, case):
        # 第一步:准备用例数据
        url = conf.get("env", "url") + case["url"]
        method = case["method"]
        data = eval(replace_data(case["data"]))
        # 替换参数中的用户id
        headers = eval(conf.get("env", "headers"))
        expected = eval(case["expected"])
        row = case["case_id"] + 1
        # 第二步:发送请求,获取结果
        response = request(url=url, method=method, params=data, headers=headers)
        res = response.json()
        print(response.url)
        # 第三步:断言(比对预期结果和实际结果)
        try:
            self.assertEqual(expected["code"], res["code"])
            self.assertEqual(expected["msg"], res["msg"])
            # 断言返回的数据的条数
            self.assertEqual(expected["len"],len(res["data"]))
        except AssertionError as e:
            # print("预期结果:", expected)
            # print("实际结果:", res)
            self.excel.write_data(row=row, column=8, value="未通过")
            log.error("用例:{},执行未通过".format(case["title"]))
            log.exception(e)
            raise e
        else:
            self.excel.write_data(row=row, column=8, value="通过")
            log.info("用例:{},执行通过".format(case["title"]))
class TestUpdate(unittest.TestCase):
    excel = HandleExcel(case_file, "update")
    cases = excel.read_data()
    db = HandleMysql()

    @classmethod
    def setUpClass(cls):
        # 1、准备登录的数据
        url = conf.get("env", "url") + "/member/login"
        data = {
            "mobile_phone": conf.get("test_data", "phone"),
            "pwd": conf.get("test_data", "pwd")
        }
        headers = eval(conf.get("env", "headers"))
        # 3、发送请求,进行登录
        response = request(url=url, method="post", json=data, headers=headers)
        # 获取返回的数据
        res = response.json()
        # 3、提取token,保存为类属性
        token = jsonpath.jsonpath(res, "$..token")[0]
        token_type = jsonpath.jsonpath(res, "$..token_type")[0]
        # 将提取到的token设为类属性
        EnvData.token_value = token_type + " " + token
        # 提取用户的id,保存为类属性
        EnvData.member_id = str(jsonpath.jsonpath(res, "$..id")[0])

    @data(*cases)
    def test_update(self, case):
        # 第一步:准备用例数据
        url = conf.get("env", "url") + case["url"]
        method = case["method"]
        data = eval(replace_data(case["data"]))
        # 替换参数中的用户id
        headers = eval(conf.get("env", "headers"))
        headers["Authorization"] = getattr(EnvData, "token_value")
        # 在请求头中加入setupclass中提取出来的token
        expected = eval(case["expected"])
        row = case["case_id"] + 1
        # 第二步:发送请求,获取结果
        print("请求参数为:", data, type(data))
        response = request(url=url, method=method, json=data, headers=headers)
        res = response.json()
        # 第三步:断言(比对预期结果和实际结果)
        try:
            self.assertEqual(expected["code"], res["code"])
            self.assertEqual(expected["msg"], res["msg"])
        except AssertionError as e:
            print("预期结果:", expected)
            print("实际结果:", res)
            self.excel.write_data(row=row, column=8, value="未通过")
            log.error("用例:{},执行未通过".format(case["title"]))
            log.exception(e)
            raise e
        else:
            self.excel.write_data(row=row, column=8, value="通过")
            log.info("用例:{},执行通过".format(case["title"]))
Example #3
0
class Test_Projects(unittest.TestCase):
    excel=Handle_Excel(os.path.join(DATA_DIR,"cases.xlsx"),"projects")
    cases=excel.read_excle()
    db=HandleMysql()

    @classmethod
    def setUpClass(cls):
        # 调用登录获取token
        cls.token=TestLogin.testlogin()
    @data(*cases)
    def test_projects(self,case):
        #准备数据
        url=conf.get("env","url")+case["url"]
        method=case["method"]
        # 随机生成一个项目名称替换
        name=self.random_name()
        setattr(EnvData,"name",name)
        data=eval(replace_data(case["data"]))
        headers = {"Authorization":self.token}
        excepted=eval(replace_data(case["expected"]))
        row_id=case["case_id"]+1
        #发送请求
        response=request(method=method,url=url,json=data,headers=headers)
        res=response.json()
        #断言
        try:
            # 调用断言的方法进行断言
            assert_dict(excepted,res)
            # 判断是否需要进行sql校验,如果有sql语句,需要去数据库查询一下是否有一条该项目的数据
            if case["check_sql"]:
                sql = replace_data(case["check_sql"])
                res_namecount = self.db.find_count(sql)
                self.assertEqual(1, res_namecount)
        except AssertionError as e:
            self.excel.wirte_excel(row=row_id, column=8, value="不通过")
            my_log.error("用例{},{},不通过".format(case["case_id"], case["title"]))
            my_log.debug("预期结果:{}".format(excepted))
            my_log.debug("实际结果:{}".format(res))
            my_log.exception(e)
            # exception将捕获到异常记录到日志中(对应的等级是error)
            # 主动抛出异常
            raise e
        else:
            self.excel.wirte_excel(row=row_id, column=8, value="通过")
            my_log.info("用例{},{},通过".format(case["case_id"], case["title"]))

    #  随机生成一个数据库未注册的项目名称
    @classmethod
    def random_name(cls):
        while True:
            randomnum = str(random.randint(0, 10000))
            name = "微信小程序项目"+randomnum
            sql = 'SELECT * FROM test.tb_projects WHERE name="{}"'.format(name,encoding='utf-8')
            res=cls.db.find_count(sql)
            if res==0:
                return name
class Test_Register_login(unittest.TestCase):
    excel = Handle_Excel(os.path.join(DATA_DIR, "cases.xlsx"),
                         "register_login")
    cases = excel.read_excle()
    db = HandleMysql()

    @data(*cases)
    def test_register_login(self, case):
        # 准备数据
        url = conf.get("env", "url") + case["url"]
        method = case["method"]
        # 随机生成一个用户名和邮箱,保存为类属性
        username = self.random_username()
        email = self.random_email()
        # 登录成功的用例直接用上一条注册成功的用户名登录,登录成功的那条用例不需要新生成用户名
        if case["title"] != "登录成功":
            setattr(EnvData, "username", username)
            setattr(EnvData, "email", email)
        case["data"] = replace_data(case["data"])
        data = eval(case["data"])
        # 注册成功的预期结果比对了username,这个username是随机生成的,所以设置了动态参数获取
        case["expected"] = replace_data(case["expected"])
        excepted = eval(case["expected"])
        row_id = case["case_id"] + 1
        # 发送请求
        response = request(method=method, url=url, json=data)
        res = response.json()
        # 断言
        try:
            # 调用断言的方法进行断言
            assert_dict(excepted, res)
            # 判断是否需要进行sql校验,如果有sql语句,需要去数据库查询一下是否有一条该用户名的数据
            if case["check_sql"]:
                sql = replace_data(case["check_sql"])
                res_namecount = self.db.find_count(sql)
                self.assertEqual(1, res_namecount)
        except AssertionError as e:
            self.excel.wirte_excel(row=row_id, column=8, value="不通过")
            my_log.error("用例{},{},不通过".format(case["case_id"], case["title"]))
            my_log.debug("预期结果:{}".format(excepted))
            my_log.debug("实际结果:{}".format(res))
            my_log.exception(e)
            # exception将捕获到异常记录到日志中(对应的等级是error)
            # 主动抛出异常
            raise e
        else:
            self.excel.wirte_excel(row=row_id, column=8, value="通过")
            my_log.info("用例{},{},通过".format(case["case_id"], case["title"]))

    #  随机生成一个数据库未注册的用户名
    @classmethod
    def random_username(cls):
        while True:
            randomname = str(random.randint(0, 10000000))
            name = "dingqin" + randomname
            sql = 'SELECT * FROM test.auth_user WHERE username="******"'.format(
                name, encoding='utf-8')
            res = cls.db.find_count(sql)
            if res == 0:
                return name

    #  随机生成一个数据库未注册的邮箱
    @classmethod
    def random_email(cls):
        while True:
            randomemail = str(random.randint(0, 999999999))
            add_email = ["@qq.com", "@163.com", "@sina.com"]
            lenth = len(add_email)
            randomname = random.randint(0, lenth - 1)
            reg_name = add_email[randomname]
            email = randomemail + reg_name
            sql = 'SELECT * FROM test.auth_user WHERE email="{}"'.format(
                email, encoding='utf-8')
            res = cls.db.find_count(sql)
            if res == 0:
                return email
Example #5
0
"""
============================
Author:柠檬班-木森
Time:2020/3/26   21:44
E-mail:[email protected]
Company:湖南零檬信息技术有限公司
============================
"""

import random
from common.handle_db import HandleMysql

db = HandleMysql()


def random_phone():
    """生成一个数据库里面未注册的手机号码"""

    while True:
        phone = "155"
        for i in range(8):
            r = random.randint(0, 9)
            phone += str(r)
        sql = "SELECT * FROM futureloan.member WHERE mobile_phone={}".format(
            phone)
        res = db.find_count(sql)
        if res == 0:
            return phone


res = random_phone()
Example #6
0
class TestAudit(unittest.TestCase):
    excel = HandleExcel(os.path.join(DATA_DIR, "apicases.xlsx"), "audit")
    cases = excel.read_excel()
    db = HandleMysql()

    @classmethod
    def setUpClass(cls):
        """普通用户和管理员用户登录"""
        # 普通用户登录
        # 数据准备
        url = conf.get("env", "BASE_URL") + "member/login"
        data = {"mobile_phone": conf.get("test_phone", "phone"), "pwd": conf.get("test_phone", "pwd")}
        headers = eval(conf.get("env", "headers"))
        response = requests.request(method="post", url=url, json=data, headers=headers)
        res1 = response.json()
        # 普通用户member_id和token获取
        user_member_id = jsonpath.jsonpath(res1, "$..id")[0]
        user_token = "Bearer" + " " + jsonpath.jsonpath(res1, "$..token")[0]
        # 管理员用户登录
        data2 = {"mobile_phone": conf.get("test_phone", "admin_phone"), "pwd": conf.get("test_phone", "admin_pwd")}
        response2 = requests.request(method="post", url=url, json=data2, headers=headers)
        res2 = response2.json()
        print(res2)
        # 管理员member_id和token获取
        admin_member_id = jsonpath.jsonpath(res2, "$..id")[0]
        admin_token = "Bearer" + " " + jsonpath.jsonpath(res2, "$..token")[0]
        # member_id和token存储
        setattr(EnvData, "user_member_id", user_member_id)
        setattr(EnvData, "user_token", user_token)
        setattr(EnvData, "admin_member_id", admin_member_id)
        setattr(EnvData, "admin_token", admin_token)

    def setUp(self):
        # 每条用例之前的前置条件:添加一个新的项目
        url = conf.get("env", "BASE_URL") + "/loan/add"
        data = {"member_id": getattr(EnvData, "user_member_id"), "title": "借钱实现财富自由", "amount": 2000, "loan_rate": 12.0,
                "loan_term": 3, "loan_date_type": 1, "bidding_days": 5}
        headers = eval(conf.get("env", "headers"))
        headers["Authorization"] = getattr(EnvData, "user_token")
        response = requests.request(method="post", url=url, json=data, headers=headers)
        res = response.json()
        # 项目的id存储为环境变量
        setattr(EnvData, "loan_id", str(jsonpath.jsonpath(res, "$..id")[0]))

    @data(*cases)
    def test_audit(self, case):
        # 第一步:准备测试数据
        # 调用方法
        method = case["method"]
        # 调用地址
        url = conf.get("env", "BASE_URL") + case["url"]
        # 调用参数
        data = eval(replace_data(case["data"]))
        # 调用信息头
        headers = eval(conf.get("env", "headers"))
        headers["Authorization"] = getattr(EnvData, "admin_token")
        # 预期结果
        expected = eval(case["expected"])
        # 是否有数据库校验
        if case["check_sql"]:
            sql = replace_data(case["check_sql"])
            start_count = self.db.find_count(sql)
        # 回写的行
        row = case["case_id"] + 1
        # 第二步:接口调用
        response = requests.request(method=method, url=url, json=data, headers=headers)
        res = response.json()
        if case["title"] == "审核通过" and res["msg"] == "OK":
            # 判断有“审核通过”的案例,已经审核通过,保存项目id
            setattr(EnvData, "pass_loan_id", str(data["loan_id"]))
            print("------------------------",EnvData.pass_loan_id)
        # 第三步:断言和回写
        try:
            self.assertEqual(expected["code"], res["code"])
            self.assertEqual(expected["msg"], res["msg"])
            # 是否需要数据库校验
            if case["check_sql"]:
                sql = replace_data(case["check_sql"])
                status = self.db.find_one(sql)["status"]
                self.assertEqual(expected["status"], status)
        except AssertionError as e:
            # 结果回写excel中
            log.error("用例--{}--执行未通过".format(case["title"]))
            log.debug("预期结果:{}".format(expected))
            log.debug("实际结果:{}".format(res))
            log.exception(e)
            self.excel.write_excel(row=row, column=8, value="未通过")
            raise e
        else:
            # 结果回写excel中
            log.info("用例--{}--执行通过".format(case["title"]))
            self.excel.write_excel(row=row, column=8, value="通过")
class Test_Name_email_exist(unittest.TestCase):
    excel = Handle_Excel(os.path.join(DATA_DIR, "cases.xlsx"),
                         "name_email_exist")
    cases = excel.read_excle()
    db = HandleMysql()

    @data(*cases)
    def test_name_email_exist(self, case):
        # 准备数据
        # 随机生成一个用户名,保存为类属性
        username = self.random_username()
        setattr(EnvData, "username", username)
        # 随机生成一个email,保存为类属性
        email = self.random_email()
        setattr(EnvData, "email", email)
        url = conf.get("env", "url") + replace_data(case["url"])
        method = case["method"]
        # 随机生成的用户名去数据库查询,如果能查到count为1.否则为0,然后替换掉expected中的count
        if case["check_sql"]:
            sql = replace_data(case["check_sql"])
            namecount = self.db.find_count(sql)
            if namecount == 0:
                count = 0
                setattr(EnvData, "count", str(count))
            else:
                count = 1
                setattr(EnvData, "count", str(count))
        # 注册成功的预期结果比对了username,这个username是随机生成的,所以设置了动态参数获取
        case["expected"] = replace_data(case["expected"])
        excepted = eval(case["expected"])
        row_id = case["case_id"] + 1

        # 发送请求
        response = request(method=method, url=url)
        res = response.json()

        # 断言
        try:
            # 调用断言的方法进行断言
            assert_dict(excepted, res)
        except AssertionError as e:
            self.excel.wirte_excel(row=row_id, column=7, value="不通过")
            my_log.error("用例{},{},不通过".format(case["case_id"], case["title"]))
            my_log.debug("预期结果:{}".format(excepted))
            my_log.debug("实际结果:{}".format(res))
            my_log.exception(e)
            # exception将捕获到异常记录到日志中(对应的等级是error)
            # 主动抛出异常
            raise e
        else:
            self.excel.wirte_excel(row=row_id, column=7, value="通过")
            my_log.info("用例{},{},通过".format(case["case_id"], case["title"]))

    #  随机生成一用户名
    @classmethod
    def random_username(cls):
        while True:
            randomname = str(random.randint(0, 6000000))
            name = "dingqin" + randomname
            return name

    #  随机生成一个数据库未注册的邮箱
    @classmethod
    def random_email(cls):
        while True:
            randomemail = str(random.randint(0, 999999999))
            add_email = ["@qq.com", "@163.com", "@sina.com"]
            lenth = len(add_email)
            randomname = random.randint(0, lenth - 1)
            reg_name = add_email[randomname]
            email = randomemail + reg_name
            sql = 'SELECT * FROM test.auth_user WHERE email="{}"'.format(
                email, encoding='utf-8')
            res = cls.db.find_count(sql)
            if res == 0:
                return email
Example #8
0
class TestLogin(unittest.TestCase):
    excel = HandleExcel(case_file, "invest")
    cases = excel.read_data()
    db = HandleMysql()

    @data(*cases)
    def test_login(self, case):
        # 第一步:准备用例数据
        url = conf.get("env", "url") + case["url"]
        method = case["method"]
        case["data"] = replace_data(case["data"])
        data = eval(case["data"])
        headers = eval(conf.get("env", "headers"))
        # 判断是否是登录接口,不是登录接口则需要添加token
        if case["interface"] != "login":
            headers["Authorization"] = getattr(EnvData, "token_value")

        expected = eval(case["expected"])
        row = case["case_id"] + 1
        # 获取需要sql校验的数据:
        if case["check_sql"]:
            sql1 = "SELECT * FROM futureloan.member where id={}".format(
                EnvData.member_id)
            sql2 = "SELECT * FROM futureloan.invest WHERE member_id={} and loan_id={}".format(
                EnvData.member_id, EnvData.loan_id)
            sql3 = "SELECT * FROM futureloan.financelog WHERE pay_member_id={}".format(
                EnvData.member_id)
            # 获取开始的用户余额
            start_amount = self.db.find_one(sql1)["leave_amount"]
            # 获取开始的投资记录条数
            start_invest = self.db.find_count(sql2)
            # 获取用户开始的流水记录条数
            start_fin = self.db.find_count(sql3)

        # 第二步:发送请求,获取结果
        response = request(url=url, method=method, json=data, headers=headers)
        res = response.json()
        # 发送请求后,判断是否是登陆接口
        if case["interface"].lower() == "login":
            # 提取用户id保存为类属性
            EnvData.member_id = str(jsonpath.jsonpath(res, "$..id")[0])
            token = jsonpath.jsonpath(res, "$..token")[0]
            token_type = jsonpath.jsonpath(res, "$..token_type")[0]
            # 提取token,保存为类属性
            EnvData.token_value = token_type + " " + token
        # 判断是否是加标的用例,如果是的则请求标id
        if case["interface"] == "add":
            EnvData.loan_id = str(jsonpath.jsonpath(res, "$..id")[0])
        # 第三步:断言(比对预期结果和实际结果)
        try:
            self.assertEqual(expected["code"], res["code"])
            self.assertIn(expected["msg"], res["msg"])
            # 判断是否需要进行数据库校验
            if case["check_sql"]:
                sql1 = "SELECT * FROM futureloan.member where id={}".format(
                    EnvData.member_id)
                sql2 = "SELECT * FROM futureloan.invest WHERE member_id={} and loan_id={}".format(
                    EnvData.member_id, EnvData.loan_id)
                sql3 = "SELECT * FROM futureloan.financelog WHERE pay_member_id={}".format(
                    EnvData.member_id)
                # 获取投资后的用户余额
                end_amount = self.db.find_one(sql1)["leave_amount"]
                self.assertEqual(start_amount - end_amount,
                                 Decimal(str(data["amount"])))
                # 获取投资后投资记录条数
                end_invest = self.db.find_count(sql2)
                self.assertEqual(end_invest - start_invest, 1)
                # 获取用户投资后的流水记录条数
                end_fin = self.db.find_count(sql3)
                self.assertEqual(end_fin - start_fin, 1)
                # 在这里可以再判断是否是满标的投资用例,如果是满标的用例,再去校验该标的每一条投资记录有没有生成对应的回款计划表
                if "满标" in case["title"]:
                    # 获取当前标所有的投资记录id
                    sql4 = "SELECT id FROM futureloan.invest WHERE loan_id={}".format(
                        EnvData.loan_id)
                    invest_ids = self.db.find_all(sql4)
                    # 遍历该标所有的投资记录的id
                    for invest in invest_ids:
                        sql5 = "SELECT * FROM futureloan.repayment WHERE invest_id={}".format(
                            invest["id"])
                        # 获取当前这条投资记录,生成对应的回款计划
                        count = self.db.find_count(sql5)
                        # 断言查询到的条数的布尔值是否为True(0的布尔值是False,只要不是0条,这个断言就会通过)
                        self.assertTrue(count)
        except AssertionError as e:
            self.excel.write_data(row=row, column=8, value="未通过")
            log.error("用例:{},执行未通过".format(case["title"]))
            log.exception(e)
            raise e
        else:
            self.excel.write_data(row=row, column=8, value="通过")
            log.info("用例:{},执行通过".format(case["title"]))
class TestWithdraw(unittest.TestCase):
    excel = HandleExcel(os.path.join(DATA_DIR, "apicases.xlsx"), "withdraw")
    cases = excel.read_excel()
    db = HandleMysql()

    @classmethod
    def setUpClass(cls):
        # 第一步:准备用例数据
        # 请求方法
        method = "post"
        # 请求地址
        url = conf.get("env", "BASE_URL") + "/member/login"
        # 请求参数
        data = {
            "mobile_phone": conf.get("test_phone", "phone"),
            "pwd": conf.get("test_phone", "pwd")
        }
        # 请求头
        headers = eval(conf.get("env", "headers"))
        response = requests.request(method=method,
                                    url=url,
                                    json=data,
                                    headers=headers)
        res = response.json()
        print("登录出参:", res)
        cls.member_id = str(jsonpath.jsonpath(res, "$..id")[0])
        cls.token = "Bearer" + " " + jsonpath.jsonpath(res, "$..token")[0]
        print("提取到的用户id", cls.member_id)
        print("提取到token", cls.token)

    @data(*cases)
    def test_withdraw(self, case):
        # 第一步:准备用例数据
        # 请求方法
        method = case["method"]
        # 请求地址
        url = conf.get("env", "BASE_URL") + case["url"]
        # 请求参数,替换用例中#member_id#
        data = eval(case["data"].replace("#member_id#", self.member_id))
        # 请求头
        headers = eval(conf.get("env", "headers"))
        headers["Authorization"] = self.token
        # 期望结果
        expected = eval(case["expected"])
        # 数据库前置查询
        if case["check_sql"]:
            sql = case["check_sql"].format(self.member_id)
            start_money = self.db.find_one(sql)["leave_amount"]
        # 需要回写的行
        row = case["case_id"] + 1

        # 第二步:接口调用
        response = requests.request(method=method,
                                    url=url,
                                    json=data,
                                    headers=headers)
        res = response.json()
        print("预期结果:", expected)
        print("实际结果:", res)

        # 数据库后置查询
        if case["check_sql"]:
            sql = case["check_sql"].format(self.member_id)
            end_money = self.db.find_one(sql)["leave_amount"]

        # 第三步:数据断言和数据库断言
        try:
            self.assertEqual(expected["code"], res["code"])
            self.assertEqual(expected["msg"], res["msg"])
            # 数据库断言
            if case["check_sql"]:
                recharge_money = decimal.Decimal(str(data["amount"]))
                self.assertEqual(recharge_money, start_money - end_money)
        except AssertionError as e:
            # 结果回写到excel中
            log.error("用例{}执行未通过".format(case["title"]))
            log.debug("预期结果:{}".format(expected))
            log.debug("实际结果:{}".format(res))
            log.exception(e)
            self.excel.write_excel(row=row, column=8, value="未通过")
            raise e
        else:
            log.info("用例--{}--执行通过".format(case["title"]))
            self.excel.write_excel(row=row, column=8, value="通过")
class TestRecharge(unittest.TestCase):
    excel = HandleExcel(filename, "recharge")
    cases = excel.read_excel()
    db = HandleMysql()

    @classmethod
    def setUpClass(cls):
        # 用例的前置条件,进行登录操作
        # 准备登录所用的相关数据
        url = conf.get("env", "BASE_URL") + "/member/login"
        data = {
            "mobile_phone": conf.get("test_phone", "phone"),
            "pwd": conf.get("test_phone", "pwd")
        }
        headers = eval(conf.get("env", "headers"))
        response = request(method="post", url=url, json=data, headers=headers)
        res = response.json()
        cls.member_id = str(jsonpath(res, "$..id")[0])
        cls.token = "Bearer" + " " + jsonpath(res, "$..token")[0]
        print("member_id为", cls.member_id)
        print("token为", cls.token, type(cls.token))

    @data(*cases)
    def test_recharge(self, case):
        # 第一步:准备测试数据
        # 请求方法
        method = case["method"]
        # 请求url
        url = conf.get("env", "BASE_URL") + case["url"]
        # 请求数据
        case["data"] = case["data"].replace("#member_id#", self.member_id)
        data = eval(case["data"])
        # 请求头
        headers = eval(conf.get("env", "headers"))
        headers["Authorization"] = self.token
        print(headers)
        # 期望结果
        expected = eval(case["expected"])
        # 用例回写行数
        row = case["case_id"] + 1
        # 数据库前置查询
        if case["check_sql"]:
            sql = case["check_sql"].format(self.member_id)
            print(sql)
            start_money = self.db.find_one(sql)["leave_amount"]
            print("充值前的金额为:", start_money)

        # 第二步:接口调用
        response = request(method=method, url=url, json=data, headers=headers)
        # 调用接口
        res = response.json()
        print("预期结果:{}".format(expected))
        print("实际结果:{}".format(res))
        # 数据库后置查询
        if case["check_sql"]:
            sql = case["check_sql"].format(self.member_id)
            end_money = self.db.find_one(sql)["leave_amount"]

        # 第三步:断言
        try:
            # 数据断言
            self.assertEqual(expected["code"], jsonpath(res, "$..code")[0])
            self.assertEqual(expected["msg"], jsonpath(res, "$..msg")[0])
            # 数据库断言
            if case["check_sql"]:
                # 将充值金额转换为decimal类型(数据库中的金额为decimal类型)
                recharge_money = decimal.Decimal(str(data["amount"]))
                self.assertEqual(recharge_money, end_money - start_money)
        except AssertionError as e:
            # 结果回写到excel中
            log.debug("----用例{}执行完成-------".format(case["title"]))
            log.exception(e)
            self.excel.write_excel(row=row, column=8, value="未通过")
            raise e
        else:
            # 结果回写到excel中
            log.info("---用例{}执行完成---------".format(case["title"]))
            self.excel.write_excel(row=row, column=8, value="通过")
class TestRecharge(unittest.TestCase, TestBase):
    excel = HandleExcel(os.path.join(DATA_DIR, "apicases.xlsx"), "recharge")
    cases = excel.read_data()
    db = HandleMysql()

    @classmethod
    def setUpClass(cls):
        TestBase.login()

    @data(*cases)
    def test_recharge(self, case):

        # 第一步:准备用例数据
        url = conf.get("env", "url") + case["url"]
        method = case["method"]
        # 准备用例参数
        # 替换参数中的用户id
        data = eval(replace_data(case["data"]))
        # 准备请求头
        headers = eval(conf.get("env", "headers"))
        headers["Authorization"] = getattr(EnvData, "token")
        expected = eval(case["expected"])
        row = case["case_id"] + 1
        # 判断该用例是否需要数据库校验,获取充值之前的账户余额
        if case["check_sql"]:
            sql = case["check_sql"].format(getattr(EnvData, "member_id"))
            start_money = self.db.find_one(sql)["leave_amount"]
            print("充值之前的金额:", start_money)

        # 第二步: 发送请求获取实际结果
        response = request(url=url, method=method, json=data, headers=headers)
        res = response.json()
        print("预期结果:", expected)
        print("实际结果:", res)

        # 判断该用例是否需要数据库校验,获取充值之后的账户余额
        if case["check_sql"]:
            sql = case["check_sql"].format(getattr(EnvData, "member_id"))
            end_money = self.db.find_one(sql)["leave_amount"]
            print("充值之后的金额:", end_money)

        # 第三步:断言预期结果和实际结果
        try:
            self.assertEqual(expected["code"], res["code"])
            self.assertEqual(expected["msg"], res["msg"])
            # 判断是否需要进行sql校验
            if case["check_sql"]:
                # 将充值金额转换为decimal类型(因为数据库中的金额是decimal类型的)
                recharge_money = decimal.Decimal(str(data["amount"]))
                self.assertEqual(recharge_money, end_money - start_money)
        except AssertionError as e:
            # 结果回写excel中
            log.error("用例--{}--执行未通过".format(case["title"]))
            log.debug("预期结果:{}".format(expected))
            log.debug("实际结果:{}".format(res))
            log.exception(e)
            self.excel.write_data(row=row, column=8, value="未通过")
            raise e
        else:
            # 结果回写excel中
            log.info("用例--{}--执行通过".format(case["title"]))
            self.excel.write_data(row=row, column=8, value="通过")
class RechargeTestCase(unittest.TestCase):
    # 创建一个操作excel的对象
    excel = HandleExcel(os.path.join(DATA_DIR, "apicases.xlsx"), "recharge")
    cases = excel.read_data()
    db = HandleMysql()

    @classmethod
    def setUpClass(cls):
        """
        用例执行的前置条件,登录
        :return:
        """
        # 准备登录的相关数据
        url = conf.get("env", "url") + "/member/login"
        data = {
            "mobile_phone": conf.get("test_data", "phone"),
            "pwd": conf.get("test_data", "pwd")
        }
        headers = eval(conf.get("env", "headers"))
        response = request(method="post", url=url, json=data, headers=headers)
        res = response.json()
        member_id = str(jsonpath.jsonpath(res, "$..id")[0])  # 下标取值
        # print("提取到的用户id为:",cls.member_id)
        # print(type(cls.member_id))

        # token_type = jsonpath.jsonpath(res,"$..token_type")   # 获取到的是Bearer
        # # print(token_type,type(token_type))

        token = "Bearer" + " " + jsonpath.jsonpath(res, "$..token")[0]
        setattr(EnvData, "member_id", member_id)
        setattr(EnvData, "token", token)

    @data(*cases)
    def test_recharge(self, case):
        # 第一步 ,准备用例
        url = conf.get("env", "url") + case["url"]
        method = case["method"]

        # 准备用例参数
        # 替换参数中用户的ID
        # case["data"] = case["data"].replace("#member_id#",self.member_id)

        # 转换为字典
        data = eval(replace_data(case["data"]))
        headers = eval(conf.get("env", "headers"))
        # 准备请求头
        headers["Authorization"] = getattr(EnvData, "token")
        expected = eval(case["expected"])
        row = case["case_id"] + 1

        # 判断该用例是否需要数据库校验,获取充值之前的账户余额
        if case["check_sql"]:
            # sql = case["check_sql"].format(self.member_id)
            sql = replace_data(case["check_sql"])
            start_money = self.db.find_one(sql)["leave_amount"]
            print("充值之前的金额:", start_money)

        # 第二步, 发送请求,获取实际结果
        response = request(method=method, url=url, json=data, headers=headers)
        res = response.json()
        print("预期结果:", expected)
        print("实际结果:", res)

        # 获取充值后的账户余额
        if case["check_sql"]:
            # sql = case["check_sql"].format(self.member_id)
            sql = replace_data(case["check_sql"])

            end_money = self.db.find_one(sql)["leave_amount"]
            print("充值后的金额:", end_money)

        # 第三步,断言预期结果和实际结果
        try:
            self.assertEqual(expected["code"], res["code"])
            self.assertEqual(expected["msg"], res["msg"])
            # 判断是否需要sql校验:
            if case["check_sql"]:
                recharge_money = decimal.Decimal(str(data["amount"]))
                self.assertEqual(recharge_money, end_money - start_money)
        except AssertionError as e:
            # 将结果回写excel  中
            log.error("用例-- {}--执行未通过".format(case["title"]))
            # log.debug("预期结果:".format(expected))
            # log.debug("实际结果:".format(res))
            log.exception(e)  # 这样可以异常情况打印到日志文件中!
            self.excel.write_data(row=row, column=8, value="未通过")
            raise e
        else:
            # 将结果回写excel  中
            log.error("用例--{}--执行通过".format(case["title"]))

            self.excel.write_data(row=row, column=8, value="通过")
class RegisterTestCase(unittest.TestCase):
    excel = HandleExcel(filename, "register")
    cases = excel.read_data()
    db = HandleMysql()

    @data(*cases)
    def test_register(self, case):
        # 第一步,准备用例数据  (请求方法,请求地址,请求参数,请求头
        # 请求方法
        method = case["method"]
        # 请求url
        url = case["url"]
        # 请求参数是否有手机号需要替换
        # 判断
        if "#phone#" in case["data"]:
            phone = self.random_phone()
            case["data"] = case["data"].replace("#phone#", phone)

        data = eval(case["data"])
        headers = eval(conf.get("env", "headers"))
        expected = eval(case["expected"])
        # 用例所在行
        row = case["case_id"] + 1

        # 第二步,发送请求获取实际结果
        response = request(method=method, url=url, json=data, headers=headers)
        res = response.json()
        # print("实际结果:",res)

        print("预期结果:", expected)
        print("实际结果:", res)

        # 第三步,断言
        try:

            self.assertEqual(expected["code"], res["code"])
            self.assertEqual(expected["msg"], res["msg"])
            # 判断是否需要进行sql校验
            if case["check_sql"]:
                sql = case["check_sql"].replace("#phong#",
                                                data["mobile_phone"])

                res = self.db.find_count(sql)
                self.assertTrue(1, res)

        except AssertionError as e:
            # ---------------------将结果回写excel  中
            log.error("用例---- {}----执行未通过".format(case["title"]))
            log.info("预期结果:", expected)
            log.info("实际结果:", res)
            log.exception(e)
            # log.error(e)
            log.exception(e)  # 这样可以异常情况打印到日志文件中!
            self.excel.write_data(row=row, column=8, value="未通过")
            raise e
        else:
            # ----------------------将结果回写excel  中
            log.error("用例---- {}----执行通过".format(case["title"]))

            self.excel.write_data(row=row, column=8, value="通过")

    @classmethod
    def random_phone(self):
        """
        生成一个数据里里面未注册的手机号
        :return:
        """
        while True:
            phone = "155"
            for i in range(8):
                r = random.randint(0, 9)
                phone += str(r)
            sql = "select * from futureloan.member where mobile_phone = {}".format(
                phone)
            res = self.db.find_count(sql)
            if res == 0:
                return phone
Example #14
0
class TestAdd(unittest.TestCase):
    excel = HandleExcel(os.path.join(DATA_DIR, "apicases.xlsx"), "add")
    cases = excel.read_data()
    db = HandleMysql()

    @classmethod
    def setUpClass(cls):
        """用例执行的前置条件:登录"""
        # 准备登录的相关数据
        url = conf.get("env", "url") + "/member/login"
        data = {
            "mobile_phone": conf.get("test_data", "phone"),
            "pwd": conf.get("test_data", "pwd")
        }
        headers = eval(conf.get("env", "headers"))
        response = request(method="post", url=url, json=data, headers=headers)
        res = response.json()
        member_id = str(jsonpath.jsonpath(res, "$..id")[0])
        token = "Bearer" + " " + jsonpath.jsonpath(res, "$..token")[0]
        # 将提取出来的数据保存为EnvData这个类的属性(环境变量)
        setattr(EnvData, "member_id", member_id)
        setattr(EnvData, "token", token)

    @data(*cases)
    def test_add(self, case):

        # 第一步:准备用例数据
        url = conf.get("env", "url") + case["url"]
        method = case["method"]
        # 替换参数中的用户id,
        # case["data"] = case["data"].replace("#member_id#", self.member_id)
        # 替换用例中的动态数据
        data = eval(replace_data(case["data"]))
        # 准备请求头
        headers = eval(conf.get("env", "headers"))
        headers["Authorization"] = getattr(EnvData, "token")
        expected = eval(case["expected"])
        row = case["case_id"] + 1
        # 加标之前,查询数据库中该用户标的数量
        if case["check_sql"]:
            sql = replace_data(case["check_sql"])
            start_count = self.db.find_count(sql)

        # 第二步: 发送请求获取实际结果
        response = request(url=url, method=method, json=data, headers=headers)
        res = response.json()
        print("预期结果:", expected)
        print("实际结果:", res)

        # 第三步:断言预期结果和实际结果
        try:
            self.assertEqual(expected["code"], res["code"])
            self.assertEqual(expected["msg"], res["msg"])
            if case["check_sql"]:
                # 加标之后
                sql = replace_data(case["check_sql"])
                end_count = self.db.find_count(sql)
                self.assertEqual(1, end_count - start_count)
        except AssertionError as e:
            # 结果回写excel中
            log.error("用例--{}--执行未通过".format(case["title"]))
            log.debug("预期结果:{}".format(expected))
            log.debug("实际结果:{}".format(res))
            log.exception(e)
            self.excel.write_data(row=row, column=8, value="未通过")
            raise e
        else:
            # 结果回写excel中
            log.info("用例--{}--执行通过".format(case["title"]))
            self.excel.write_data(row=row, column=8, value="通过")
class RegisterTestCase(unittest.TestCase):
    excel = HandleExcel(filename, "register")
    cases = excel.read_data()
    db = HandleMysql()

    @data(*cases)
    def test_register(self, case):
        # 第一步:准备用例数据
        # 请求方法
        method = case["method"]
        # 请求地址
        url = case["url"]
        # 请求参数
        # 判断是否有手机号码需要替换
        if "#phone#" in case["data"]:
            # 随机生成一个手机号码
            phone = self.random_phone()
            # 将参数中的#phone# 替换成随机生成的手机号
            case["data"] = case["data"].replace("#phone#", phone)
        data = eval(case["data"])
        # 请求头
        headers = eval(conf.get("env", "headers"))
        # 预期结果
        expected = eval(case["expected"])
        # 用例所在行
        row = case["case_id"] + 1

        # 第二步:发送请求获取实际结果
        response = request(method=method, url=url, json=data, headers=headers)
        # 获取实际结果
        res = response.json()
        print("预期结果:", expected)
        print("实际结果:", res)

        # 第三步:断言
        try:
            self.assertEqual(expected["code"], res["code"])
            self.assertEqual(expected["msg"], res["msg"])
            # 判断是否需要进行sql校验
            if case["check_sql"]:
                sql = case["check_sql"].replace("#phone#",
                                                data["mobile_phone"])
                res = self.db.find_count(sql)
                self.assertEqual(1, res)
        except AssertionError as e:
            # 结果回写excel中
            log.error("用例--{}--执行未通过".format(case["title"]))
            log.debug("预期结果:{}".format(expected))
            log.debug("实际结果:{}".format(res))
            log.exception(e)
            self.excel.write_data(row=row, column=8, value="未通过")
            raise e
        else:
            # 结果回写excel中
            log.info("用例--{}--执行通过".format(case["title"]))
            self.excel.write_data(row=row, column=8, value="通过")

    @classmethod
    def random_phone(cls):
        """生成一个数据库里面未注册的手机号码"""
        while True:
            phone = "155"
            for i in range(8):
                r = random.randint(0, 9)
                phone += str(r)

            # 数据库中查询该手机号是否存在
            sql = "SELECT * FROM futureloan.member WHERE mobile_phone={}".format(
                phone)
            res = cls.db.find_count(sql)
            # 如果不存在,则返回该手机号
            if res == 0:
                return phone
class TestAudit(unittest.TestCase):
    excel = HandleExcel(os.path.join(DATA_DIR, "apicases.xlsx"), "audit")
    cases = excel.read_data()
    db = HandleMysql()

    @classmethod
    def setUpClass(cls):
        # 该用例类所有用例执行之前的前置条件:管理员要登录,普通用户登录
        url = conf.get("env", "url") + "/member/login"
        headers = eval(conf.get("env", "headers"))
        # 前置条件一:管理员登录
        admin_data = {
            "mobile_phone": conf.get("test_data", "admin_phone"),
            "pwd": conf.get("test_data", "admin_pwd")
        }
        response1 = request(method="post",
                            url=url,
                            json=admin_data,
                            headers=headers)
        res1 = response1.json()
        # 提取管理员的token
        cls.admin_token = "Bearer" + " " + jsonpath.jsonpath(res1,
                                                             "$..token")[0]

        # 前置条件二:普通用户登录
        user_data = {
            "mobile_phone": conf.get("test_data", "phone"),
            "pwd": conf.get("test_data", "pwd")
        }
        response2 = request(method="post",
                            url=url,
                            json=user_data,
                            headers=headers)
        res2 = response2.json()
        # 提取用户id和token
        cls.user_member_id = jsonpath.jsonpath(res2, "$..id")[0]
        cls.user_token = "Bearer" + " " + jsonpath.jsonpath(res2,
                                                            "$..token")[0]

        # print("管理员token:", cls.admin_token)
        # print("用户token:", cls.user_token)
        # print("用户id:", cls.user_member_id)

    def setUp(self):
        # 每条用例之前的前置条件:添加一个新的项目
        url = conf.get("env", "url") + "/loan/add"
        headers = eval(conf.get("env", "headers"))
        headers["Authorization"] = self.user_token
        data = {
            "member_id": self.user_member_id,
            "title": "大胖借钱打打打",
            "amount": 2000,
            "loan_rate": 12.0,
            "loan_term": 3,
            "loan_date_type": 1,
            "bidding_days": 5
        }
        # 发送请求,添加项目
        response = request(method="post", url=url, json=data, headers=headers)
        res = response.json()
        # 提取项目的id给审核的用例使用
        self.loan_id = jsonpath.jsonpath(res, "$..id")[0]
        # print("项目id:",loan_id)

    @data(*cases)
    def test_audit(self, case):
        # 第一步:准备数据
        url = conf.get("env", "url") + case["url"]

        #  >>>>>>>>>>>判断是否需要替换审核通过的标id >>>>>>>>>>>
        if "#pass_loan_id#" in case["data"]:
            #  >>>>>>>>>>>  将之前保存的审核通过的标ID 类属性的地方,替换到该用例中 >>>>>>>>>>>
            case["data"] = case["data"].replace("#pass_loan_id#",
                                                str(self.pass_loan_id))

        data = eval(case["data"].replace("#loan_id#", str(self.loan_id)))
        headers = eval(conf.get("env", "headers"))
        headers["Authorization"] = self.admin_token
        if case["title"] == "普通用户进行审核":
            headers["Authorization"] = self.user_token

        method = case["method"]
        expected = eval(case["expected"])
        row = case["case_id"] + 1
        # 第二步:调用接口,获取实际结果
        response = request(url=url, method=method, json=data, headers=headers)
        res = response.json()
        # (-------判断是否是审核通过的用例,并且审核成功---------------)
        if case["title"] == "审核通过" and res["msg"] == "OK":
            # >>>>>>>>>>>(------将执行通过的标ID保存为类属性------------)
            TestAudit.pass_loan_id = data["loan_id"]

        # 第三步:断言
        try:
            self.assertEqual(expected["code"], res["code"])
            self.assertEqual(expected["msg"], res["msg"])
            # ( >>>>>>>>>>>-----对需要进行数据库校验的用例,进行校验)
            if case["check_sql"]:
                sql = case["check_sql"].replace("#loan_id#", str(self.loan_id))
                status = self.db.find_one(sql)["status"]
                self.assertEqual(expected["status"], status)

        except AssertionError as e:
            # 结果回写excel中
            log.error("用例--{}--执行未通过".format(case["title"]))
            log.debug("预期结果:{}".format(expected))
            log.debug("实际结果:{}".format(res))
            log.exception(e)
            self.excel.write_data(row=row, column=8, value="未通过")
            raise e
        else:
            # 结果回写excel中
            log.info("用例--{}--执行通过".format(case["title"]))
            self.excel.write_data(row=row, column=8, value="通过")
Example #17
0
class TestWithdraw(unittest.TestCase):
    excel = HandleExcel(os.path.join(DATA_DIR, "apicases.xlsx"), "withdraw")
    cases = excel.read_data()
    db = HandleMysql()

    @classmethod
    def setUpClass(cls):
        """用例执行的前置条件:登录"""
        # 准备登录的相关数据
        url = conf.get("env", "url") + "/member/login"
        data = {
            "mobile_phone": conf.get("test_data", "phone"),
            "pwd": conf.get("test_data", "pwd")
        }
        headers = eval(conf.get("env", "headers"))
        response = request(method="post", url=url, json=data, headers=headers)
        res = response.json()
        cls.member_id = str(jsonpath.jsonpath(res, "$..id")[0])
        cls.token = "Bearer" + " " + jsonpath.jsonpath(res, "$..token")[0]
        # print("提取到的用户id为:", cls.member_id)
        # print("提取到的用户token为:", cls.token)

    @data(*cases)
    def test_withdraw(self, case):

        # 第一步:准备用例数据
        url = conf.get("env", "url") + case["url"]
        method = case["method"]
        # 准备用例参数
        # 替换参数中的用户id,
        case["data"] = case["data"].replace("#member_id#", self.member_id)
        data = eval(case["data"])
        # 准备请求头
        headers = eval(conf.get("env", "headers"))
        headers["Authorization"] = self.token
        expected = eval(case["expected"])
        row = case["case_id"] + 1
        # 判断该用例是否需要数据库校验,获取取现之前的账户余额
        if case["check_sql"]:
            sql = case["check_sql"].format(self.member_id)
            start_money = self.db.find_one(sql)["leave_amount"]
            print("取现之前的金额:", start_money)

        # 第二步: 发送请求获取实际结果
        response = request(url=url, method=method, json=data, headers=headers)
        res = response.json()
        print("预期结果:", expected)
        print("实际结果:", res)

        # 判断该用例是否需要数据库校验,获取取现之后的账户余额
        if case["check_sql"]:
            sql = case["check_sql"].format(self.member_id)
            end_money = self.db.find_one(sql)["leave_amount"]
            print("取现之后的金额:", end_money)
        # 第三步:断言预期结果和实际结果
        try:
            self.assertEqual(expected["code"], res["code"])
            self.assertEqual(expected["msg"], res["msg"])
            # 判断是否需要进行sql校验
            if case["check_sql"]:
                # 将取现金额转换为decimal类型(因为数据库中的金额是decimal类型的)
                recharge_money = decimal.Decimal(str(data["amount"]))
                self.assertEqual(recharge_money, start_money - end_money)
        except AssertionError as e:
            # 结果回写excel中
            log.error("用例--{}--执行未通过".format(case["title"]))
            log.debug("预期结果:{}".format(expected))
            log.debug("实际结果:{}".format(res))
            log.exception(e)
            self.excel.write_data(row=row, column=8, value="未通过")
            raise e
        else:
            # 结果回写excel中
            log.info("用例--{}--执行通过".format(case["title"]))
            self.excel.write_data(row=row, column=8, value="通过")
class TestAdd(unittest.TestCase):
    excel = HandleExcel(os.path.join(DATA_DIR, "apicases.xlsx"), "add")
    cases = excel.read_excel()
    db = HandleMysql()

    @classmethod
    def setUpClass(cls):
        """先用普通用户登录"""
        headers = eval(conf.get("env", "headers"))
        url = conf.get("env", "BASE_URL") + "member/login"
        data = {
            "mobile_phone": conf.get("test_phone", "phone"),
            "pwd": conf.get("test_phone", "pwd")
        }
        response = requests.request(method="post",
                                    url=url,
                                    json=data,
                                    headers=headers)
        res = response.json()
        log.info("--------登录结果:{}--------".format(res))
        member_id = str(jsonpath.jsonpath(res, "$..id")[0])
        token = "Bearer " + jsonpath.jsonpath(res, "$..token")[0]
        # 将提取出的数据保存为EnvData的类属性
        setattr(EnvData, "member_id", member_id)
        setattr(EnvData, "token", token)

    @data(*cases)
    def test_add(self, case):
        # 第一步:准备数据

        # 请求方法
        method = case["method"]
        # 请求地址
        url = os.path.join(conf.get("env", "BASE_URL")) + case["url"]
        # 请求参数
        data = eval(replace_data(case["data"]))
        # 请求头
        headers = eval(conf.get("env", "headers"))
        headers["Authorization"] = getattr(EnvData, "token")
        # 预期结果
        expected = eval(case["expected"])
        log.info("--------预期结果:{}----------".format(expected))
        # 回写的行
        row = case["case_id"] + 1
        # 数据库前置查询
        if case["check_sql"]:
            start_count = self.db.find_count(replace_data(case["check_sql"]))
        # 第二步:接口调用
        response = requests.request(method=method,
                                    url=url,
                                    json=data,
                                    headers=headers)
        # 实际结果
        res = response.json()
        log.info("--------实际结果:{}----------".format(res))

        # 数据断言和数据库断言
        try:
            self.assertEqual(expected["code"], res["code"])
            self.assertEqual(expected["msg"], res["msg"])
            # 数据库后置查询
            if case["check_sql"]:
                end_count = self.db.find_count(replace_data(case["check_sql"]))
                self.assertEqual(1, end_count - start_count)
        except AssertionError as e:
            # 结果回写到excel中
            log.error("用例--{}--执行未通过".format(case["title"]))
            log.debug("预期结果:{}".format(expected))
            log.debug("实际结果:{}".format(res))
            log.exception(e)
            self.excel.write_excel(row, 8, value="未通过")
        else:
            # 结果回写excel中
            log.info("用例--{}--执行通过".format(case["title"]))
            self.excel.write_excel(row, 8, value="通过")