def setUpClass(cls):  # 在测试用例类(TestRecharge)执行之前就会执行这个方法
        # 登录:获取用户的id以及鉴权需要用到的token
        url = conf.get_str("env", "url_ip") + "/member/login"
        login_data = {"mobile_phone": user, "pwd": pwd}
        headers = eval(conf.get_str("env", "headers"))
        response = cls.http.send(
            url=url, method="post", json=login_data,
            headers=headers)  # 此处用cls是因为是类方法setUpClass(cls)里面的,是通过类属性去调用的
        result = response.json()
        # 登录之后,从响应结果中提取用户id和token
        # (1)获取用户id
        # cls.member_id = str(jsonpath.jsonpath(result, "$..id")[0])#设置为TestRecharge类的类属性

        member_id = jsonpath.jsonpath(result, "$..id")[0]  # 获取member_id
        print(member_id)
        # 设置TestData类的类属性
        setattr(
            TestData, "member_id",
            str(member_id))  #设置TestData类的类属性,设置类属性为member_id,类属性的值为member_id
        # (2)提取token
        token_type = jsonpath.jsonpath(result, "$..token_type")[0]
        token = jsonpath.jsonpath(result, "$..token")[0]
        # cls.token_data = token_type + " " + token#设置为TestRecharge类的类属性
        token_data = token_type + " " + token  #
        setattr(
            TestData, "token_data",
            token_data)  # 设置TestData类的类属性,设置类属性为token_data,类属性的值为token_data
Esempio n. 2
0
 def __init__(self):
     # 连接数据库
     self.con = pymysql.connect(
         host=conf.get_str("mysql", "host"),
         user=conf.get_str("mysql", "user"),
         password=conf.get_str("mysql", "password"),
         port=conf.get_int("mysql", "port"),  # 获取整数类型用get_int
         charset=conf.get_str("mysql", "charset"))  # charset:编码方式
     # 创建一个游标
     self.cur = self.con.cursor()
    def test_audit(self, case):
        # 拼接完整的接口地址
        url = conf.get_str("env", "url_ip") + case["url"]
        # 请求的方法
        method = case["method"]
        # 请求参数
        # 替换用例参数
        case["data"] = replace_data(case["data"])
        data = eval(case["data"])
        # 请求头
        headers = eval(conf.get_str("env", "headers"))
        headers["Authorization"] = getattr(TestData, "token_data")

        # 预期结果
        expected = eval(case["expected"])
        # 该用例在表单的中所在行
        row = case["case_id"] + 1

        # ------第二步:发送请求到接口,获取实际结果--------
        response = self.http.send(url=url,
                                  method=method,
                                  json=data,
                                  headers=headers)
        result = response.json()
        # 如果审核通过的项目返回ok,说明该项目已审核
        if case["title"] == "审核通过" and result["msg"] == "OK":
            pass_loan_id = getattr(TestData, "loan_id")
            # 将该项目的id保存起来
            setattr(TestData, "pass_loan_id", pass_loan_id)

        # -------第三步:比对预期结果和实际结果-----
        try:
            self.assertEqual(expected["code"], result["code"])
            self.assertEqual((expected["msg"]), result["msg"])
            if case["check_sql"]:
                sql = replace_data(case["check_sql"])
                # 获取这个标的用户id
                status = self.db.get_one(sql)[0]
                # 进行断言
                self.assertEqual(expected["status"], status)
        except AssertionError as e:
            self.excel.write_data(row=row, column=8, value="未通过")
            my_log.info("用例:{}--->执行未通过".format(case["title"]))
            print("预取结果:{}".format(expected))
            print("实际结果:{}".format(result))
            raise e
        else:
            self.excel.write_data(row=row, column=8, value="通过")
            my_log.info("用例:{}--->执行通过".format(case["title"]))
