def test_html_report_repsonse_image(self):
     testset_path = "tests/httpbin/load_image.yml"
     runner = HttpRunner().run(testset_path)
     summary = runner.summary
     output_folder_name = os.path.basename(os.path.splitext(testset_path)[0])
     report = runner.gen_html_report(html_report_name=output_folder_name)
     self.assertTrue(os.path.isfile(report))
     report_save_dir = os.path.join(os.getcwd(), 'reports', output_folder_name)
     shutil.rmtree(report_save_dir)
    def test_html_report(self):
        kwargs = {}
        output_folder_name = os.path.basename(os.path.splitext(self.testset_path)[0])
        runner = HttpRunner().run(self.testset_path)
        summary = runner.summary
        self.assertEqual(summary["stat"]["testsRun"], 10)
        self.assertEqual(summary["stat"]["skipped"], 4)

        runner.gen_html_report(html_report_name=output_folder_name)
        report_save_dir = os.path.join(os.getcwd(), 'reports', output_folder_name)
        shutil.rmtree(report_save_dir)
Exemple #3
0
def run_batch_test(request):
    """
    批量运行用例
    :param request:
    :return:
    """
    if request.session.get('login_status'):
        kwargs = {
            "failfast": False,
        }
        runner = HttpRunner(**kwargs)
        if request.is_ajax():
            try:
                kwargs = json.loads(request.body.decode('utf-8'))
            except ValueError:
                logging.error('待运行用例信息解析异常:{kwargs}'.format(kwargs=kwargs))
                return HttpResponse('信息解析异常,请重试')
            test_list = kwargs.pop('id')
            base_url = kwargs.pop('env_name')
            type = kwargs.pop('type')
            config = kwargs.pop('config')
            report_name = kwargs.get('report_name', None)
            testcases_dict = run_by_batch(test_list,
                                          base_url,
                                          config,
                                          type=type)
            if not testcases_dict:
                return HttpResponse('没有用例哦')
            main_hrun.delay(testcases_dict, report_name)
            return HttpResponse('用例执行中,请稍后查看报告即可,默认时间戳命名报告')
        else:
            type = request.POST.get('type', None)
            base_url = request.POST.get('env_name')
            config = request.POST.get('config')
            test_list = request.body.decode('utf-8').split('&')
            if type:
                testcases_lists = run_by_batch(test_list,
                                               base_url,
                                               config,
                                               type=type,
                                               mode=True)
            else:
                testcases_lists = run_by_batch(test_list, base_url, config)
            if testcases_lists:
                runner.run(testcases_lists)
                return render_to_response('report_template.html',
                                          runner.summary)
            else:  # 没有用例默认重定向到首页
                return HttpResponseRedirect('/api/index/')
    else:
        return HttpResponseRedirect("/api/login/")
Exemple #4
0
def batch_main_hrun(testset_path, executor=None, request_data=None):
    """
    用例运行
    :param testset_path: dict or list
    :param report_name: str
    :return:
    """
    logger.setup_logger('INFO')
    kwargs = {
        "failfast": False,
    }
    runner = HttpRunner(**kwargs)
    error_info = {
        'start_time': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    }

    report_type = 'test'
    report_name = '执行异常'

    try:
        test_list = request_data.pop('id')
        base_url = request_data.pop('env_name')
        type = request_data.pop('type')
        report_name = request_data.get('report_name', None)
        if type:
            report_type = type

        run_by_batch(test_list, base_url, testset_path, type=type)

        runner.run2(testset_path)
        shutil.rmtree(testset_path)

        runner.summary = timestamp_to_datetime(runner.summary)
        report_path = add_test_reports(runner,
                                       report_name=report_name,
                                       report_type=report_type,
                                       executor=executor)
    except Exception as e:
        logger.log_info("出现异常: {0}".format(e))
        error_info['error_msg'] = "出现异常: {0}".format(e)
        add_error_reports(error_info,
                          report_name=report_name,
                          report_type=report_type,
                          executor=executor)
    except BaseException as e:
        logger.log_info("出现异常: {0}".format(e))
        error_info['error_msg'] = "出现异常: {0}".format(e)
        add_error_reports(error_info,
                          report_name=report_name,
                          report_type=report_type,
                          executor=executor)
