def __init__(self, product, env, db_type='tenant'): config_info = ConfigInfo(product, env) db_host, db_port, db_user, db_pwd, db_name = config_info.get_mysql_link( ) BaseDB.__init__(self, db_host, db_port, db_user, db_pwd) if isinstance(db_name, dict): db_name = db_name[db_type] self.set_db(db_name)
def pytest_runtest_makereport(item): """ Extends the PyTest Plugin to take and embed screenshot in html report, whenever test fails. :param item: """ pytest_html = item.config.pluginmanager.getplugin('html') outcome = yield report = outcome.get_result() # 模块名称,先读取用例文件是否定义module_name,没有则读取用例目录的__init__.py文件 report.module_name = description_html( getattr(item.module, 'module_name', '')) if report.module_name == '没有定义': report.module_name = description_html(get_module_name(report.nodeid)) # 用例描述 report.description = description_html(item.function.__doc__) extra = getattr(report, 'extra', []) config_info = ConfigInfo() product_path = config_info.product_path # 用start_run.py执行为一个session,此session目录用于收集每个session的所有报告,便于发送 if not config_info.__dict__.get('session_id'): config_info.session_id = f'{dir_time}_{randint(10, 99)}' if report.when == 'call' or report.when == "setup": xfail = hasattr(report, 'wasxfail') if (report.skipped and xfail) or (report.failed and not xfail): create_dir(product_path + '/report') # 创建report根目录 create_dir(product_path + '/report/' + config_info.session_id) # 创建session报告汇总目录 parent_dir = product_path + '/report/' + config_info.session_id + '/' + dir_time create_dir(parent_dir) # 创建实际报告目录 abs_img_dir = parent_dir + '/img/' # 图片绝对路径目录 create_dir(abs_img_dir) # 创建图片目录 img_name = _rename(report.nodeid, replace_type='img') + ".png" abs_img_path = abs_img_dir + img_name # 图片绝对路径,用于保存图片 rlt_img_path = './img/' + img_name # 图片相对路径,用于html文件读取 _capture_screenshot(abs_img_path) # 截图并保存 print(report.nodeid) if rlt_img_path: html = '<div><img src="%s" alt="screenshot" style="width:auto;height:228px;" ' \ 'onclick="window.open(this.src)" align="right"/></div>' % rlt_img_path extra.append(pytest_html.extras.html(html)) report.extra = extra report.nodeid = _rename(report.nodeid, replace_type='report') # 替换报告节点名称
parser.add_argument('--testsuite', help='测试套文件,如testsuite.yaml,存放目录为./testcase/app,与-m只能同时存在一个') parser.add_argument('-m', help='用例标记,与pytest -m用法一致,如-m mark1;支持多个标记,如-m "mark1 and mark2",' '与--testsuite只能同时存在一个', metavar='markers') parser.add_argument('--dir', help='用例目录或用例文件,填写相对路径,起始目录为./产品目录/testcase/app,多个使用空格分隔,' '如--dir "xcjc clys/test_1.py"') parser.add_argument('--reruns', help='失败重跑次数,默认为1次', default=1, type=int) parser.add_argument('--session', help='会话目录,保存报告的父级目录') parser.add_argument('--batch', help='是否批量运行,默认为0(否)', default=0, type=int) parser.add_argument('--reset', help='是否重置app,默认1(是)', default=1, type=int) parser.add_argument('--reinstall', help='是否重新安装app,默认0(否)', default=0, type=int) parser.add_argument('--start_appium', help='是否自动开启appium服务,默认为0(否)', default=0, type=int) parser.add_argument('--imp', help='隐式等待时间,默认1秒', default=1, type=int) args = parser.parse_args() print(args) config_info = ConfigInfo(args.product, args.env) # 注意是单例实例化 product_path = config_info.product_path app = config_info.get_app() report_name = config_info.get_report_name() # 会话目录,不指定时自动生成 if args.session: config_info.session_id = args.session else: config_info.session_id = f'{dir_time}_{randint(10, 99)}' try: # 项目 if not os.path.exists(product_path): raise Exception('找不到该路径:%s' % product_path) # 设备
from Base.BaseYaml import get_yaml from Base.BaseConfig import ConfigInfo from Base.BaseMysql import DbConn import os # ————————————————以下项一般不建议修改—————————————————— dir_name = os.path.dirname(__file__) f = get_yaml(dir_name + '/config.yaml') product = f['product'] env = f['env'] config_info = ConfigInfo(product, env) product_path = config_info.product_path db = DbConn(product, env) # ————————————————以下项可根据需要增删改—————————————————— def get_user_info(account=None): login_info = f['login_info'][env] corp_id = login_info['corp_id'] # 如果指定用户名,则获取指定用户密码,否则获取全部 u_p_info = login_info['u_p'] if account: if account in u_p_info: password = u_p_info[account][0] username = u_p_info[account][1] return [corp_id, account, password, username] else: raise KeyError('配置文件不存在该用户名,请检查') else: result = [] for account in u_p_info:
t_file.find('//h1').text = title # 文件写入 t_file.write(save_file) print('已生成概览报告') if __name__ == '__main__': try: # 找到对应产品刚跑完的报告 parser = argparse.ArgumentParser() parser.add_argument('product', help='产品编码,如移动质检为ydzj,请与产品目录名称保持一致') parser.add_argument('parent_dir', help='报告父级目录名,填写相对路径,起始路径为./产品目录/report') args = parser.parse_args() product, parent_dir = args.product, args.parent_dir config_info = ConfigInfo(product=product) product_path = config_info.product_path session_report_dir = product_path + '/report/' + parent_dir f_list = [] html_files = catch_all_files(session_report_dir, f_list, 'html') temp_dir = create_dir(product_path + '/report/temp/') temp_dir = create_dir(temp_dir + parent_dir) # 通过报告生成概览报告 overview_file = temp_dir + '/overview.html' overview_ins = CreateOverview() overview_ins.create_overview(config_info.get_report_name(), html_files, overview_file) # 计算 pass_rate = overview_ins.pass_rate
'如--dir "xcjc clys/test_1.py"') parser.add_argument('--reruns', help='失败重跑次数,默认为1', default=1, type=int) parser.add_argument('--session', help='会话目录,保存报告的父级目录') parser.add_argument('--headless', help='无头模式运行,暂时只支持chrome,默认为0(关闭)', default=0, type=int) parser.add_argument('--window_size', help='指定浏览器分辨率,默认为"1920,1080"', default="1920,1080") parser.add_argument('--max_window', help='窗口最大化,默认为1(开启)', default=1, type=int) parser.add_argument('--imp', help='隐式等待时间,默认1秒', default=1, type=int) args = parser.parse_args() print(args) config_info = ConfigInfo(args.product, args.env) product_path = config_info.product_path init_url = config_info.get_init_url() report_name = config_info.get_report_name() # 会话目录,不指定时自动生成 if args.session: config_info.session_id = args.session else: config_info.session_id = f'{dir_time}_{randint(10, 99)}' try: # 项目 if not os.path.exists(product_path): raise Exception('找不到该路径:%s' % product_path) # 启动浏览器