Esempio n. 4
0
    def test_login(self, test_data_cases):
        # 第一步:准备用例数据
        # 备注:列表、字典方式存储的,excel读取出来是字符串。数值类型,读取出来是数值类型的,字符串类型,读取出来是字符串类型。
        # ①拼接完整的接口地址
        url = conf.get_str("env", "url_ip") + test_data_cases["url"]
        # ②请求的方法
        method = test_data_cases["method"]
        # ③请求参数
        # 判断是否有手机号需要替换
        if "#phone#" in test_data_cases["data"]:
            # 进行替换
            test_data_cases["data"] = test_data_cases["data"].replace("#phone#", user)  # 替换完后需要接收,不然没有实质的替换
        if "#pwd#" in test_data_cases["data"]:
            # 进行替换
            test_data_cases["data"] = test_data_cases["data"].replace("#pwd#", pwd)  # 替换完后需要接收,不然没有实质的替换
        data = eval(test_data_cases["data"])

        # ④请求头
        headers = eval(conf.get_str("env", "headers"))
        # ⑤预期结果
        expected = eval(test_data_cases["expected"])
        # ⑥该用例在表单中所在行
        row = test_data_cases["case_id"] + 1
        # 第二步:发送请求到接口,获取实际结果
        response = HandleRequest().send(url=url, method=method, json=data, headers=headers)
        result = response.json()

        # 第三步:比对预期结果和实际结果
        try:
            self.assertEqual(expected["code"], result["code"])
            self.assertEqual(expected["msg"], result["msg"])
        except AssertionError as e:
            self.excel.write_data(row=row, column=8, value="未通过")  # 可以把列(column)放在配置文件里面
            # 记录没有通过的日志
            my_log.info("用例:{}------>执行未通过".format(test_data_cases["title"]))
            # 在没有通过的时候,使用print会打印在测试报告中
            print("预期结果:{}".format(expected))
            print("实际结果:{}".format(result))
            # 在没有通过的时候,将print输出到日志里面
            my_log.info("预期结果:{}".format(expected))
            my_log.info("实际结果:{}".format(result))
            raise e
        else:
            self.excel.write_data(row=row, column=8, value="通过")  # 可以把列(column)放在配置文件里面
            # 记录通过的日志
            my_log.info("用例:{}------>执行通过".format(test_data_cases["title"]))
 def setUpClass(cls):
     # -----------在测试用例类执行用例之前先进行登录-->
     # 登录,获取用户的id以及鉴权需要用到的token
     url = conf.get_str("env", "url_ip") + "/member/login"
     data = {
         "mobile_phone": conf.get_str("test_data", 'admin_phone'),
         "pwd": conf.get_str("test_data", "admin_pwd")
     }
     headers = eval(conf.get_str("env", "headers"))
     response = cls.http.send(url=url,
                              method="post",
                              json=data,
                              headers=headers)
     json_data = response.json()
     # -------登录之后,从响应结果中提取用户id和token-------------
     # 1、提取用户id
     member_id = jsonpath.jsonpath(json_data, "$..id")[0]
     setattr(TestData, "member_id", str(member_id))
     # 2、提取token
     token_type = jsonpath.jsonpath(json_data, "$..token_type")[0]
     token = jsonpath.jsonpath(json_data, "$..token")[0]
     token_data = token_type + " " + token
     setattr(TestData, "token_data", token_data)
 def setUp(self):
     # ---------在测试用例(每个审核的用例)执行之前都加一个项目,将项目id保存起来----------
     url = conf.get_str("env", "url_ip") + "/loan/add"
     data = {
         "member_id": getattr(TestData, "member_id"),
         "title": "借钱实现财富自由",
         "amount": 2000,
         "loan_rate": 12.0,
         "loan_term": 3,
         "loan_date_type": 1,
         "bidding_days": 5
     }
     headers = eval(conf.get_str("env", "headers"))
     headers["Authorization"] = getattr(TestData, "token_data")
     # 发送请求加标
     response = self.http.send(url=url,
                               method="post",
                               json=data,
                               headers=headers)
     json_data = response.json()
     # 1、提取标id
     loan_id = jsonpath.jsonpath(json_data, "$..id")[0]
     # 2、保存为TestDate的属性
     setattr(TestData, "loan_id", str(loan_id))
Esempio n. 7
0
def replace_data(data):
    r = r"#(.+?)#"  # 匹配规则
    # 判断是否有需要替换的数据
    while re.search(r, data):  # 如果匹配到有数据,就提取出来
        # 匹配出第一个要替换的数据
        res = re.search(r, data)
        # 提取待替换的内容
        item = res.group()
        # 获取替换内容的数据项
        key = res.group(1)
        try:
            # 根据替换内容中的数据项去配置文件中找到对应的内容,进行替换
            data = data.replace(item, conf.get_str("test_data", key))
        except:  # 没有可以通过提取的时候,写入配置文件中
            # 没有进行替换,替换成
            data = data.replace(item, getattr(TestData,
                                              key))  # getattr:动态的获取属性
            # 备注:TestData传入类名,key如果没有找到就去类里面获取属性
    # 返回替换好的数据
    return data  # 替换完后,返回data