Exemple #5
0
def run_test(request):
    id = request.POST.get('id')
    base_url = request.POST.get('env_name')

    kwargs = {
        "failfast": False,
    }
    runner = HttpRunner(**kwargs)

    ct = time.time()
    local_time = time.localtime(ct)
    data_head = time.strftime("%Y-%m-%d %H-%M-%S", local_time)
    data_secs = (ct - int(ct)) * 1000
    time_stamp = "%s-%03d" % (data_head, data_secs)
    testcase_dir_path = os.path.join(os.getcwd(), "suite")
    testcase_dir_path = os.path.join(testcase_dir_path, time_stamp)
    config = {
        'config': {
            'name': 'base_url config',
            'request': {
                'base_url': base_url
            }
        }
    }
    testcase_list = []

    testcase_list.append(config)
    try:
        obj = models.TestInfo.objects.get(id=id)
    except ObjectDoesNotExist:
        return testcase_list

    request = eval(obj.request)
    name = obj.test_name
    testcase_list.append(request)

    if not os.path.exists(testcase_dir_path):
        os.mkdir(testcase_dir_path)

    file_path = os.path.join(testcase_dir_path, name + ".yml")
    with io.open(file_path, 'w', encoding='utf-8') as stream:
        yaml.dump(testcase_list,
                  stream,
                  indent=4,
                  default_flow_style=False,
                  encoding='utf-8')

    runner.run(testcase_dir_path)

    return render_to_response('report_template.html', runner.summary)
def run_batch_test(request):
    if request.session.get('login_status'):
        if request.method == 'POST':
            base_url = request.POST.get('env_name')
            test_list = request.body.decode('utf-8').split('&')
            testcases_lists = run_by_batch(test_list, base_url)
            kwargs = {
                "failfast": False,
            }
            runner = HttpRunner(**kwargs)
            runner.run(testcases_lists)
            return render_to_response('report_template.html', runner.summary)
    else:
        return HttpResponseRedirect("/api/login/")
Exemple #7
0
    def test_html_report(self):
        kwargs = {}
        output_folder_name = os.path.basename(
            os.path.splitext(self.testset_path)[0])
        runner = HttpRunner().run(self.testset_path)
        summary = runner.summary
        self.assertEqual(summary["stat"]["testsRun"], 10)
        self.assertEqual(summary["stat"]["skipped"], 4)

        runner.gen_html_report(html_report_name=output_folder_name)
        report_save_dir = os.path.join(loader.project_working_directory,
                                       'reports', output_folder_name)
        self.assertGreater(len(os.listdir(report_save_dir)), 0)
        shutil.rmtree(report_save_dir)
