實現需求2:
有兩種運行測試的方式:
- 通過config配置文件運行,測試只需要修改config配置文件
- cmdline 運行
這里是新建一個config類來存儲所有的測試配置,以后配置有修改的話也只需要修改這個類。
根據目前的測試需求,config中有以下幾個屬性:
屬性 | 作用 | 備注 |
---|---|---|
list_test???????? | 按case list的flag,為True時生效 | |
single_test | 單條運行case的flag,為True時生效 | |
repeat? ? ?? | case重復運行的次數 | |
risk_analysis | 高風險case分析 | 功能暫未實現 |
tester? ? ? ? ? ? ?? | 測試者的用戶名,作為測試者發送郵件的收件人 | |
case_list | 存儲測試case集,從這里取出需要運行的測試 |
具體類代碼為:
class TestConfig:"""測試配置管理"""_results_file = "test_results.json"_test_history = {}def __init__(self,list_test=False, single_test=False, repeat=1, case_list=None, risk_analysis=False,tester = None):self.list_test = list_testself.single_test = single_testself.repeat = repeatself.case_list = case_listself.risk_analysis = risk_analysisself.tester = tester
雖然有兩種運行腳本的方式,但是通過這兩種方式獲取的信息都會填充到config這個類中,然后從這個類中讀取當前需要運行的配置信息。 默認從配置文件中讀取測試信息,當配置文件不存在時,從cmdline中讀取測試信息。