Esempio n. 8
0
    def test_add(self, test_data_cases):
        # 第一步:准备用例数据
        # (1)获取url
        url = conf.get_str("env", "url_ip") + test_data_cases["url"]
        # (2)获取数据
        test_data_cases["data"] = replace_data(
            test_data_cases["data"])  # 调用replace_data方法
        # (3)数据转换
        data = eval(test_data_cases["data"])
        # (4)预期结果
        expected = eval(test_data_cases["expected"])  # excel是字典类型,需要转换一下
        # (5)请求方法
        method = test_data_cases["method"]
        # (6)用例所在的行
        row = test_data_cases["case_id"] + 1
        # (7)请求头
        headers = eval(conf.get_str("env", "headers"))
        if test_data_cases["interface"] != "login":
            # 如果不是token,需要添加请求头
            headers["Authorization"] = getattr(TestData,
                                               "token_data")  # 调用保存在临时变量的类中
        #先判断check_sql是否有数据
        if test_data_cases["check_sql"]:
            sql = replace_data(
                test_data_cases["check_sql"])  #先获取check_sql数据,在进行替换
            #执行sql语句
            s_loan_num = self.db.count(sql)  #得到加标前项目的条数

        # 第二步:发送请求到接口,获取实际结果
        res = self.http.send(url=url,
                             method=method,
                             json=data,
                             headers=headers)
        result = res.json()

        # 判断是否是登录用例,是的话,则提取token
        if test_data_cases["interface"] == "login":
            # 如果是登录的用例,提取对应的token
            token_type = jsonpath.jsonpath(result, "$..token_type")[0]
            token = jsonpath.jsonpath(result, "$..token")[0]
            token_data = token_type + " " + token
            # 通过setattr方法保存到TestData类里面
            setattr(TestData, "token_data", token_data)
            # 提取member_id
            admin_member_id = jsonpath.jsonpath(result, "$..id")[0]
            # 通过setattr方法保存到TestData类里面
            setattr(TestData, "admin_member_id",
                    str(admin_member_id))  # 存类属性的时候,需要与excel中的参数名一致

        # 第三步:比对预期结果和实际结果
        try:
            self.assertEqual(expected["code"], result["code"])
            self.assertEqual(expected["msg"], result["msg"])
            # 加标后,项目的条数
            # 先判断check_sql是否有数据
            if test_data_cases["check_sql"]:
                sql = replace_data(
                    test_data_cases["check_sql"])  # 先获取check_sql数据,在进行替换
                # 执行sql语句
                end_loan_num = self.db.count(sql)  # 得到加标前项目的条数
                self.assertEqual(end_loan_num - s_loan_num, 1)
        except AssertionError as e:
            self.excel.write_data(row=row, column=8,
                                  value="未通过")  # 可以把列(column)放在配置文件里面
            # 记录没有通过的日志
            my_log.info("用例:{}------>执行未通过".format(test_data_cases["title"]))
            # 在没有通过的时候,使用print会打印在测试报告中
            print("预期结果:{}".format(expected))
            print("实际结果:{}".format(result))
            # 在没有通过的时候,将print输出到日志里面
            my_log.info("预期结果:{}".format(expected))
            my_log.info("实际结果:{}".format(result))
            raise e
        else:
            self.excel.write_data(row=row, column=8,
                                  value="通过")  # 可以把列(column)放在配置文件里面
            # 记录通过的日志
            my_log.info("用例:{}------>执行通过".format(test_data_cases["title"]))
    def test_recharge(self, test_data_cases):
        # 第一步:准备用例数据
        # 备注:列表、字典方式存储的,excel读取出来是字符串。数值类型,读取出来是数值类型的,字符串类型,读取出来是字符串类型。
        # ①拼接完整的接口地址
        url = conf.get_str("env", "url_ip") + test_data_cases["url"]
        # ②请求的方法
        method = test_data_cases["method"]

        # ③请求参数
        # 判断是否有用户id需要替换
        # if "#member_id#" in test_data_cases["data"]:
        #     # 进行替换
        #     test_data_cases["data"] = test_data_cases["data"].replace("#member_id#",
        #                                                               self.member_id)  # 替换完后需要接收,不然没有实质的替换
        test_data_cases["data"] = replace_data(
            test_data_cases["data"])  #调用replace_data方法
        data = eval(test_data_cases["data"])

        # ④请求头
        headers = eval(conf.get_str("env", "headers"))
        # 添加鉴权
        # headers["Authorization"] = self.token_data
        # 从TestData类里面获取token_data属性:两种方法
        # headers["Authorization"] = TestData.token_data#方法一:直接从TestData类里面获取token_data属性
        headers["Authorization"] = getattr(
            TestData, "token_data")  # 方法二:用getattr获取TestData类里面获取token_data属性
        # ⑤预期结果
        expected = eval(test_data_cases["expected"])
        # ⑥该用例在表单中所在行
        row = test_data_cases["case_id"] + 1

        # 第二步:发送请求到接口,获取实际结果
        if test_data_cases[
                "check_sql"]:  # 先判断用例里面check_sql字段是否有数据,如果有数据,说明需要进行数据库校验
            sql = test_data_cases["check_sql"].format(user)
            # 获取充值之前的余额
            start_money = self.db.get_one(sql)[0]

        response = HandleRequest().send(url=url,
                                        method=method,
                                        json=data,
                                        headers=headers)
        result = response.json()

        # 第三步:比对预期结果和实际结果
        try:
            self.assertEqual(expected["code"], result["code"])
            self.assertEqual(expected["msg"], result["msg"])
            # 充值后,进行数据库校验
            if test_data_cases["check_sql"]:
                sql = test_data_cases["check_sql"].format(user)
                # 获取充值之后的余额
                end_money = self.db.get_one(sql)[0]
                # 获取请求参数里面的充值金额
                recharge_money = decimal.Decimal(str(data["amount"]))
                my_log.info("充值之前金额为:{}\n,充值金额为:{}\n,充值之后金额为:{}\n".format(
                    start_money, recharge_money, end_money))
                # 进行断言
                self.assertEqual(recharge_money, end_money - start_money)
        except AssertionError as e:
            self.excel.write_data(row=row, column=8,
                                  value="未通过")  # 可以把列(column)放在配置文件里面
            # 记录没有通过的日志
            my_log.info("用例:{}------>执行未通过".format(test_data_cases["title"]))
            # 在没有通过的时候,使用print会打印在测试报告中
            print("预期结果:{}".format(expected))
            print("实际结果:{}".format(result))
            # 在没有通过的时候,将print输出到日志里面
            my_log.info("预期结果:{}".format(expected))
            my_log.info("实际结果:{}".format(result))
            raise e
        else:
            self.excel.write_data(row=row, column=8,
                                  value="通过")  # 可以把列(column)放在配置文件里面
            # 记录通过的日志
            my_log.info("用例:{}------>执行通过".format(test_data_cases["title"]))