Exemple #8
0
def run_test(request):
    """
    运行用例
    :param request:
    :return:
    """
    if request.session.get('login_status'):
        kwargs = {
            "failfast": False,
        }
        runner = HttpRunner(**kwargs)

        testcase_dir_path = os.path.join(os.getcwd(), "suite")
        testcase_dir_path = os.path.join(testcase_dir_path, get_time_stamp())

        if request.is_ajax():
            try:
                kwargs = json.loads(request.body.decode('utf-8'))
            except ValueError:
                logging.error('待运行用例信息解析异常:{kwargs}'.format(kwargs=kwargs))
                return HttpResponse('信息解析异常,请重试')
            id = kwargs.pop('id')
            base_url = kwargs.pop('env_name')
            type = kwargs.pop('type')
            config = request.POST.get(
                'config') if request.POST.get('config') != "" else None
            run_by_module(id, base_url, testcase_dir_path, config) if type == 'module' \
                else run_by_project(id, base_url, testcase_dir_path, config)
            report_name = kwargs.get('report_name', None)
            main_hrun.delay(testcase_dir_path, report_name)
            return HttpResponse('用例执行中,请稍后查看报告即可,默认时间戳命名报告')
        else:
            id = request.POST.get('id')
            base_url = request.POST.get('env_name')
            config = request.POST.get(
                'config') if request.POST.get('config') != "" else None
            type = request.POST.get('type', None)
            if type:
                run_by_module(id, base_url, testcase_dir_path, config) if type == 'module' \
                    else run_by_project(id, base_url, testcase_dir_path, config)
            else:
                run_by_single(id, base_url, testcase_dir_path, config)

            runner.run(testcase_dir_path)

            shutil.rmtree(testcase_dir_path)
            return render_to_response('report_template.html', runner.summary)
    else:
        return HttpResponseRedirect("/api/login/")
Exemple #9
0
def runcase(request):
    ct = time.time()
    local_time = time.localtime(ct)
    data_head = time.strftime("%Y-%m-%d %H-%M-%S", local_time)
    data_secs = (ct - int(ct)) * 1000
    time_stamp = "%s-%03d" % (data_head, data_secs)

    kwargs = {
        "failfast": False,
    }
    runner = HttpRunner(**kwargs)

    testcase_dir_path = os.path.join(os.getcwd(), "suite")
    testcase_dir_path = os.path.join(testcase_dir_path, time_stamp)
    if not os.path.exists(testcase_dir_path):
        os.mkdir(testcase_dir_path)

    url = request.POST['url']
    method = request.POST['method']
    base_url = request.POST['base_url']

    config = {
        'config': {
            'name': 'base_url config',
            'request': {
                'base_url': base_url
            }
        }
    }
    testcase_list = []

    testcase_list.append(config)
    req = {'method': method, 'url': url}
    req1 = {'name': 'find', 'request': req}

    testcase_list.append({'test': req1})

    file_path = os.path.join(testcase_dir_path, "find.yml")
    with io.open(file_path, 'w', encoding='utf-8') as stream:
        yaml.dump(testcase_list,
                  stream,
                  indent=4,
                  default_flow_style=False,
                  encoding='utf-8')

    runner.run(testcase_dir_path)

    return render_to_response('report_template.html', runner.summary)
Exemple #10
0
 def test_run_httprunner_with_teardown_hooks_alter_response(self):
     testsets = [
         {
             "name": "test teardown hooks",
             "config": {
                 'path': 'tests/httpbin/hooks.yml',
             },
             "testcases": [
                 {
                     "name": "test teardown hooks",
                     "request": {
                         "url": "http://127.0.0.1:3458/headers",
                         "method": "GET",
                         "data": "abc"
                     },
                     "teardown_hooks": [
                         "${alter_response($response)}"
                     ],
                     "validate": [
                         {"eq": ["status_code", 500]},
                         {"eq": ["headers.content-type", "html/text"]},
                         {"eq": ["json.headers.Host", "127.0.0.1:8888"]},
                         {"eq": ["content.headers.Host", "127.0.0.1:8888"]},
                         {"eq": ["text.headers.Host", "127.0.0.1:8888"]},
                         {"eq": ["new_attribute", "new_attribute_value"]},
                         {"eq": ["new_attribute_dict.key", 123]}
                     ]
                 }
             ]
         }
     ]
     runner = HttpRunner().run(testsets)
     summary = runner.summary
     self.assertTrue(summary["success"])
