pytest自定义命令行参数

实际使用场景:pytest运行用例的时候,启动mitmdump进程试试抓包,pytest命令行启动的时候,传入mitmdump需要的参数(1)抓包生成的文件地址 (2)mitm的proxy设置

python 复制代码
#  在pytest的固定文件中conftest.py中

def pytest_addoption(parser):
    """
    自定义pytest的命令行参数,@pytest.fixture配合下面的方法一起用
    :param parser:
    :return:
    """
    parser.addoption("--mitm_path", action="store",
                     default="",
                     type=str,
                     help="--mitm_path:mitmproxy生成的cvs文件名称")
    parser.addoption("--mitm_proxy", action="store",
                     default="127.0.0.1:8080",
                     type=str,
                     help="--mitm_proxy:mitmproxy设置代理")

@pytest.fixture(scope="session", autouse=True)
def set_env_mitm_path(request):
    """
    将--mitm_path从命令行中获取放入环境变量中,给mitmdump工具用
    :param request:
    :return:
    """
    mitm_value = request.config.getoption("--mitm_path")
    os.environ['mitm_path'] = mitm_value
    print('\n --mitm_path参数值:', mitm_value)
    return mitm_value


@pytest.fixture(scope="session", autouse=True)
def set_env_mitm_proxy(request):
    """
    将--mitm_proxy从命令行中获取放入环境变量中,给mitmdump工具用
    :param request:
    :return:
    """
    mitm_proxy = request.config.getoption("--mitm_proxy")
    os.environ['mitm_proxy'] = mitm_proxy
    print('\n --mitm_proxy参数值:', mitm_proxy)
    return mitm_proxy


@pytest.fixture(scope="session")
def setup_mitmdump():
    """
    pytest启动,cmd启动一个mitmdump的进程
    :return: 
    """
    if not os.environ.get("mitm_path"):
        # 命令行没有传入mitm_path的值,给默认值一个
        caller = os.environ.get('PYTEST_CURRENT_TEST').split(':')[-1].split(' ')[0]
        mitm_path = "./testdata/" + caller + ".csv"
        os.environ["mitm_path"] = mitm_path
    cmd = r"mitmdump -p {}".format(os.environ.get("mitm_proxy") if os.environ.get("mitm_proxy") else '8080')
    process = subprocess.Popen(cmd, creationflags=subprocess.CREATE_NEW_CONSOLE)
    time.sleep(1)
    yield
    time.sleep(6)
    print("stop mitm")
    process.kill()

测试文件

python 复制代码
import csv
import os
import time

import pytest
import requests


class TestDemo:

    @pytest.mark.usefixtures("setup_mitmdump")
    @pytest.mark.parametrize(
        "name,assert_word",
        [
            pytest.param("1", "smart", id="第一个"),
            pytest.param("2", "smart", id="第二个")
        ]
    )
    def test_001(self, name, assert_word):
        print("我是用例test_%s" % name)
        url = "http://httpbin.org/get"
        params = {}
        headers = {"content-type": "application/json; charset=UTF-8"}
        proxies = {'http': 'http://127.0.0.1:%s' % os.environ.get("mitm_proxy")}  # ip地址
        option = requests.get(url=url, headers=headers, params=params, proxies=proxies)
        time.sleep(10)

运行效果

pytest -s test1.py --mitm_path=D:/hf.csv

pytest -s test1.py --mitm_path=D:/hf.csv --mitm_proxy 8989

相关推荐
旦莫2 天前
一个完美的AI测试Agent应该是什么样的
人工智能·python·测试开发·pytest·ai测试
我的xiaodoujiao3 天前
API 接口自动化测试详细图文教程学习系列20--结合Pytest框架使用
python·学习·测试工具·pytest
测试员周周3 天前
【AI测试路线图2】功能测试转 AI 测试:4~5 个月,一条最稳的路
开发语言·人工智能·python·功能测试·测试工具·单元测试·pytest
我的xiaodoujiao3 天前
API 接口自动化测试详细图文教程学习系列19--添加封装其他的方法
开发语言·python·学习·测试工具·pytest
小卓(friendhan2005)4 天前
基于 Pytest + Requests + Allure 的博客系统API自动化测试实践
pytest
小卓(friendhan2005)4 天前
基于 Pytest + Selenium + Allure 的博客系统自动化测试实践
selenium·测试工具·pytest
金玉满堂@bj5 天前
Pytest 完整使用教程
运维·服务器·pytest
测试员周周5 天前
【Appium 系列】第10节-手势操作实战 — 滑动、拖拽、缩放与轻拂
linux·服务器·开发语言·人工智能·python·appium·pytest
金玉满堂@bj5 天前
pytest+uiautomation+allure 数据驱动桌面自动化项目搭建指南-yaml版本
运维·自动化·pytest