diff --git a/httprunner/app/routers/debug.py b/httprunner/app/routers/debug.py index 51dc2276..b4d4fefb 100644 --- a/httprunner/app/routers/debug.py +++ b/httprunner/app/routers/debug.py @@ -4,6 +4,7 @@ from httprunner.runner import HttpRunner from httprunner.schema import ProjectMeta, TestCase router = APIRouter() +runner = HttpRunner() @router.post("/hrun/debug/testcase", tags=["debug"]) @@ -19,9 +20,7 @@ async def debug_single_testcase(project_meta: ProjectMeta, testcase: TestCase): for func_name in new_added_keys: project_meta.functions[func_name] = locals()[func_name] - config = testcase.config - teststeps = testcase.teststeps - runner = HttpRunner(config, teststeps).with_project_meta(project_meta).run() + runner.with_project_meta(project_meta).run(testcase) summary = runner.get_summary() if not summary.success: diff --git a/httprunner/runner.py b/httprunner/runner.py index 5561c812..bcb8d9c4 100644 --- a/httprunner/runner.py +++ b/httprunner/runner.py @@ -1,11 +1,11 @@ import os import time from datetime import datetime -from typing import List, Dict +from typing import List, Dict, Text from loguru import logger -from httprunner import utils +from httprunner import utils, exceptions from httprunner.client import HttpSession from httprunner.exceptions import ValidationFailure, ParamsError from httprunner.loader import load_project_meta, load_testcase_file @@ -28,9 +28,9 @@ class HttpRunner(object): config: TConfig teststeps: List[TStep] - session: HttpSession + session: HttpSession = None variables: VariablesMapping = {} - step_datas: List[StepData] = [] + step_datas: List[StepData] = None validation_results: Dict = {} session_variables: Dict = {} success: bool = True # indicate testcase execution result @@ -132,13 +132,11 @@ class HttpRunner(object): step_variables = step.variables ref_testcase_path = os.path.join(self.project_meta.PWD, step.testcase) - _, testcase_obj = load_testcase_file(ref_testcase_path) - case_result = ( HttpRunner() .with_session(self.session) .with_variables(step_variables) - .run(testcase_obj) + .run_path(ref_testcase_path) ) step_data.data = case_result.step_datas # list of step data step_data.export = case_result.get_export_variables() @@ -175,7 +173,7 @@ class HttpRunner(object): self.project_meta = ProjectMeta() self.start_at = time.time() - self.step_datas.clear() + self.step_datas: List[StepData] = [] self.session_variables.clear() for step in self.teststeps: # update with config variables @@ -194,6 +192,13 @@ class HttpRunner(object): self.duration = time.time() - self.start_at return self + def run_path(self, path: Text) -> "HttpRunner": + if not os.path.isfile(path): + raise exceptions.ParamsError(f"Invalid testcase path: {path}") + + _, testcase_obj = load_testcase_file(path) + return self.run(testcase_obj) + def get_export_variables(self) -> Dict: export_vars_mapping = {} for var_name in self.config.export: diff --git a/httprunner/runner_test.py b/httprunner/runner_test.py index e69de29b..9635ac4f 100644 --- a/httprunner/runner_test.py +++ b/httprunner/runner_test.py @@ -0,0 +1,36 @@ +import unittest + +from httprunner.runner import HttpRunner + + +class TestHttpRunner(unittest.TestCase): + def setUp(self): + self.runner = HttpRunner() + + def test_run_testcase_by_path_request_only(self): + self.runner.run_path( + "examples/postman_echo/request_methods/request_with_variables.yml" + ) + result = self.runner.get_summary() + self.assertTrue(result.success) + self.assertEqual( + result.name, "request methods testcase with variables" + ) + self.assertEqual( + result.step_datas[0].name, "get with params" + ) + self.assertEqual(len(result.step_datas), 3) + + def test_run_testcase_by_path_ref_testcase(self): + self.runner.run_path( + "examples/postman_echo/request_methods/request_with_testcase_reference.yml" + ) + result = self.runner.get_summary() + self.assertTrue(result.success) + self.assertEqual( + result.name, "request methods testcase: reference testcase" + ) + self.assertEqual( + result.step_datas[0].name, "request with variables" + ) + self.assertEqual(len(result.step_datas), 1) diff --git a/httprunner/utils_test.py b/httprunner/utils_test.py index 2d1cbd17..f5d33be0 100644 --- a/httprunner/utils_test.py +++ b/httprunner/utils_test.py @@ -2,7 +2,7 @@ import io import os import unittest -from httprunner import new_loader, utils +from httprunner import loader, utils class TestUtils(unittest.TestCase): @@ -16,7 +16,7 @@ class TestUtils(unittest.TestCase): def current_validators(self): from httprunner.builtin import comparators - functions_mapping = new_loader.load_module_functions(comparators) + functions_mapping = loader.load_module_functions(comparators) functions_mapping["equals"](None, None) functions_mapping["equals"](1, 1)