Exemple #11
0
 def test_run_httprunner_with_teardown_hooks_error(self):
     testsets = [
         {
             "name": "test teardown hooks",
             "config": {
                 'path': 'tests/httpbin/hooks.yml',
             },
             "testcases": [
                 {
                     "name": "test teardown hooks",
                     "request": {
                         "url": "http://127.0.0.1:3458/headers",
                         "method": "GET",
                         "data": "abc"
                     },
                     "teardown_hooks": [
                         "${alter_response_error($response)}"
                     ]
                 }
             ]
         }
     ]
     runner = HttpRunner().run(testsets)
     summary = runner.summary
     self.assertFalse(summary["success"])
     self.assertEqual(summary["stat"]["errors"], 1)
Exemple #12
0
 def test_run_yaml_upload(self):
     runner = HttpRunner().run("tests/httpbin/upload.yml")
     summary = runner.summary
     self.assertTrue(summary["success"])
     self.assertEqual(summary["stat"]["testsRun"], 1)
     self.assertIn("details", summary)
     self.assertIn("records", summary["details"][0])
Exemple #13
0
 def test_run_testsets_template_lambda_functions(self):
     testcase_file_path = os.path.join(
         os.getcwd(),
         'tests/data/demo_testset_template_lambda_functions.yml')
     runner = HttpRunner().run(testcase_file_path)
     summary = runner.summary
     self.assertTrue(summary["success"])
 def test_run_post_data(self):
     testsets = [{
         "name":
         "post data",
         "testcases": [{
             "name": "post data",
             "request": {
                 "url": "http://127.0.0.1:3458/post",
                 "method": "POST",
                 "headers": {
                     "Content-Type": "application/json"
                 },
                 "data": "abc"
             },
             "validate": [{
                 "eq": ["status_code", 200]
             }]
         }]
     }]
     runner = HttpRunner().run(testsets)
     summary = runner.summary
     self.assertTrue(summary["success"])
     self.assertEqual(summary["stat"]["testsRun"], 1)
     self.assertEqual(
         summary["records"][0]["meta_data"]["response_body"]["data"], "abc")
Exemple #15
0
 def test_run_testset_layered(self):
     testcase_file_path = os.path.join(os.getcwd(),
                                       'tests/data/demo_testset_layer.yml')
     runner = HttpRunner().run(testcase_file_path)
     summary = runner.summary
     self.assertTrue(summary["success"])
     self.assertEqual(len(summary["details"]), 1)
Exemple #16
0
def main_ate(cases):
    # importlib.reload(httprunner)
    # print(cases)
    # importlib.reload(importlib.import_module('func_list.build_in_func'))
    runner = HttpRunner().run(cases)
    summary = runner.summary
    return summary
Exemple #17
0
 def test_run_httprunner_with_teardown_hooks_not_exist_attribute(self):
     testcases = [{
         "name":
         "test teardown hooks",
         "config": {
             "path": "tests/httpbin/hooks.yml"
         },
         "teststeps": [{
             "name":
             "test teardown hooks",
             "request": {
                 "url": "{}/headers".format(HTTPBIN_SERVER),
                 "method": "GET",
                 "data": "abc"
             },
             "teardown_hooks": ["${alter_response($response)}"],
             "validate": [{
                 "eq": ["attribute_not_exist", "new_attribute"]
             }]
         }]
     }]
     runner = HttpRunner().run(testcases)
     summary = runner.summary
     self.assertFalse(summary["success"])
     self.assertEqual(summary["stat"]["errors"], 1)
Exemple #18
0
def main_hrun(testset_path, report_name):
    """
    用例运行
    :param testset_path: dict or list
    :param report_name: str
    :return:
    """
    logger.setup_logger('DEBUG')
    kwargs = {
        "failfast": False,
    }
    runner = HttpRunner(**kwargs)
    run_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    runner.run(testset_path)
    add_test_reports(run_time, report_name=report_name, **runner.summary)
    return runner.summary