最上層代碼實現:
def get_test_config(self, config):"""1. read config from config file2. check flag of test config . if true , read test config from config fileif false , read test config from cmdline:param config: Object of Class TestConfig"""split_str = "="config_list = self.read_config_from_file(CONFIG_FILE)run_from_cfg_file = ast.literal_eval(config_list[0].split(split_str)[1].strip())if run_from_cfg_file:logger.info("reading test config from config file ......")self.parse_settings_to_config(config_list, config)else:self.read_config_from_cmdline(config)logger.info("getting test config from cmdline ......")
讀取配置文件
配置文件中包含兩類信息:
- 當前配置文件是否有效的flag(True or False),后面會根據這個flag來決定讀取config file還是cmdline
- 測試的具體信息,用于填充TestConfig對象的
代碼實現:返回一個包含配置信息的list
def read_config_from_file(self, file_path):# config_file = "config_file.txt"# # get path of config_file.txt# file_path = os.path.join(os.getcwd(), config_file)config_list = []# check if config file is exist# if self.__file_exist_check(file_path):if self.config_file_status(file_path):try:with open(file_path) as file_handle:lines = file_handle.readlines()for line in lines:config_list.append(line.strip())except FileNotFoundError as e:logger.exception(f"file not found:{e}")except PermissionError as e:logger.exception(f"No permission to read the file:{e}")except Exception as e:logger.exception(f"file not found: {e}")return config_list # config_list 正確else:logger.error("Config file is not exist....Please check again,Test Stop......")exit()
配置文件config_file.txt的內容為:
?--use_config=False
--list_test=True
--single_test=False
--case_list =test_list.txt
--repeat=15
--risk_analysis=False
--tester=TestUser
判斷是否使用配置文件
通過run_from_cfg_file 這個flag來判斷是讀取配置文件還是讀取cmdline
"""flag of run method ,from config file , or from cmdline
"""
run_from_cfg_file = False# config_list 為read_config_from_file()返回的config list
run_from_cfg_file = ast.literal_eval(config_list[0].split(split_str)[1].strip())if run_from_cfg_file:logger.info("reading test config from config file ......")self.parse_settings_to_config(config_list, config)else:self.read_config_from_cmdline(config)logger.info("getting test config from cmdline ......")
若run_from_cfg_file 為True,則從配置文件中讀取測試配置并調用方法parse_settings_to_config()填充到TestConfig對象中
# fill test settings to TestConfig objectdef parse_settings_to_config(self, arg_list, config):split_str = "="for item in arg_list:if "--list_test" in item:config.list_test = ast.literal_eval(item.split(split_str)[1].strip()) # transfer from string to bool typeelif "--single_test" in item:config.single_test = ast.literal_eval(item.split(split_str)[1].strip()) # transfer from string to bool typeelif "--case_list" in item:config.case_list = item.split(split_str)[1].strip()elif "--repeat" in item:config.repeat = item.split(split_str)[1].strip()elif "--risk_analysis" in item:config.risk_analysis = ast.literal_eval(item.split(split_str)[1].strip()) # transfer from string to bool typeelif "--tester=TestUser" in item:config.tester = item.split(split_str)[1].strip()
若run_from_cfg_file 為False,則調用方法read_config_from_cmdline()將cmdline中的配置填充到TestConfig配置中去。
def get_cmdline_args(self):list = sys.argvreturn listdef read_config_from_cmdline(self,config):self.parse_settings_to_config(self.get_cmdline_args(),config)
至此通過配置文件和cmdline分別獲取測試配置信息的task就已經完成了。讀取配置信息的工作都是在tef_funtcion.py中的class FunctionApi中來完成的。完整代碼為:
"""
this file is api preset for test, all test function tool that needed is included in this python file
"""
import ast
import os.path
import sysfrom utils.TestLogger import TestLogger as TestLoggerconfig_file = "config_file.txt"
# get path of config_file.txt
CONFIG_FILE = os.path.join(os.getcwd(), config_file)"""flag of run method ,from config file , or from cmdline
"""run_from_cfg_file = False
logger = TestLogger().get_logger()class FunctionApi:# fill test settings to TestConfig objectdef parse_settings_to_config(self, arg_list, config):split_str = "="for item in arg_list:if "--list_test" in item:config.list_test = ast.literal_eval(item.split(split_str)[1].strip()) # transfer from string to bool typeelif "--single_test" in item:config.single_test = ast.literal_eval(item.split(split_str)[1].strip()) # transfer from string to bool typeelif "--case_list" in item:config.case_list = item.split(split_str)[1].strip()elif "--repeat" in item:config.repeat = item.split(split_str)[1].strip()elif "--risk_analysis" in item:config.risk_analysis = ast.literal_eval(item.split(split_str)[1].strip()) # transfer from string to bool typeelif "--tester=TestUser" in item:config.tester = item.split(split_str)[1].strip()def get_cmdline_args(self):list = sys.argvreturn listdef read_config_from_cmdline(self,config):self.parse_settings_to_config(self.get_cmdline_args(),config)def __file_exist_check(self, file_path):if os.path.exists(file_path):return Trueelse:logger.error(f"File {file_path} does not exist.")return Falsedef read_case_from_list_file(self):test_list = "test_list.txt"# get path of test_list.txtfile_path = os.path.join(os.getcwd(), test_list)# print("os.path.abspath:", os.path.abspath(__file__)) #獲取當前文件的絕對路徑C:\code\USBTestAndroid\utils\api.py# print("os.getcwd()", os.getcwd()) #獲取調用該函數的項目路徑C:\code\USBTestAndroid# print("file path :", file_path)case_list = []try:with open(file_path) as file_handle:lines = file_handle.readlines()for line in lines:case_list.append(line.strip())except FileNotFoundError as e:logger.error(f"file not found:{e}")except PermissionError as e:logger.error(f"No permission to read the file:{e}")except Exception as e:logger.error(f"file not found: {e}")return case_listdef config_file_status(self, file_path):"""check if config file is exist:return: True ,exist;False not exist"""return self.__file_exist_check(file_path)def read_config_from_file(self, file_path):config_list = []if self.config_file_status(file_path):try:with open(file_path) as file_handle:lines = file_handle.readlines()for line in lines:config_list.append(line.strip())except FileNotFoundError as e:logger.exception(f"file not found:{e}")except PermissionError as e:logger.exception(f"No permission to read the file:{e}")except Exception as e:logger.exception(f"file not found: {e}")return config_list # config_list 正確else:logger.error("Config file is not exist....Please check again,Test Stop......")exit()def get_test_config(self, config):"""1. read config from config file2. check flag of test config . if true , read test config from config fileif false , read test config from cmdline:param config: Object of Class TestConfig"""split_str = "="config_list = self.read_config_from_file(CONFIG_FILE)run_from_cfg_file = ast.literal_eval(config_list[0].split(split_str)[1].strip())if run_from_cfg_file:logger.info("reading test config from config file ......")self.parse_settings_to_config(config_list, config)else:self.read_config_from_cmdline(config)logger.info("getting test config from cmdline ......")
下面的工作就是利用讀取到的配置信息開始測試。
run_test.py:
logger.info("Starting test execution...")config = TestConfig()functionApi.get_test_config(config)run_pytest(config)