def test_handle_config_key_case(self): origin_dict = { "Name": "test", "Request": { "url": "http://127.0.0.1:5000", "METHOD": "POST", "Headers": { "Accept": "application/json", "User-Agent": "ios/9.3" } } } new_dict = utils.lower_config_dict_key(origin_dict) self.assertIn("name", new_dict) self.assertIn("request", new_dict) self.assertIn("method", new_dict["request"]) self.assertIn("headers", new_dict["request"]) self.assertIn("Accept", new_dict["request"]["headers"]) self.assertIn("User-Agent", new_dict["request"]["headers"]) origin_dict = { "Name": "test", "Request": "$default_request" } new_dict = utils.lower_config_dict_key(origin_dict) self.assertIn("$default_request", new_dict["request"])
def test_handle_config_key_case(self): origin_dict = { "Name": "test", "Request": { "url": "http://127.0.0.1:5000", "METHOD": "POST", "Headers": { "Accept": "application/json", "User-Agent": "ios/9.3" } } } new_dict = utils.lower_config_dict_key(origin_dict) self.assertIn("name", new_dict) self.assertIn("request", new_dict) self.assertIn("method", new_dict["request"]) self.assertIn("headers", new_dict["request"]) self.assertIn("accept", new_dict["request"]["headers"]) self.assertIn("user-agent", new_dict["request"]["headers"]) origin_dict = { "Name": "test", "Request": "$default_request" } new_dict = utils.lower_config_dict_key(origin_dict) self.assertIn("$default_request", new_dict["request"])
def run_test(self, testcase_dict): """ run single testcase. @param (dict) testcase_dict { "name": "testcase description", "skip": "skip this test unconditionally", "times": 3, "requires": [], # optional, override "function_binds": {}, # optional, override "variables": [], # optional, override "request": { "steps": [ {}, {} ] }, } @return True or raise exception during test """ # parsed_request = self.init_config(testcase_dict, level="testcase") try: t_level = "testcase" # convert keys in request headers to lowercase config_dict = utils.lower_config_dict_key(testcase_dict) self.context.init_context(level=t_level) self.context.config_context(config_dict, level=t_level) request_config = config_dict.get('request', {}) self.act_list = self._parse_steps(request_config["steps"]) self.step = 0 step_len = len(self.act_list) while self.step < step_len: action = self.act_list[self.step] logger.log_info("STEP[%d], ACTION[%s]" % (self.step + 1, action)) self.do_action(action) retcode, retmsg, n_step = self._parse_func_return(self.retval) if (retcode == 0 and n_step != 0): self.step += n_step elif (retcode != 0): logger.log_error("execute action[%s] error[%s]" % (action, retmsg)) break self.step += 1 except Exception as e: logger.log_error( "run do_action error, step[%d], act_list[%s], e[%s]" % (self.step + 1, self.act_list[self.step], e), exc_info=True) retcode = -1 raise finally: self._get_windows_img() # self.assertEqual(retcode, 0, "retcode[%d], step[%d]" %(retcode, step+1)) return retcode
def init_config(self, config_dict, level): """ create/update context variables binds @param (dict) config_dict @param (str) level, "testset" or "testcase" testset: { "name": "smoke testset", "path": "tests/data/demo_testset_variables.yml", "requires": [], # optional "function_binds": {}, # optional "import_module_items": [], # optional "variables": [], # optional "request": { "base_url": "http://127.0.0.1:5000", "headers": { "User-Agent": "iOS/2.8.3" } } } testcase: { "name": "testcase description", "requires": [], # optional "function_binds": {}, # optional "import_module_items": [], # optional "variables": [], # optional "request": { "url": "/api/get-token", "method": "POST", "headers": { "Content-Type": "application/json" } }, "json": { "sign": "f1219719911caae89ccc301679857ebfda115ca2" } } @param (str) context level, testcase or testset """ # convert keys in request headers to lowercase #将config字典的内容都转换为小写 config_dict = utils.lower_config_dict_key(config_dict) #初始化context self.context.init_context(level) #提取config_context里的值进行处理,添加到上下文环境里 self.context.config_context(config_dict, level) request_config = config_dict.get('request', {}) #把config_dict里的request字典的值处理为常规类型并返回eg:sn:$sn;parsed: sn:123 parsed_request = self.context.get_parsed_request(request_config, level) base_url = parsed_request.pop("base_url", None) self.http_client_session = self.http_client_session or HttpSession(base_url) return parsed_request
def init_config(self, config_dict, level): """ create/update context variables binds Args: config_dict (dict): level (enum): "testcase" or "teststep" testcase: { "name": "testcase description", "variables": [], # optional "request": { "base_url": "http://127.0.0.1:5000", "headers": { "User-Agent": "iOS/2.8.3" } } } teststep: { "name": "teststep description", "variables": [], # optional "request": { "url": "/api/get-token", "method": "POST", "headers": { "Content-Type": "application/json" } }, "json": { "sign": "f1219719911caae89ccc301679857ebfda115ca2" } } Returns: dict: parsed request dict """ # convert keys in request headers to lowercase config_dict = utils.lower_config_dict_key(config_dict) self.context.init_context_variables(level) variables = config_dict.get('variables') \ or config_dict.get('variable_binds', OrderedDict()) self.context.update_context_variables(variables, level) request_config = config_dict.get('request', {}) parsed_request = self.context.get_parsed_request(request_config, level) base_url = parsed_request.pop("base_url", None) self.http_client_session = self.http_client_session or HttpSession( base_url) return parsed_request
def init_config(self, config_dict, level): """ create/update context variables binds @param (dict) config_dict @param (str) level, "testset" or "testcase" testset: { "name": "smoke testset", "path": "tests/data/demo_testset_variables.yml", "requires": [], # optional "function_binds": {}, # optional "import_module_items": [], # optional "variables": [], # optional "request": { "base_url": "http://127.0.0.1:5000", "headers": { "User-Agent": "iOS/2.8.3" } } } testcase: { "name": "testcase description", "requires": [], # optional "function_binds": {}, # optional "import_module_items": [], # optional "variables": [], # optional "request": { "url": "/api/get-token", "method": "POST", "headers": { "Content-Type": "application/json" } }, "json": { "sign": "f1219719911caae89ccc301679857ebfda115ca2" } } @param (str) context level, testcase or testset """ # convert keys in request headers to lowercase config_dict = utils.lower_config_dict_key(config_dict) self.context.init_context(level) self.context.config_context(config_dict, level) request_config = config_dict.get('request', {}) parsed_request = self.context.get_parsed_request(request_config, level) base_url = parsed_request.pop("base_url", None) self.http_client_session = self.http_client_session or HttpSession(base_url) return parsed_request
def init_config(self, config_dict, level): """ create/update context variables binds @param (dict) config_dict @param (str) level, "testset" or "testcase" @param (str) context level, testcase or testset """ # convert keys in request headers to lowercase config_dict = utils.lower_config_dict_key(config_dict) self.context.init_context(level) self.context.config_context(config_dict, level) request_config = config_dict.get('request', {}) parsed_request = self.context.get_parsed_request(request_config, level) return parsed_request
def init_config(self, config_dict, level): """ create/update context variables binds @param (dict) config_dict @param (str) level, "testset" or "testcase" testset: { "name": "smoke testset", "path": "tests/data/demo_testset_variables.yml", "variables": [], # optional "request": { "base_url": "http://127.0.0.1:5000", "headers": { "User-Agent": "iOS/2.8.3" } } } testcase: { "name": "testcase description", "variables": [], # optional "request": { "url": "/api/get-token", "method": "POST", "headers": { "Content-Type": "application/json" } }, "json": { "sign": "f1219719911caae89ccc301679857ebfda115ca2" } } @param (str) context level, testcase or testset """ # convert keys in request headers to lowercase config_dict = utils.lower_config_dict_key(config_dict) self.context.init_context(level) self.context.config_context(config_dict, level) request_config = config_dict.get('request', {}) parsed_request = self.context.get_parsed_request(request_config, level) base_url = parsed_request.pop("base_url", None) self.http_client_session = self.http_client_session or HttpSession( base_url) return parsed_request
sys.exit(3) return configfile if __name__ == "__main__": from httprunner import task # 测试用 if (len(sys.argv) == 1): sys.argv += ["-c"] + ["make-execl.yaml"] print("CMD:[%s]\n" % (sys.argv)) try: # testcase_file_path = os.path.join(os.getcwd(), 'tests/data/demo_testset_variables.yml') testcase_file_path = get_opts(sys.argv) testset = testcase.TestcaseLoader.load_test_file(testcase_file_path) config_dict = utils.lower_config_dict_key(testset.get("config", {})) except Exception as e: logger.log_error("task.TestSuite file[%s]" % (testcase_file_path), exc_info=True) raise # for i, testcase in enumerate(suite): # logger.log_info("now run testcase [%d][%s]: {}" %(i, testcase)) # testcase.runTest() logger.setup_logger("info", config_dict["logfile"], console_out=True) suite = task.TestSuite(testset) report_title = config_dict.get("name", "") + '-测试报告' desc = '测试报告详情:' report_path = gen_report_name(config_dict.get("reportdir", "."), report_title + ".html")