Exemple #19
0
    def test_run_httprunner_with_teardown_hooks_not_exist_attribute(self):
        testsets = [
            {
                "name": "test teardown hooks",
                "config": {
                    'path': 'tests/httpbin/hooks.yml',
                },
                "testcases": [
                    {
                        "name": "test teardown hooks",
                        "request": {
                            "url": "http://127.0.0.1:3458/headers",
                            "method": "GET",
                            "data": "abc"
                        },
                        "teardown_hooks": [
                            "${alter_response($response)}"
                        ],
                        "validate": [
                            {"eq": ["attributes.attribute_not_exist", "new_attribute"]}
                        ]
                    }
                ]
            }
        ]
        # with self.assertRaises(exceptions.AssertionError):
        runner = HttpRunner().run(testsets)

        summary = runner.summary
        self.assertFalse(summary["success"])
Exemple #20
0
 def test_run_testset_with_parameters(self):
     testcase_file_path = os.path.join(os.getcwd(),
                                       'tests/data/demo_parameters.yml')
     result = HttpRunner(testcase_file_path).run()
     self.assertTrue(result["success"])
     self.assertIn("token", result["output"])
     self.assertEqual(result["stat"]["testsRun"], 6)
Exemple #21
0
 def test_run_testcases_hardcode(self):
     runner = HttpRunner().run(self.testcase_file_path_list)
     summary = runner.summary
     self.assertTrue(summary["success"])
     self.assertTrue(summary["success"])
     self.assertEqual(summary["stat"]["testsRun"], 6)
     self.assertEqual(summary["stat"]["successes"], 6)
Exemple #22
0
 def test_run_testset_with_variables_mapping(self):
     testcase_file_path = os.path.join(os.getcwd(),
                                       'tests/data/demo_testset_layer.yml')
     variables_mapping = {"app_version": '2.9.7'}
     result = HttpRunner(testcase_file_path).run(mapping=variables_mapping)
     self.assertTrue(result["success"])
     self.assertIn("token", result["output"])
Exemple #23
0
 def test_run_testset_output(self):
     testcase_file_path = os.path.join(os.getcwd(),
                                       'tests/data/demo_testset_layer.yml')
     result = HttpRunner(testcase_file_path).run()
     self.assertTrue(result["success"])
     self.assertIn("token", result["output"][0]["out"])
     self.assertEqual(len(result["output"]), 13)
Exemple #24
0
 def test_run_testcases(self):
     runner = HttpRunner().run(self.testcases)
     summary = runner.summary
     self.assertTrue(summary["success"])
     self.assertEqual(summary["stat"]["testsRun"], 2)
     self.assertIn("details", summary)
     self.assertIn("records", summary["details"][0])
Exemple #25
0
 def test_parse_tests(self):
     testcase_file_path = os.path.join(os.getcwd(),
                                       'tests/data/demo_testcase.yml')
     runner = HttpRunner()
     testcases = runner.load_tests(testcase_file_path)
     parsed_testcases = runner.parse_tests(testcases)
     self.assertEqual(parsed_testcases[0]["config"]["variables"]["var_c"],
                      3)
     self.assertEqual(len(parsed_testcases), 2 * 2)
     self.assertEqual(parsed_testcases[0]["config"]["request"]["base_url"],
                      '$BASE_URL')
     self.assertEqual(
         parsed_testcases[0]["config"]["variables"]["BASE_URL"],
         'http://127.0.0.1:5000')
     self.assertIsInstance(parsed_testcases, list)
     self.assertEqual(parsed_testcases[0]["config"]["name"], '12311')
Exemple #26
0
 def test_run_post_data(self):
     testcases = [{
         "name":
         "post data",
         "teststeps": [{
             "name": "post data",
             "request": {
                 "url": "{}/post".format(HTTPBIN_SERVER),
                 "method": "POST",
                 "headers": {
                     "Content-Type": "application/json"
                 },
                 "data": "abc"
             },
             "validate": [{
                 "eq": ["status_code", 200]
             }]
         }]
     }]
     runner = HttpRunner().run(testcases)
     summary = runner.summary
     self.assertTrue(summary["success"])
     self.assertEqual(summary["stat"]["testsRun"], 1)
     self.assertEqual(
         summary["details"][0]["records"][0]["meta_data"]["response"]
         ["json"]["data"], "abc")