import unittest
from common.read_excel import ReadExcel
from common.contants import data_dir  # 用例数据所在的路径
import os
from library.ddt import ddt, data
from common.read_conf import conf  # 配置文件解析对象
from common.handle_request import HandleRequest
from common.my_log import my_log  # 导入日志
import jsonpath
from common.handle_db import HandleDB
import decimal

# ----------------------修改充值用例类-----------------------------------------
from common.handle_data import TestData, replace_data
data_file_path = os.path.join(data_dir, "test_data.xlsx")  # 用例数据的路径
user = conf.get_str("test_data", "user")
pwd = conf.get_str("test_data", "pwd")
"""
setUpClass中提取的用户id和token,如何在用例方法中使用
(1)设为全局变量
(2)保存为类属性:在setUpClass类中,通过加上cls,设置为类属性,测试方法直接通过self调用类属性
(3)写入到配置文件
(4)保存在临时变量的类中(后面会讲的,先不要去研究)
"""


@ddt
class TestRecharge(unittest.TestCase):
    # 通过类创建excel对象
    excel = ReadExcel(data_file_path, "recharge")
    # 读取数据
    def test_register(self, test_data_cases):
        # 第一步:准备用例数据
        # 备注:列表、字典方式存储的,excel读取出来是字符串。数值类型,读取出来是数值类型的,字符串类型,读取出来是字符串类型。
        # ①拼接完整的接口地址
        url = conf.get_str("env", "url_ip") + test_data_cases["url"]
        # ②请求的方法
        method = test_data_cases["method"]

        # ③请求参数
        #判断是否有手机号需要替换
        if "#phone#" in test_data_cases["data"]:
            #生成一个手机号码
            phone = self.random_phone()
            #进行替换
            test_data_cases["data"] = test_data_cases["data"].replace(
                "#phone#", phone)  # 替换完后需要接收,不然没有实质的替换

        data = eval(test_data_cases["data"])
        # ④请求头
        headers = eval(conf.get_str("env", "headers"))
        # ⑤预期结果
        expected = eval(test_data_cases["expected"])
        # ⑥该用例在表单中所在行
        row = test_data_cases["case_id"] + 1
        # 第二步:发送请求到接口,获取实际结果
        response = HandleRequest().send(url=url,
                                        method=method,
                                        json=data,
                                        headers=headers)
        result = response.json()

        # 第三步:比对预期结果和实际结果
        try:
            self.assertEqual(expected["code"], result["code"])
            self.assertEqual(expected["msg"], result["msg"])
            if result["msg"] == "OK":
                #如果注册成功,去数据库查询当前注册的账号是否存在
                sql = "select * from futureloan.member where mobile_phone={}".format(
                    phone)
                #获取数据库中有没有该用户的信息:通过db对象,然后调用count方法
                count = self.db.count(sql)  #查找的结果
                #数据库中返回的数据做断言,判断是否有一条数据
                self.assertEqual(1, count)
            print("预期结果:{}".format(expected))
            print("实际结果:{}".format(result))
        except AssertionError as e:
            self.excel.write_data(row=row, column=8,
                                  value="未通过")  # 可以把列(column)放在配置文件里面
            # 记录没有通过的日志
            my_log.info("用例:{}------>执行未通过".format(test_data_cases["title"]))
            # 在没有通过的时候,使用print会打印在测试报告中
            print("预期结果:{}".format(expected))
            print("实际结果:{}".format(result))
            # 在没有通过的时候,将print输出到日志里面
            my_log.info("预期结果:{}".format(expected))
            my_log.info("实际结果:{}".format(result))
            raise e
        else:
            self.excel.write_data(row=row, column=8,
                                  value="通过")  # 可以把列(column)放在配置文件里面
            # 记录通过的日志
            my_log.info("用例:{}------>执行通过".format(test_data_cases["title"]))
