예제 #1
0
    def test_html_report(self):
        runner = HttpRunner(failfast=True)
        summary = runner.run(self.testcase_cli_path)
        self.assertEqual(summary["stat"]["testcases"]["total"], 1)
        self.assertEqual(summary["stat"]["teststeps"]["total"], 10)
        self.assertEqual(summary["stat"]["teststeps"]["skipped"], 4)

        report_save_dir = os.path.join(os.getcwd(), 'reports', "demo")
        report.gen_html_report(summary, report_dir=report_save_dir)
        self.assertGreater(len(os.listdir(report_save_dir)), 0)
        shutil.rmtree(report_save_dir)
예제 #2
0
    def test_html_report_with_fixed_report_file(self):
        runner = HttpRunner(failfast=True)
        summary = runner.run(self.testcase_cli_path)
        self.assertEqual(summary["stat"]["testcases"]["total"], 1)
        self.assertEqual(summary["stat"]["teststeps"]["total"], 10)
        self.assertEqual(summary["stat"]["teststeps"]["skipped"], 4)

        report_file = os.path.join(os.getcwd(), 'reports', "demo", "test.html")
        report.gen_html_report(summary, report_file=report_file)
        report_save_dir = os.path.dirname(report_file)
        self.assertEqual(len(os.listdir(report_save_dir)), 1)
        self.assertTrue(os.path.isfile(report_file))
        shutil.rmtree(report_save_dir)
예제 #3
0
def run():
    runner = HttpRunner(failfast=False, log_level='INFO')
    run_report_path = r"reports/" + time.strftime('%Y%m%d%H%M%S') + ".html"
    # 2、运行用例
    # run方法支持如下参数:
    # yml用例文件的路径
    # 字典(用例的信息)
    # runner.run('testsuites/')
    # gen_html_report(runner._summary, report_template="templates/extent-theme-template.html")

    summary = runner.run(r'testsuites', dot_env_path='conf/env/.online_zy.env')
    gen_html_report(summary, report_file=run_report_path)
    print("报告地址:", os.path.abspath('.') + '/' + run_report_path)
예제 #4
0
 def test_html_report_xss(self):
     testcases = [{
         "config": {
             'name': "post data"
         },
         "teststeps": [{
             "name": "post data",
             "request": {
                 "url": "{}/anything".format(HTTPBIN_SERVER),
                 "method": "POST",
                 "headers": {
                     "Content-Type": "application/json"
                 },
                 "json": {
                     'success': False,
                     "person": "<img src=x onerror=alert(1)>"
                 }
             },
             "validate": [{
                 "eq": ["status_code", 200]
             }]
         }]
     }]
     tests_mapping = {"testcases": testcases}
     summary = self.runner.run(tests_mapping)
     report_path = report.gen_html_report(summary)
     with open(report_path) as f:
         content = f.read()
         m = re.findall(
             re.escape(
                 "&#34;person&#34;: &#34;&lt;img src=x onerror=alert(1)&gt;&#34;"
             ), content)
         self.assertEqual(len(m), 2)
예제 #5
0
 def run(self, testdata):
     data = json.loads(testdata)
     runner = HttpRunner(failfast=False)
     runner.run_tests(data)
     self.summary = runner._summary
     report_dir = os.path.join(urls.get_media_root(), "reports")
     self.reportpath = gen_html_report(self.summary, report_dir=report_dir)
예제 #6
0
    def test_html_report_repsonse_image(self):
        runner = HttpRunner(failfast=True)
        summary = runner.run("tests/httpbin/load_image.yml")

        report_save_dir = os.path.join(os.getcwd(), 'reports', "demo")
        report_path = report.gen_html_report(summary, report_dir=report_save_dir)
        self.assertTrue(os.path.isfile(report_path))
        shutil.rmtree(report_save_dir)
