From 5a021eb6741786333de9a1b2bfb5e22cf4c7cafd Mon Sep 17 00:00:00 2001 From: debugtalk Date: Tue, 9 Apr 2019 10:33:03 +0800 Subject: [PATCH] fix: dead circle in parse_variables_mapping --- httprunner/parser.py | 14 ++++++++++++-- tests/test_parser.py | 10 ++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/httprunner/parser.py b/httprunner/parser.py index 20ba2e13..ec17411d 100644 --- a/httprunner/parser.py +++ b/httprunner/parser.py @@ -638,11 +638,21 @@ def parse_variables_mapping(variables_mapping, ignore=False): """ variables_mapping = variables_mapping or {} - ref_variables_set = set() - + run_times = 0 parsed_variables_mapping = {} + while len(parsed_variables_mapping) != len(variables_mapping): for var_name in variables_mapping: + + run_times += 1 + if run_times > len(variables_mapping) * 4: + not_found_variables = { + key: variables_mapping[key] + for key in variables_mapping + if key not in parsed_variables_mapping + } + raise exceptions.VariableNotFound(not_found_variables) + if var_name in parsed_variables_mapping: continue diff --git a/tests/test_parser.py b/tests/test_parser.py index 6513e08c..fe5ad205 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -495,6 +495,16 @@ class TestParserBasic(unittest.TestCase): parsed_variables = parser.parse_variables_mapping(prepared_variables) self.assertEqual(parsed_variables["varA"], parsed_variables["varB"]) + def test_parse_variables_mapping_dead_circle(self): + variables = { + "varA": "$varB", + "varB": "123$varC" + } + check_variables_set = {"varA", "varB", "varC"} + prepared_variables = parser.prepare_lazy_data(variables, {}, check_variables_set) + with self.assertRaises(exceptions.VariableNotFound): + parser.parse_variables_mapping(prepared_variables) + def test_parse_variables_mapping_not_found(self): variables = { "varA": "123$varB",