[Pytest][Part 4]多种测试运行方式

实现需求2:

有两种运行测试的方式:

  1. 通过config配置文件运行,测试只需要修改config配置文件
  2. cmdline 运行

这里是新建一个config类来存储所有的测试配置,以后配置有修改的话也只需要修改这个类。

根据目前的测试需求,config中有以下几个属性:

属性 作用 备注
list_test 按case list的flag,为True时生效
single_test 单条运行case的flag,为True时生效
repeat case重复运行的次数
risk_analysis 高风险case分析 功能暂未实现
tester 测试者的用户名,作为测试者发送邮件的收件人
case_list 存储测试case集,从这里取出需要运行的测试

具体类代码为:

python 复制代码
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_test
        self.single_test = single_test
        self.repeat = repeat
        self.case_list = case_list
        self.risk_analysis = risk_analysis
        self.tester = tester

 

虽然有两种运行脚本的方式,但是通过这两种方式获取的信息都会填充到config这个类中,然后从这个类中读取当前需要运行的配置信息。 默认从配置文件中读取测试信息,当配置文件不存在时,从cmdline中读取测试信息。
图一 配置信息读取流程

最上层代码实现:

python 复制代码
    def get_test_config(self, config):
        """
        1. read config from config file
        2. check flag of test config . if true , read test config from config file
            if 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 ......")

读取配置文件

配置文件中包含两类信息:

  1. 当前配置文件是否有效的flag(True or False),后面会根据这个flag来决定读取config file还是cmdline
  2. 测试的具体信息,用于填充TestConfig对象的

代码实现:返回一个包含配置信息的list

python 复制代码
    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

python 复制代码
"""
 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对象中

python 复制代码
# fill test settings to TestConfig object
    def 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 type
            elif "--single_test" in item:
                config.single_test = ast.literal_eval(item.split(split_str)[1].strip())  # transfer from string to bool type
            elif "--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 type
            elif "--tester=TestUser" in item:
                config.tester = item.split(split_str)[1].strip()

若run_from_cfg_file 为False,则调用方法read_config_from_cmdline()将cmdline中的配置填充到TestConfig配置中去。

python 复制代码
 def get_cmdline_args(self):
        list = sys.argv
        return list

 def read_config_from_cmdline(self,config):
        self.parse_settings_to_config(self.get_cmdline_args(),config)

至此通过配置文件和cmdline分别获取测试配置信息的task就已经完成了。读取配置信息的工作都是在tef_funtcion.py 中的class FunctionApi中来完成的。完整代码为:

python 复制代码
"""
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 sys

from utils.TestLogger import TestLogger as TestLogger


config_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 object
    def 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 type
            elif "--single_test" in item:
                config.single_test = ast.literal_eval(item.split(split_str)[1].strip())  # transfer from string to bool type
            elif "--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 type
            elif "--tester=TestUser" in item:
                config.tester = item.split(split_str)[1].strip()


    def get_cmdline_args(self):
        list = sys.argv
        return list

    def 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 True
        else:
            logger.error(f"File {file_path} does not exist.")
            return False

    def read_case_from_list_file(self):
        test_list = "test_list.txt"
        # get path of test_list.txt
        file_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_list

    def 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 file
        2. check flag of test config . if true , read test config from config file
            if 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:

python 复制代码
    logger.info("Starting test execution...")
    config = TestConfig()
    functionApi.get_test_config(config)
    run_pytest(config)
相关推荐
上天_去_做颗惺星 EVE_BLUE5 分钟前
接口自动化测试全流程:pytest 用例收集、并行执行、Allure 报告合并与上传
python·pytest
踏着七彩祥云的小丑15 小时前
pytest——Mark标记
开发语言·python·pytest
lifewange2 天前
pytest-类中测试方法、多文件批量执行
开发语言·python·pytest
我的xiaodoujiao4 天前
API 接口自动化测试详细图文教程学习系列9--Requests模块
python·学习·测试工具·pytest
我的xiaodoujiao4 天前
API 接口自动化测试详细图文教程学习系列10--Requests模块2--举例说明
python·学习·测试工具·pytest
超梦梦梦梦5 天前
playwright&pytest
pytest
不明觉厉二十年8 天前
pytest+pywinauto+pycharm制作mobaxterm 字符串快捷发送器 Demo
ide·pycharm·pytest
春日见10 天前
TEST文件夹:Pytest,集成测试,单元测试
服务器·人工智能·驱动开发·单元测试·计算机外设·集成测试·pytest
TRACER~8510 天前
项目实战:pandas+pytest+allure+adb
adb·pandas·pytest
Franciz小测测11 天前
Pytest 并发分组执行引擎(支持UI / 接口自动化测试):从设计到工程落地
pytest