예제 #7
0
    def runtestcase(self, test_path=None, report_title=None, **kwargs):
        buildId = os.environ.get('BUILD_ID', '')
        templatePath = os.path.join(os.path.dirname(os.path.dirname(__file__)),
                                    "templates", "report_template.html")
        runner = HttpRunner(failfast=False,
                            log_level=self.log_level,
                            log_file=None)  #,report_template=templatePath)
        runner.run(test_path)
        runner._summary['html_report_name'] = report_title
        report.gen_html_report(runner._summary, report_template=templatePath)
        # #修改原生框架生成的报告名
        start_datetime = runner._summary["time"]["start_datetime"]
        start_at_timestamp = str(
            runner._summary["time"]["start_at"]).split('.')[0]
        report_file_name = "{}.html".format(
            start_datetime.replace(":", "").replace("-", ""))
        report_dir = os.path.join(os.getcwd(), "reports")
        reporttime = RunTime().getToDateTime(int(start_at_timestamp),
                                             "%Y-%m-%d_%H_%M_%S")
        report_file = os.path.join(report_dir, report_file_name)
        if os.path.exists(report_file):
            if buildId:
                self.reportName = report_title + "{}.html".format(buildId)
                reportpath = os.path.join(report_dir, self.reportName)
            else:
                reportpath = os.path.join(
                    report_dir,
                    report_title + "{}.html".format(str(reporttime)))
            os.rename(report_file, reportpath)
        self.summary = runner._summary
        args = kwargs.get('args')
        if args and args.testType == TEST_TYPE_1:
            fail = self.summary.get("stat").get('testcases').get('fail', 0)
            if fail > 0 and buildId:
                fail_dir = os.path.join(os.getcwd(), "failReports")
                if not os.path.exists(fail_dir):
                    os.mkdir(fail_dir)
                shutil.copy(reportpath, fail_dir)

        return self.summary
예제 #8
0
def add_test_reports(runner, report_name=None):
    """
    定时任务或者异步执行报告信息落地
    :param start_at: time: 开始时间
    :param report_name: str: 报告名称,为空默认时间戳命名
    :param kwargs: dict: 报告结果值
    :return:
    """
    time_stamp = int(runner.summary["time"]["start_at"])

    runner.summary['time']['start_datetime'] = datetime.datetime.fromtimestamp(
        time_stamp).strftime('%Y-%m-%d %H:%M:%S')

    report_name = report_name if report_name else runner.summary['time'][
        'start_datetime']
    runner.summary['html_report_name'] = report_name

    report_path = os.path.join(
        os.getcwd(),
        "reports{}{}.html".format(separator,
                                  int(runner.summary['time']['start_at'])))
    # v2中runner没有gen_html_report方法了,改为report.gen_html_report,模板换成v2改进版(改进v2模板的不符合jinja2语法的部分)
    # runner.gen_html_report(html_report_template=os.path.join(os.getcwd(), "templates{}extent_report_template.html".format(separator)))
    report_path = report.gen_html_report(
        runner.summary,
        report_template=os.path.join(
            os.getcwd(),
            "templates{}extent-theme-template-report.html".format(separator)))

    with open(report_path, encoding='utf-8') as stream:
        reports = stream.read()

    test_reports = {
        'report_name': report_name,
        'status': runner.summary.get('success'),
        # v2中summary无summary[stat][sucess]和summary[stat][testsRun]数据结构了
        # 'successes': runner.summary.get('stat').get('successes'),
        # 'testsRun': runner.summary.get('stat').get('testsRun'),
        'successes':
        runner.summary.get('stat').get('teststeps').get('successes'),
        'testsRun': runner.summary.get('stat').get('teststeps').get('total'),
        'start_at': runner.summary['time']['start_datetime'],
        'reports': reports
    }
    test_reports_obj = TestReports.objects.create(**test_reports)
    return report_path, test_reports_obj.id