Exemple #27
0
def run_test(request):
    if request.session.get('login_status'):
        kwargs = {
            "failfast": False,
        }
        runner = HttpRunner(**kwargs)
        if request.method == 'POST':
            mode = request.POST.get('mode')
            id = request.POST.get('id')
            if mode == 'run_by_test':
                test = run_by_single(id)
                runner.run(test)
                return render_to_response('report_template.html',
                                          runner.summary)
    else:
        return HttpResponseRedirect("/api/login/")
 def test_run_yaml_upload(self):
     testset_path = "tests/httpbin/upload.yml"
     runner = HttpRunner().run(testset_path)
     summary = runner.summary
     self.assertTrue(summary["success"])
     self.assertEqual(summary["stat"]["testsRun"], 1)
     self.assertIn("records", summary)
 def test_run_testset(self):
     testsets = self.testset
     runner = HttpRunner().run(testsets)
     summary = runner.summary
     self.assertTrue(summary["success"])
     self.assertEqual(summary["stat"]["testsRun"], 2)
     self.assertIn("records", summary)
Exemple #30
0
def run_test(request):
    print("!!!用例开始运行!!!")
    print(request.body)
    print(request.path)
    print(request.encoding)
    print(request.method)
    print(request.META.get("CONTENT_TYPE"))
    print("请求来源:",request.META.get("REMOTE_ADDR"))
    """
    运行用例
    :param request:
    :return:
    """
    kwargs = {
        "failfast": False,
    }
    runner = HttpRunner(**kwargs)

    testcase_dir_path = os.path.join(os.getcwd(), "suite")
    testcase_dir_path = os.path.join(testcase_dir_path, get_time_stamp())

    if request.is_ajax():
        kwargs = json.loads(request.body.decode('utf-8'))
        id = kwargs.pop('id')
        base_url = kwargs.pop('env_name')
        type = kwargs.pop('type')
        run_test_by_type(id, base_url, testcase_dir_path, type)
        report_name = kwargs.get('report_name', None)
        main_hrun.delay(testcase_dir_path, report_name)
        return HttpResponse('用例执行中,请稍后查看报告即可,默认时间戳命名报告')
    else:
        id = request.POST.get('id')
        base_url = request.POST.get('env_name')
        type = request.POST.get('type', 'test')
        print(id,base_url,type)

        run_test_by_type(id, base_url, testcase_dir_path, type)
        t1 = runner.run(testcase_dir_path)
        print("用例执行结果",t1.gen_html_report())
        shutil.rmtree(testcase_dir_path)
        runner.summary = timestamp_to_datetime(runner.summary, type=False)

        #修复BUG一,测试完成后report没有落库,可能是没有调用此方法,补充如下:
        report_name = kwargs.get('report_name', None)
        add_test_reports(runner, report_name=report_name)

        return render_to_response('report_template.html', runner.summary)
Exemple #31
0
 def test_run_testset_with_parameters(self):
     testcase_file_path = os.path.join(
         os.getcwd(), 'tests/data/demo_parameters.yml')
     runner = HttpRunner().run(testcase_file_path)
     summary = runner.summary
     self.assertTrue(summary["success"])
     self.assertEqual(len(summary["output"]), 3 * 2 * 2)
     self.assertEqual(summary["stat"]["testsRun"], 3 * 2 * 2)
Exemple #32
0
 def test_run_testset_output(self):
     testcase_file_path = os.path.join(
         os.getcwd(), 'tests/data/demo_testset_layer.yml')
     runner = HttpRunner().run(testcase_file_path)
     summary = runner.summary
     self.assertTrue(summary["success"])
     self.assertIn("token", summary["output"][0]["out"])
     self.assertEqual(len(summary["output"]), 13)