#!/user/bin/env python # -*- coding: utf-8 -*- # __author__ = yangyd # Create time: 2019/7/10 0010 9:31 import pymysql import random import string from common_code.operate_config import DoConfig from common_code.project_path import CONFIG_FILE_PATH conf = DoConfig(CONFIG_FILE_PATH) class OperateMysql: # 初始化一个数据库连接和游标 def __init__(self): self.connect = pymysql.connect( host=conf.read_info('Mysql', 'host'), port=conf.read_int('Mysql', 'port'), user=conf.read_info('Mysql', 'user'), password=conf.read_info('Mysql', 'password'), db=conf.read_info('Mysql', 'db'), charset=conf.read_info('Mysql', 'charset'), cursorclass=pymysql.cursors.DictCursor ) self.cursor = self.connect.cursor()
# 测试用例文件路径 CASE_PATH = os.path.join(PROJECT_PATH, 'test_datas') CASE_FILE_PATH = os.path.join(CASE_PATH, 'test_cases.xlsx') # 配置文件路径 CONFIG_PATH = os.path.join(PROJECT_PATH, 'config_file') CONFIG_FILE_PATH = os.path.join(CONFIG_PATH, 'config.conf') USER_FILE_PATH = os.path.join(CONFIG_PATH, 'user.conf') # 日志路径 LOG_PATH = os.path.join(PROJECT_PATH, 'logs') LOG_FILE_PATH = os.path.join(LOG_PATH, 'request_log.txt') # 测试报告路径 path_conf = DoConfig(CONFIG_FILE_PATH) # 报告结尾添加时间戳 timestamp = datetime.strftime(datetime.now(), '%Y-%m-%d-%H-%M-%S') html = path_conf.read_info('Report', 'html_name') report_name = html + '_' + timestamp REPORT_PATH = os.path.join(PROJECT_PATH, 'reports') REPORT_FILE_PATH = os.path.join(REPORT_PATH, report_name + '.html') # 测试类文件路径 TEST_CASES_PATH = os.path.join(PROJECT_PATH, 'test_cases') if __name__ == '__main__': print(PROJECT_PATH) print(CASE_PATH)
def __init__(self): self.conf = DoConfig(os.path.join(CONFIG_PATH, 'user.conf'))
import unittest from libs.ddt import ddt, data from common_code.operate_http_requests import HttpRequest from common_code import project_path from common_code.operate_config import DoConfig from common_code.operate_log import my_logger from common_code.operate_excel import DoExcel from common_code.parameterization import Parameter add_data = DoExcel(project_path.CASE_FILE_PATH, 'add').read_excel(2) login_success = DoExcel(project_path.CASE_FILE_PATH, 'loginsuccess').read_excel(3, end_row=3) succeed = DoConfig(project_path.CONFIG_FILE_PATH).read_info('test_result', 'succeed') failed = DoConfig(project_path.CONFIG_FILE_PATH).read_info('test_result', 'failed') @ddt class TestAdd(unittest.TestCase): @classmethod def setUpClass(cls): cls.request = HttpRequest() cls.session_request = cls.request.request_session @data(*add_data) def test_add(self, add): print("测试的用例是:{}".format(add['description'])) login_data = Parameter.add_parameter(login_success[0]['param'])
class RegFixeUser: def __init__(self): self.conf = DoConfig(os.path.join(CONFIG_PATH, 'user.conf')) @staticmethod def reg_borrow(): do_mysql = OperateMysql() reg_url = 'http://tj.lemonban.com/futureloan/mvc/api/member/register' phone = do_mysql.unreg_phone() param = {"mobilephone": phone, "pwd": "123456", "regname": "borrow_nesta"} reg_request = HttpRequest() while True: reg_request.http_request(reg_url, 'post', param) sql = 'SELECT id FROM member where MobilePhone = %s' res = do_mysql.run_sql(sql, (phone,)) if res: borrow_data = { 'borrow_user': {'mobilephone': phone, 'memberid': res[0]['id'], 'pwd': 123456 } } # self.conf.batch_write('borrow_user', data, os.path.join(CONFIG_PATH, 'user.conf')) do_mysql.mysql_close() break return borrow_data @staticmethod def reg_invest(): do_mysql = OperateMysql() reg_url = 'http://tj.lemonban.com/futureloan/mvc/api/member/register' phone = do_mysql.unreg_phone() param = {"mobilephone": phone, "pwd": "123456", "regname": "invest_nesta"} reg_request = HttpRequest() while True: reg_request.http_request(reg_url, 'post', param) sql = 'SELECT id FROM member where MobilePhone = %s' res = do_mysql.run_sql(sql, (phone,)) if res: # invest_data = {'mobilephone': phone, # 'memberid': res[0]['id'], # 'pwd': 123456 # } # self.conf.batch_write('invest_user', data, os.path.join(CONFIG_PATH, 'user.conf')) do_mysql.mysql_close() break invest_data = { 'invest_user': {'mobilephone': phone, 'memberid': res[0]['id'], 'pwd': 123456 } } return invest_data @staticmethod def reg_admin(): do_mysql = OperateMysql() reg_url = 'http://tj.lemonban.com/futureloan/mvc/api/member/register' phone = do_mysql.unreg_phone() param = {"mobilephone": phone, "pwd": "123456", "regname": "admin_nesta"} reg_request = HttpRequest() while True: reg_request.http_request(reg_url, 'post', param) sql = 'SELECT id FROM member where MobilePhone = %s' res = do_mysql.run_sql(sql, (phone,)) if res: admin_data = { 'admin_user': {'mobilephone': phone, 'memberid': res[0]['id'], 'pwd': 123456 } } # self.conf.write_config(data, os.path.join(CONFIG_PATH, 'user.conf')) do_mysql.mysql_close() break return admin_data def crate_config(self): data = {} data.update(self.reg_borrow()) data.update(self.reg_invest()) data.update(self.reg_admin()) self.conf.write_config(data, os.path.join(CONFIG_PATH, 'user.conf'))
#!/user/bin/env python # -*- coding: utf-8 -*- # __author__ = yangyd # Create time: 2019/7/8 0008 14:25 from openpyxl import load_workbook from common_code.operate_config import DoConfig from common_code.project_path import CONFIG_FILE_PATH conf = DoConfig(CONFIG_FILE_PATH) actual_col = conf.read_int('test_result', 'actual_col') test_col = conf.read_int('test_result', 'test_col') class DoExcel: def __init__(self, file_path, sheet_name=None): """ 打开文件,并获取工作薄 :param file_path: 文件路径 :param sheet_name: sheet名 """ self.file_path = file_path self.sheet_name = sheet_name def read_excel(self, start_row=1, start_col=1, end_row=None, end_col=None): """ 读取指定行列的所有数据 :param start_row: 起始行,默认为1 :param start_col: 起始列,默认为1
#!/user/bin/env python # -*- coding: utf-8 -*- # __author__ = yangyd # Create time: 2019/6/27 0027 13:23 import logging from common_code import project_path from common_code.operate_config import DoConfig log_path = project_path.LOG_FILE_PATH conf = DoConfig(project_path.CONFIG_FILE_PATH) class MyLog: def __init__(self): # 创建日志收集器,并设置日志等级 self.logger = logging.getLogger(conf.read_info('log', 'log_name')) self.logger.setLevel(conf.read_info('log', 'gather_level')) # 创建日志渠道 控制台或者文件 self.console_log = logging.StreamHandler() self.file_log = logging.FileHandler(project_path.LOG_FILE_PATH, encoding='utf-8') # 设置日志输出格式 con_format = logging.Formatter(conf.read_info('log', 'con_format')) file_format = logging.Formatter(conf.read_info('log', 'file_format')) self.console_log.setFormatter(con_format) self.file_log.setFormatter(file_format)
class Parameter: unreg_pattern = r'\$\{no_reg_phone\}' reg_pattern = r'\$\{yet_regist_phone\}' recharge_pattern = r'\$\{yet_regist_phone\}' add_pattern = r'\$\{add_memberid\}' loan_pattern = r'\$\{loan_memberid\}' loan_id_pattern = r'\$\{loan_Id\}' admin_user_pattern = r'\$\{admin_user\}' borrow_id_pattern = r'\$\{borrow_memberid\}' conf = DoConfig(USER_FILE_PATH) @classmethod def unreg_phone_replace(cls, reg_data): """ 未注册手机号替换 :param reg_data: :return: """ if re.search(cls.unreg_pattern, reg_data): do_mysql = OperateMysql() unreg_phone = do_mysql.unreg_phone() reg_data = re.sub(cls.unreg_pattern, unreg_phone, reg_data) do_mysql.mysql_close() return reg_data @classmethod def reg_phone_replace(cls, reg_data): """ 已注册手机号替换 :param reg_data: :return: """ if re.search(cls.reg_pattern, reg_data): do_mysql = OperateMysql() reg_phone = do_mysql.reg_phone() reg_data = re.sub(cls.reg_pattern, reg_phone, reg_data) do_mysql.mysql_close() return reg_data @classmethod def register_parameter(cls, reg_data): """ 注册相关数据正则替换 :param reg_data: :return: """ reg_data = cls.unreg_phone_replace(reg_data) reg_data = cls.reg_phone_replace(reg_data) return reg_data @classmethod def login_parameter(cls, login_data): """ 登录数据参数化 :param login_data: :return: """ login_data = cls.unreg_phone_replace(login_data) login_data = cls.reg_phone_replace(login_data) return login_data @classmethod def recharge_parameter(cls, recharge_data): """ 充值数据参数化 :param recharge_data: :return: """ # 读取配置文件中已有投资人号码 rech_phone = cls.conf.read_info('invest_user', 'mobilephone') if re.search(cls.recharge_pattern, recharge_data): recharge_data = re.sub(cls.recharge_pattern, rech_phone, recharge_data) return recharge_data @classmethod def add_parameter(cls, add_data): add_memberid = cls.conf.read_info('borrow_user', 'memberid') add_phone = cls.conf.read_info('invest_user', 'mobilephone') if re.search(cls.add_pattern, add_data): add_data = re.sub(cls.add_pattern, add_memberid, add_data) if re.search(cls.reg_pattern, add_data): add_data = re.sub(cls.reg_pattern, add_phone, add_data) return add_data @classmethod def loan_parameter(cls, loan_data): admin_phone = cls.conf.read_info('admin_user', 'mobilephone') loan_memberid = cls.conf.read_info('invest_user', 'memberid') loan_phone = cls.conf.read_info('invest_user', 'mobilephone') borrow_id = cls.conf.read_info('borrow_user', 'memberid') # 替换投资人ID loan_data = re.sub(cls.loan_pattern, loan_memberid, loan_data) # 替换投资人帐号 loan_data = re.sub(cls.recharge_pattern, loan_phone, loan_data) # 替换管理员帐号 loan_data = re.sub(cls.admin_user_pattern, admin_phone, loan_data) # 替换借款人ID loan_data = re.sub(cls.borrow_id_pattern, borrow_id, loan_data) # 获取属性并参数化标ID if re.search(cls.loan_id_pattern, loan_data): loan_id = str(getattr(cls, "loan_id")) loan_data = re.sub(cls.loan_id_pattern, loan_id, loan_data) return loan_data
import unittest import os from common_code.operate_config import DoConfig # from test_cases import register_test # from test_cases import add_test # from test_cases import login_test # from test_cases import recharge_test # from test_cases import bidlodn_test from libs.HTMLTestRunnerNew import HTMLTestRunner from common_code.project_path import CASE_PATH, REPORT_FILE_PATH, USER_FILE_PATH, TEST_CASES_PATH from common_code.project_path import CONFIG_FILE_PATH from common_code.reg_fixed_account import RegFixeUser conf = DoConfig(CONFIG_FILE_PATH) # 判断用户文件是否已创建 if not os.path.exists(USER_FILE_PATH): RegFixeUser().crate_config() # suite = unittest.TestSuite() # loader = unittest.TestLoader() # suite.addTest(loader.loadTestsFromModule(register_test)) # suite.addTest(loader.loadTestsFromModule(recharge_test)) # suite.addTest(loader.loadTestsFromModule(login_test)) # suite.addTest(loader.loadTestsFromModule(bidlodn_test)) # suite.addTest(loader.loadTestsFromModule(add_test)) # 自动识别指定文件夹下的测试文件 suite = unittest.defaultTestLoader.discover(TEST_CASES_PATH,