Esempio n. 12
0
"""
测试用例运行程序的四个步骤:
(1)第一步:创建一个测试套件
(2)第二步:将测试用例,加载到测试套件中
 (3)第三步:创建一个测试程序运行程序启动器
 (4)第四步:使用启动器去执行测试套件
"""

# 测试用例运行程序
import unittest
import os
from library.HTMLTestRunnerNew import HTMLTestRunner
from common.contants import case_dir  # 测试用例模块所在的目录
from common.contants import reports_dir  # 测试报告的目录
from common.read_conf import conf  # 导入配置文件解释器对象
filename = conf.get_str("report", "filename")
# (1)第一步:创建测试套件
suite = unittest.TestSuite()

# (2)第二步:加载用例到套件中
# ①通过loader去加载
loader = unittest.TestLoader()
# ②往套件里面加载测试用例:通过所在目录路径加载
suite.addTest(loader.discover(case_dir))  # 给一个用例的所在目录的绝对路径
# 备注:加r的目的是防止转义
# (3)第三步:创建一个测试用例运行程序
report_path = os.path.join(reports_dir, filename)
with open(report_path, "wb") as f:  # 生成html文件的测试报告
    runner = HTMLTestRunner(
        stream=f,  # 打开一个报告文件,将句柄传给stream
        tester="小青年,",  # 报告中形式的测试人员,可添加多个
Esempio n. 13
0
    def test_withdraw(self, test_data_cases):
        # 第一步:准备用例数据
        # 备注:列表、字典方式存储的,excel读取出来是字符串。数值类型,读取出来是数值类型的,字符串类型,读取出来是字符串类型。
        # ①拼接完整的接口地址
        url = conf.get_str("env", "url_ip") + test_data_cases["url"]
        # ②请求的方法
        method = test_data_cases["method"]

        # ③请求参数
        #调用replace_data方法进行参数替换
        test_data_cases["data"] = replace_data(test_data_cases["data"])
        data = eval(test_data_cases["data"])
        # ④请求头
        headers = eval(conf.get_str("env", "headers"))
        # 添加鉴权
        # 判断是否为登录接口,不是登录接口,则需要加token值
        if test_data_cases["interface"] != "login":
            # headers["Authorization"] = self.token_data
            headers["Authorization"] = getattr(TestData, "token_data")
        # ⑤预期结果
        expected = eval(test_data_cases["expected"])
        # ⑥该用例在表单中所在行
        row = test_data_cases["case_id"] + 1

        # 第二步:发送请求到接口,获取实际结果
        if test_data_cases[
                "check_sql"]:  # 先判断用例里面check_sql字段是否有数据,如果有数据,说明需要进行数据库校验
            sql = test_data_cases["check_sql"].format(
                conf.get_str("test_data", "user"))
            # 获取充值之前的余额
            start_money = self.db.get_one(sql)[0]
        response = HandleRequest().send(url=url,
                                        method=method,
                                        json=data,
                                        headers=headers)
        result = response.json()
        # 判断是否是登录的用例,如果是登录接口,则去获取用户的id,并设置为类属性
        if test_data_cases["interface"] == "login":
            # 登录之后,从响应结果中提取用户id和token
            # (1)获取用户id
            # TestWithdraw.member_id = jsonpath.jsonpath(result, "$..id")[0]  # 通过类名.属性名设置类属性
            member_id = jsonpath.jsonpath(result, "$..id")[0]
            setattr(TestData, "member_id", str(
                member_id))  #使用setattr设置TestData类,member_id属性,属性值为member_id
            # (2)提取token
            token_type = jsonpath.jsonpath(result, "$..token_type")[0]
            token = jsonpath.jsonpath(result, "$..token")[0]
            # TestWithdraw.token_data = token_type + " " + token# 通过类名.属性名设置类属性
            token_data = token_type + " " + token  # 通过类名.属性名设置类属性
            setattr(
                TestData, "token_data",
                token_data)  # 使用setattr设置TestData类,token_data属性,属性值为token_data

            # 设置类属性还可以通过setattr进行设置
            # 下面这行代码和上面那行代码是一个意思,都是将token设为类属性
            setattr(TestWithdraw, "token_data", token_type + " " + token)
            # 第一个参数:类名
            # 第二个参数:属性名
            # 第三个参数:对应的属性值
        # 第三步:比对预期结果和实际结果
        try:
            self.assertEqual(expected["code"], result["code"])
            self.assertEqual(expected["msg"], result["msg"])
            # 提现后,进行数据库校验
            if test_data_cases["check_sql"]:
                sql = test_data_cases["check_sql"].format(
                    conf.get_str("test_data", "user"))
                # 获取提现之后的余额
                end_money = self.db.get_one(sql)[0]
                # 获取请求参数里面的充值金额
                recharge_money = decimal.Decimal(str(data["amount"]))
                my_log.info("提现之前金额为:{}\n,提现金额为:{}\n,提现之后金额为:{}\n".format(
                    start_money, recharge_money, end_money))
                # 进行断言
                self.assertEqual(recharge_money, start_money - end_money)
        except AssertionError as e:
            self.excel.write_data(row=row, column=8,
                                  value="未通过")  # 可以把列(column)放在配置文件里面
            # 记录没有通过的日志
            my_log.info("用例:{}------>执行未通过".format(test_data_cases["title"]))
            # 在没有通过的时候,使用print会打印在测试报告中
            print("预期结果:{}".format(expected))
            print("实际结果:{}".format(result))
            # 在没有通过的时候,将print输出到日志里面
            my_log.info("预期结果:{}".format(expected))
            my_log.info("实际结果:{}".format(result))
            raise e
        else:
            self.excel.write_data(row=row, column=8,
                                  value="通过")  # 可以把列(column)放在配置文件里面
            # 记录通过的日志
            my_log.info("用例:{}------>执行通过".format(test_data_cases["title"]))