From 80e05e6c39932f83e1a9bb845af8f46df5caf3b7 Mon Sep 17 00:00:00 2001 From: debugtalk Date: Tue, 12 Sep 2017 16:56:22 +0800 Subject: [PATCH] search variables in debugtalk.py recursively upward --- ate/__init__.py | 2 +- ate/testcase.py | 67 ++++++++++++++++++++---------------------- tests/test_testcase.py | 42 ++++++++++++++------------ 3 files changed, 57 insertions(+), 54 deletions(-) diff --git a/ate/__init__.py b/ate/__init__.py index 39cae215..de5901e2 100644 --- a/ate/__init__.py +++ b/ate/__init__.py @@ -1 +1 @@ -__version__ = '0.6.2' \ No newline at end of file +__version__ = '0.6.3' \ No newline at end of file diff --git a/ate/testcase.py b/ate/testcase.py index 2ed5060a..8cd0458b 100644 --- a/ate/testcase.py +++ b/ate/testcase.py @@ -87,40 +87,6 @@ def parse_function(content): return function_meta -def eval_content_variables(content, variable_mapping): - """ replace all variables of string content with mapping value. - @param (str) content - @return (str) parsed content - - e.g. - variable_mapping = { - "var_1": "abc", - "var_2": "def" - } - $var_1 => "abc" - $var_1#XYZ => "abc#XYZ" - /$var_1/$var_2/var3 => "/abc/def/var3" - ${func($var_1, $var_2, xyz)} => "${func(abc, def, xyz)}" - """ - variables_list = extract_variables(content) - for variable_name in variables_list: - if variable_name not in variable_mapping: - raise exception.ParamsError( - "%s is not defined in bind variables!" % variable_name) - - variable_value = variable_mapping.get(variable_name) - if "${}".format(variable_name) == content: - # content is a variable - content = variable_value - else: - # content contains one or many variables - content = content.replace( - "${}".format(variable_name), - str(variable_value), 1 - ) - - return content - class TestcaseParser(object): @@ -194,6 +160,37 @@ class TestcaseParser(object): return content + def eval_content_variables(self, content): + """ replace all variables of string content with mapping value. + @param (str) content + @return (str) parsed content + + e.g. + variable_mapping = { + "var_1": "abc", + "var_2": "def" + } + $var_1 => "abc" + $var_1#XYZ => "abc#XYZ" + /$var_1/$var_2/var3 => "/abc/def/var3" + ${func($var_1, $var_2, xyz)} => "${func(abc, def, xyz)}" + """ + variables_list = extract_variables(content) + for variable_name in variables_list: + variable_value = self.get_bind_item("variable", variable_name) + + if "${}".format(variable_name) == content: + # content is a variable + content = variable_value + else: + # content contains one or many variables + content = content.replace( + "${}".format(variable_name), + str(variable_value), 1 + ) + + return content + def parse_content_with_bindings(self, content): """ parse content recursively, each variable and function in content will be evaluated. @@ -249,6 +246,6 @@ class TestcaseParser(object): content = self.eval_content_functions(content) # replace variables with binding value - content = eval_content_variables(content, self.variables_binds) + content = self.eval_content_variables(content) return content diff --git a/tests/test_testcase.py b/tests/test_testcase.py index 1bebfe10..7cd27937 100644 --- a/tests/test_testcase.py +++ b/tests/test_testcase.py @@ -54,62 +54,68 @@ class TestcaseParserUnittest(unittest.TestCase): ) def test_eval_content_variables(self): - variable_mapping = { + variable_binds = { "var_1": "abc", "var_2": "def", "var_3": 123, "var_4": {"a": 1}, - "var_5": True, - "var_6": None + "var_5": True } + testcase_parser = testcase.TestcaseParser(variables_binds=variable_binds) self.assertEqual( - testcase.eval_content_variables("$var_1", variable_mapping), + testcase_parser.eval_content_variables("$var_1"), "abc" ) self.assertEqual( - testcase.eval_content_variables("var_1", variable_mapping), + testcase_parser.eval_content_variables("var_1"), "var_1" ) self.assertEqual( - testcase.eval_content_variables("$var_1#XYZ", variable_mapping), + testcase_parser.eval_content_variables("$var_1#XYZ"), "abc#XYZ" ) self.assertEqual( - testcase.eval_content_variables("/$var_1/$var_2/var3", variable_mapping), + testcase_parser.eval_content_variables("/$var_1/$var_2/var3"), "/abc/def/var3" ) self.assertEqual( - testcase.eval_content_variables("/$var_1/$var_2/$var_1", variable_mapping), + testcase_parser.eval_content_variables("/$var_1/$var_2/$var_1"), "/abc/def/abc" ) self.assertEqual( - testcase.eval_content_variables("${func($var_1, $var_2, xyz)}", variable_mapping), + testcase_parser.eval_content_variables("${func($var_1, $var_2, xyz)}"), "${func(abc, def, xyz)}" ) self.assertEqual( - testcase.eval_content_variables("$var_3", variable_mapping), + testcase_parser.eval_content_variables("$var_3"), 123 ) self.assertEqual( - testcase.eval_content_variables("$var_4", variable_mapping), + testcase_parser.eval_content_variables("$var_4"), {"a": 1} ) self.assertEqual( - testcase.eval_content_variables("$var_5", variable_mapping), + testcase_parser.eval_content_variables("$var_5"), True ) self.assertEqual( - testcase.eval_content_variables("abc$var_5", variable_mapping), + testcase_parser.eval_content_variables("abc$var_5"), "abcTrue" ) self.assertEqual( - testcase.eval_content_variables("abc$var_4", variable_mapping), + testcase_parser.eval_content_variables("abc$var_4"), "abc{'a': 1}" ) - self.assertEqual( - testcase.eval_content_variables("$var_6", variable_mapping), - None - ) + + def test_eval_content_variables_search_upward(self): + testcase_parser = testcase.TestcaseParser() + + with self.assertRaises(ParamsError): + testcase_parser.eval_content_variables("/api/$SECRET_KEY") + + testcase_parser.file_path = "tests/data/demo_testset_hardcode.yml" + content = testcase_parser.eval_content_variables("/api/$SECRET_KEY") + self.assertEqual(content, "/api/DebugTalk") def test_parse_string_value(self): self.assertEqual(testcase.parse_string_value("123"), 123)