예제 #9
0
def create_report(summary, report_name):
    """
    创建测试报告
    :param summary: runner 跑完的对象
    :param runner: HttpRunner对象
    :param report_name: 自定义报告名称
    :return:
    """
    # 定义报告名称并生成报告且获取报告内容
    report_path = report.gen_html_report(summary, report_template=r"stucit/template_new.html")

    # 继续格式化summary
    summary['time']['start_at'] = datetime. \
        fromtimestamp(int(summary['time']['start_at'])).strftime('%Y-%m-%d %H:%M:%S')
    summary['time']['duration'] = round(summary['time']['duration'], 2)
    for detail in summary['details']:
        detail['time']['duration'] = round(detail['time']['duration'], 2)
    # 处理前端所需数据
    case_list = []
    result_list = []
    case_details = []
    hasbeen = []
    i = 1
    for detail in summary.get("details"):
        if detail.get("records"):
            for record in detail.get("records"):
                case = {"value": i, "name": record.get("name")}
                if record.get("status") == "success":
                    name = "成功"
                elif record.get("status") == "error":
                    name = "失败"
                else:
                    name = "跳过"
                case_detail = {"result": record.get("status"), "case": i, "record": json.dumps(record)}
                i += 1
                case_list.append(case)
                case_details.append(case_detail)
                # 判断是否已经存在
                if not record.get("status") in hasbeen:
                    result = {"value": record.get("status"), "name": name}
                    result_list.append(result)
                hasbeen.append(record.get("status"))
예제 #10
0
def run_testsuit_by_suit_id(suit_id, user):
    data = TestSuit.get_content_by_suit_id(suit_id)
    suit_content = data.get('suit_content')
    project_id = data.get('project_id')
    case_id_env_id_list = []
    for content in suit_content:
        case_id_env_id_list.append({
            'exec_id': content.get('exec_id'),
            'env_id': content.get('env_id')
        })
    test_suit_parse = case_handle.TestSuitParse(case_id_env_id_list,
                                                project_id)
    suite = test_suit_parse.get_httprunner_test_suite_json()

    runner = HttpRunner()
    result = runner.run(suite)

    report_save_path = os.path.join(os.getcwd(), 'openapi/reports')
    report_path = report.gen_html_report(result, report_dir=report_save_path)
    Report.create(report_path, suit_id, user)
    return report_path.split('/')[-1]
예제 #11
0
파일: cli.py 프로젝트: 627886474/httprunner
def main():
    """ API test: parse command line options and run commands.
    """
    parser = argparse.ArgumentParser(description=__description__)
    parser.add_argument(
        '-V', '--version', dest='version', action='store_true',
        help="show version")
    parser.add_argument(
        'testfile_paths', nargs='*',
        help="Specify api/testcases/testsuites file paths to run.")
    parser.add_argument(
        '--log-level', default='INFO',
        help="Specify logging level, default is INFO.")
    parser.add_argument(
        '--log-file',
        help="Write logs to specified file path.")
    parser.add_argument(
        '--dot-env-path',
        help="Specify .env file path, which is useful for keeping sensitive data.")
    parser.add_argument(
        '--report-template',
        help="Specify report template path.")
    parser.add_argument(
        '--report-dir',
        help="Specify report save directory.")
    parser.add_argument(
        '--report-file',
        help="Specify report file path, this has higher priority than specifying report dir.")
    parser.add_argument(
        '--save-tests', action='store_true', default=False,
        help="Save loaded/parsed/vars_out/summary json data to JSON files.")
    parser.add_argument(
        '--failfast', action='store_true', default=False,
        help="Stop the test run on the first error or failure.")
    parser.add_argument(
        '--startproject',
        help="Specify new project name.")

    args = parser.parse_args()

    if len(sys.argv) == 1:
        # no argument passed
        parser.print_help()
        sys.exit(0)

    if args.version:
        print(f"{__version__}")
        sys.exit(0)

    project_name = args.startproject
    if project_name:
        create_scaffold(project_name)
        sys.exit(0)

    runner = HttpRunner(
        failfast=args.failfast,
        save_tests=args.save_tests,
        log_level=args.log_level,
        log_file=args.log_file
    )

    err_code = 0
    try:
        for path in args.testfile_paths:
            summary = runner.run(path, dot_env_path=args.dot_env_path)
            report_dir = args.report_dir or os.path.join(os.getcwd(), "reports")
            gen_html_report(
                summary,
                report_template=args.report_template,
                report_dir=report_dir,
                report_file=args.report_file
            )
            err_code |= (0 if summary and summary["success"] else 1)
    except Exception as ex:
        logger.error(f"!!!!!!!!!! exception stage: {runner.exception_stage} !!!!!!!!!!\n{str(ex)}")
        sentry_sdk.capture_exception(ex)
        err_code = 1

    sys.exit(err_code)
