class HandleSetup: @staticmethod def handle_setup(phone, pwd): url = conf.get("env", "url") + "/member/login" data = {"mobile_phone": phone, "pwd": 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] return member_id, token @staticmethod def handle_case(case, member_id, token): url = conf.get("env", "url") + case["url"] method = case["method"] # 替换参数中的ID data = eval(HandleSetup.replace_data(case["data"], member_id)) # 准备请求头 headers = eval(conf.get("env", "headers")) headers["Authorization"] = token # 发送请求获取实际结果 response = request(url=url, method=method, json=data, headers=headers) res = response.json() return data, res
def test_add(self, case): # 准备用例数据 phone = conf.get("test_data", "phone") pwd = conf.get("test_data", "pwd") member_id, token = HandleSetup.handle_setup(phone, pwd) start_count = TestAdd.handle_sql(self, case, member_id) data, res = HandleSetup.handle_case(case, member_id, token) row = case["case_id"] + 1 expected = eval(case["expected"]) # 断言,比对预期结果和实际结果 try: if start_count != 0: self.assertEqual(expected["code"], res["code"]) self.assertEqual(expected["msg"], res["msg"]) end_count = TestAdd.handle_sql(self, case, member_id) self.assertEqual(1, end_count - start_count) except AssertionError as e: 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="通过")
def __handle_url(short_url: str): #把url拼接成一个完整的url if short_url.startswith("/"): new_url = conf.get("url", "base_url") + short_url else: new_url = conf.get("url", "base_url") + "/" + short_url return new_url
def create_logger(): """ 创建日志收集器 :return: 日志收集器 """ # 第一步:创建一个日志收集器 log = logging.getLogger("musen") # 第二步:设置收集器收集的等级 log.setLevel(conf.get("log", "level")) # 第三步:设置输出渠道以及输出渠道的等级 fh = logging.FileHandler(log_filepath, encoding="utf8") fh.setLevel(conf.get("log", "fh_level")) log.addHandler(fh) sh = logging.StreamHandler() sh.setLevel(conf.get("log", "sh_level")) log.addHandler(sh) # 创建一个输出格式对象 formats = '%(asctime)s -- [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s' form = logging.Formatter(formats) # 将输出格式添加到输出渠道 fh.setFormatter(form) sh.setFormatter(form) return log
def test_withdraw(self, case): # 第一步准备用例参数 phone = conf.get("test_data", "phone") pwd = conf.get("test_data", "pwd") member_id, token = HandleSetup.handle_setup(phone, pwd) # 判断该用例是否需要数据库校验,获取提现之前的余额 start_money = TestWithdraw.handle_sql(self, case, member_id) data, res = HandleSetup.handle_case(case, member_id, token) row = case["case_id"] + 1 expected = eval(case["expected"]) # 第三步:断言预期结果和实际结果 try: if start_money != 0: self.assertEqual(expected["code"], res["code"]) self.assertEqual(expected["msg"], res["msg"]) end_money = TestWithdraw.handle_sql(self, case, member_id) withdraw_money = decimal.Decimal(str(data["amount"])) self.assertEqual(withdraw_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="通过")
def test_add(self, case): # 准备用例数据 phone = conf.get("test_data", "phone") pwd = conf.get("test_data", "pwd") member_id, token = HandleSetup.handle_setup(phone, pwd) case["url"] = case["url"].replace("#member_id#", member_id) url = conf.get("env", "url") + case["url"] method = case["method"] headers = {"X-Lemonban-Media-Type": "lemonban.v1"} response = request(url=url, method=method, json=data, headers=headers) res = response.json() row = case["case_id"] + 1 expected = eval(case["expected"]) try: self.assertEqual(expected["code"], res["code"]) self.assertEqual(expected["msg"], res["msg"]) 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="通过")
def handle_setup(phone, pwd): url = conf.get("env", "url") + "/member/login" data = {"mobile_phone": phone, "pwd": 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] return member_id, token
def __init__(self): """初始化方法中,连接到数据库""" self.con = pymysql.connect(host=conf.get("mysql", "host"), port=conf.getint("mysql", "port"), user=conf.get("mysql", "user"), password=conf.get("mysql", "password"), charset="utf8", cursorclass=pymysql.cursors.DictCursor) # 创建一个游标对象 self.cur = self.con.cursor()
def sendEmail(): # 1.连接smtp服务器,并登陆 smtp = smtplib.SMTP_SSL(conf.get("EMAIL", "host"), conf.get("EMAIL", "port")) smtp.login(conf.get("EMAIL", "user"), conf.get("EMAIL", "password")) # 2.构造一封多组件邮件 msg = MIMEMultipart() msg["Subject"] = conf.get("EMAIL", "subject") msg["To"] = conf.get("EMAIL", "To") msg["From"] = conf.get("EMAIL", "From") # 构造邮件的文本内容 text = MIMEText("邮件中的文本内容", _charset="utf8") msg.attach(text) # 构造邮件的附件 with open(os.path.join(REPORT_DIR, "report.html"), "rb") as f: content = f.read() report = MIMEApplication(content, _subtype='octet-stream') report.add_header('content-disposition', 'attachment', filename='自动化测试报告.html') msg.attach(report) # 3.发送邮件 smtp.send_message(msg, from_addr=conf.get("EMAIL", "from_addr"), to_addrs=conf.get("EMAIL", "to_addrs"))
def login(): """用例的前置条件:登录""" EnvData.name = random_proname() url = conf.get("env", "url") + "/user/login/" data = { "username": conf.get("test_data", "username"), "password": conf.get("test_data", "password") } res = (request(method="post", url=url, json=data)).json() token = "JWT" + " " + jsonpath.jsonpath(res, "$..token")[0] # 将提取出来的token作为EnvData的类属性(环境变量) setattr(EnvData, "token", token)
def __init__(self): # 连接数据库,创建游标。 # 1、建立连接 self.conn = pymysql.connect(host=conf.get("mysql", "host"), port=conf.getint("mysql", "port"), user=conf.get("mysql", "user"), password=conf.get("mysql", "password"), database=conf.get("mysql", "database"), charset="utf8", cursorclass=pymysql.cursors.DictCursor) # 2、创建游标 self.cur = self.conn.cursor()
def get_old_phone(): """ 从配置文件获取指定的用户名和密码 确保此帐号,在系统当中是注册了的。 返回:用户名和密码。 """ from Common.handle_config import conf user = conf.get("general_user","user") passwd = conf.get("general_user","passwd") # 如果数据库查找到user,就直接返回。如果没有,则调用注册接口注册一个。 # 不管注册与否,直接调用注册接口。 send_requests("POST","member/register",{"mobile_phone":user,"pwd":passwd}) return user,passwd
def test_login(self, case): # 第一步:准备用例数据 # 请求方法 method = case["method"] # 请求地址 url = case["url"] # 请求参数 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() # 第三步:断言 try: self.assertEqual(expected["code"], res["code"]) self.assertEqual(expected["msg"], res["msg"]) 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="通过")
def test_register(self, case): # 准备用例数据 method = case["method"] url = conf.get("env", "url") + case["url"] if case["interface"] == "register": # 注册接口,则随机生成一个用户名和email EnvData.name = self.random_username() EnvData.email = self.random_email() data = eval(replace_data(case["data"])) expected = eval(replace_data(case["expected"])) row = case["case_id"] + 1 # 第二步:发送请求获取实际结果 res = (requests.request(method=method, url=url, json=data)).json() # 第三步:断言 try: assert_dict(expected, res) # 判断是否需要进行sql校验 if case["check_sql"]: sql = replace_data(case["check_sql"]) res = 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="通过")
def replace_by_regular(data): """ 将字符串当中,匹配#(.*?)#部分,替换换对应的真实数据。 真实数据只从2个地方去获取:1个是配置文件当中的data区域 。另1个是,EvnData的类属性。 data: 字符串 return: 返回的是替换之后的字符串 ps: 1个是配置文件当中的data区域 。另1个是,EvnData的类属性。必须都是字符串类型。 """ res = re.findall("#(.*?)#", data) # 如果没有找到,返回的是空列表。 # 标识符对应的值,来自于:1、环境变量 2、配置文件 if res: for item in res: # 得到标识符对应的值。 try: value = conf.get("data", item) except: try: value = getattr(EnvData, item) except AttributeError: # value = "#{}#".format(item) continue print(value) # 再去替换原字符串 data = data.replace("#{}#".format(item), value) return data
def test_interface(self, case): login() newproject() # 1.准备用例数据 EnvData.name = random_intername() url = conf.get("env", "url") + case["url"] method = case["method"] data = eval(replace_data(case["data"])) expected = eval(replace_data(case["expected"])) headers = {"Authorization": getattr(EnvData, "token")} row = case["case_id"] + 1 if case["check_sql"]: sql = replace_data(case["check_sql"]) start_count = db.find_count(sql) res = (request(method=method, url=url, json=data, headers=headers)).json() # 第三步,断言预期结果和实际结果 try: assert_dict(expected, res) if case["check_sql"]: sql = replace_data(case["check_sql"]) end_count = db.find_count(sql) self.assertEqual(1, end_count - start_count) except AssertionError as e: 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="通过")
def __pre_url(url): """ 拼接接口的url地址。 """ base_url = conf.get("server", "base_url") if url.startswith("/"): return base_url + url else: return base_url + "/" + url
def __init__(self,file=None): # 设置输出级别、输出渠道、输出日志格式 # super().__init__(name,level) super().__init__(conf.get("log","name"),conf.get("log","level")) # 日志格式 fmt = '%(asctime)s %(name)s %(levelname)s %(filename)s-%(lineno)d line:%(message)s' formatter = logging.Formatter(fmt) # 控制台渠道 handle1 = logging.StreamHandler() handle1.setFormatter(formatter) self.addHandler(handle1) if file: # 文件渠道 handle2 = logging.FileHandler(file,encoding="utf-8") handle2.setFormatter(formatter) self.addHandler(handle2)
def test_register(self, case): # 第一步:准备用例数据 # 请求方法 method = case["method"] # 请求地址 url = conf.get("env", "url") + "/member/register" # 判断是否有手机号需要替换 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"]) 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="通过")
def newinterface(): url = conf.get("env", "url") + "/interfaces/" headers = {"Authorization": getattr(EnvData, "token")} data = { "name": random_intername(), "tester": "fls530", "project_id": getattr(EnvData, "pid"), "desc": "test" } res = (request(method='post', url=url, json=data, headers=headers)).json() EnvData.iid = str(jsonpath.jsonpath(res, "$..id")[0])
def test_audit(self, case): # 第一步:准备数据:获取管理员token admin_phone = conf.get("test_data", "phone") admin_pwd = conf.get("test_data", "pwd") admin_member_id, admin_token = HandleSetup.handle_setup(admin_phone, admin_pwd) # 2:获取普通用户id和token phone = conf.get("test_data", "phone") pwd = conf.get("test_data", "pwd") member_id, token = HandleSetup.handle_setup(phone, pwd) #每次添加一个新项目 url = conf.get("env", "url") + "/loan/add" headers = eval(conf.get("env", "headers")) headers["Authorization"] = token data = {"member_id": 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给审核的用例使用 loan_id = jsonpath.jsonpath(res, "$..id")[0] url = conf.get("env", "url") + case["url"] data = eval(case["data"].replace("#loan_id#", str(loan_id))) headers = eval(conf.get("env", "headers")) headers["Authorization"] = admin_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() # 第三步:断言 try: self.assertEqual(expected["code"], res["code"]) self.assertEqual(expected["msg"], res["msg"]) 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="通过")
def replace_data(data): """替换数据""" while re.search("#(.*?)#", data): res = re.search("#(.*?)", data) key = res.group() item = res.group(1) try: value = conf.get("test_data", item) except: value = getattr(HandleSetup, item) data = data.replace(key, value) return data
def test_invest(self, case): """投资用例""" # 第一步:准备数据 url = conf.get("env", "url") + case["url"] method = case["method"] headers = eval(conf.get("env", "headers")) if case["interface"] != "login": # 如果不是登陆接口,添加一个token headers["Authorization"] = getattr(HandleSetup, "token") data = eval(replace_data(case["data"])) expected = eval(case["expected"]) row = case["case_id"] + 1 response = request(url, method, json=data, headers=headers) res = response.json() if case["interface"] == "login": # 如果是登陆接口,提取id和token member_id = str(jsonpath.jsonpath(res, "$..id")[0]) token = "Bearer" + " " + jsonpath.jsonpath(res, "$..token")[0] setattr(HandleSetup, "member_id", member_id) setattr(HandleSetup, "token", token) if case["interface"] == "add": # 如果是加标接口,提取id进行保存 loan_id = str(jsonpath.jsonpath(res, "$..id")[0]) setattr(HandleSetup, "loan_id", loan_id) # 断言 try: self.assertEqual(expected["code"], res["code"]) self.assertEqual(expected["msg"], res["meg"]) 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="通过")
def __handle_header(token=None): """ 处理请求头。加上项目当中必带的请求头。如果有token,加上token。 :param token: token值 :return: 处理之后headers字典 """ headers = { "X-Lemonban-Media-Type": conf.get("server", "auth_type"), "Content-Type": "application/json" } if token: headers["Authorization"] = "Bearer {}".format(token) return headers
def replace_data(data): """替换数据""" while re.search("#(.*?)#", data): res = re.search("#(.*?)#", data) key = res.group() item = res.group(1) try: # 获取配置文件中的测试数据 value = conf.get("test_data", item) except: value = getattr(EnvData, item) data = data.replace(key, value) return data
def newproject(): # 每条用例之前都添加一个新的项目 url = conf.get("env", "url") + "/projects/" headers = {"Authorization": getattr(EnvData, "token")} data = { "name": random_proname(), "leader": "fls530", "tester": "fls530", "programmer": "fls530", "publish_app": "test", "desc": "test" } # 发送项目请求,添加项目 res = (request(method='post', url=url, json=data, headers=headers)).json() EnvData.pid = str(jsonpath.jsonpath(res, "$..id")[0])
def replace_by_regular(data): res = re.findall("#(.*?)#", data) # 如果没有找到,返回的是空列表。 # 标识符对应的值,来自于:1、环境变量 2、配置文件 if res: for item in res: # 得到标识符对应的值。 try: value = conf.get("data", item) except: try: value = getattr(EnvData, item) except AttributeError: # value = "#{}#".format(item) continue print(value) # 再去替换原字符串 data = data.replace("#{}#".format(item), value) return data
def __pre_data(data, token=None): """ 如果data是字符串,则转换成字典对象。 """ if data is not None and isinstance(data, str): # 如果有null,则替换为None if data.find("null") != -1: data = data.replace("null", "None") # 使用eval转成字典.eval过程中,如果表达式有涉及计算,会自动计算。 data = eval(data) # 如果是v3版本,需要加上sign和timestamp2个参数。 if conf.get("server", "auth_type") == "lemonban.v3" and token is not None: from Common.handle_rsa import generator_sign sign, timestamp = generator_sign(token) data["sign"] = sign data["timestamp"] = timestamp return data
def test_login(self, case): method = case["method"] url = conf.get("env", "url") + case["url"] data = eval(case["data"]) expected = eval(case["expected"]) row = case["case_id"] + 1 res = (request(method, url, json=data)).json() try: assert_dict(expected, 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="通过")
def __handle_header(header, token=None): global headers if header == 1: headers = {'App-ID': conf.get("UserInfo", "App-ID"), 'Content-Type': 'application/json'} elif header == 5: headers = { 'App-ID': conf.get("UserInfo", "App-ID"), 'Device-ID': conf.get("UserInfo", "Device-ID"), 'Distinct-Id': conf.get("UserInfo", "Distinct-Id"), 'Platform': conf.get("UserInfo", "Platform"), 'Version': conf.get("UserInfo", "Version"), 'Content-Type': 'application/json', } if token: headers["Access-Token"] = token return headers