예제 #12
0
파일: run.py 프로젝트: zwliu2/autotest
    #创建连接对象
    conn = psycopg2.connect(database=db,
                            user=user,
                            password=passwd,
                            host=host,
                            port=port)
    cur = conn.cursor()  #创建指针对象
    #删除数据
    cur.execute("DELETE FROM meetings WHERE name LIKE %s", ('AUTOTEST_%', ))
    cur.execute("DELETE FROM organs WHERE phone LIKE %s", ('190%', ))
    # 关闭连接
    conn.commit()
    cur.close()
    conn.close()


if __name__ == '__main__':
    print("Start....")
    runner = HttpRunner(failfast=False)

    #执行测试用例集
    summary = runner.run('./testsuites')
    #生成报告
    gen_html_report(summary)
    #清理测试数据
    clean_data()
    #推送钉钉消息
    DataInteg.genHtml(summary)
    print("End....")
예제 #13
0
파일: cli.py 프로젝트: sw6819/httprunner
def main():
    """ API test: parse command line options and run commands.
    """
    if is_py2:
        color_print(get_python2_retire_msg(), "YELLOW")

    parser = argparse.ArgumentParser(description=__description__)
    parser.add_argument(
        '-V', '--version', dest='version', action='store_true',
        help="show version")
    parser.add_argument(
        'testfile_paths', nargs='*',
        help="Specify api/testcase/testsuite file paths to run.")
    parser.add_argument(
        '--log-level', default='INFO',
        help="Specify logging level, default is INFO.")
    parser.add_argument(
        '--log-file',
        help="Write logs to specified file path.")
    parser.add_argument(
        '--dot-env-path',
        help="Specify .env file path, which is useful for keeping sensitive data.")
    parser.add_argument(
        '--report-template',
        help="Specify report template path.")
    parser.add_argument(
        '--report-dir',
        help="Specify report save directory.")
    parser.add_argument(
        '--report-file',
        help="Specify report file path, this has higher priority than specifying report dir.")
    parser.add_argument(
        '--save-tests', action='store_true', default=False,
        help="Save loaded/parsed/summary json data to JSON files.")
    parser.add_argument(
        '--failfast', action='store_true', default=False,
        help="Stop the test run on the first error or failure.")
    parser.add_argument(
        '--startproject',
        help="Specify new project name.")
    parser.add_argument(
        '--validate', nargs='*',
        help="Validate JSON testcase format.")
    parser.add_argument(
        '--prettify', nargs='*',
        help="Prettify JSON testcase format.")

    args = parser.parse_args()

    if len(sys.argv) == 1:
        # no argument passed
        parser.print_help()
        sys.exit(0)

    if args.version:
        color_print("{}".format(__version__), "GREEN")
        sys.exit(0)

    if args.validate:
        validate_json_file(args.validate)
        sys.exit(0)
    if args.prettify:
        prettify_json_file(args.prettify)
        sys.exit(0)

    project_name = args.startproject
    if project_name:
        create_scaffold(project_name)
        sys.exit(0)

    runner = HttpRunner(
        failfast=args.failfast,
        save_tests=args.save_tests,
        log_level=args.log_level,
        log_file=args.log_file
    )

    err_code = 0
    try:
        for path in args.testfile_paths:
            summary = runner.run(path, dot_env_path=args.dot_env_path)
            report_dir = args.report_dir or os.path.join(runner.project_working_directory, "reports")
            gen_html_report(
                summary,
                report_template=args.report_template,
                report_dir=report_dir,
                report_file=args.report_file
            )
            err_code |= (0 if summary and summary["success"] else 1)
    except Exception as ex:
        color_print("!!!!!!!!!! exception stage: {} !!!!!!!!!!".format(runner.exception_stage), "YELLOW")
        color_print(str(ex), "RED")
        capture_exception(ex)
        err_code = 1

    sys.exit(err_code)