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

相关推荐
FINE!(正在努力!)1 天前
PyTest框架学习
学习·pytest
程序员杰哥2 天前
接口自动化测试之pytest 运行方式及前置后置封装
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·pytest
测试老哥2 天前
Pytest+Selenium UI自动化测试实战实例
自动化测试·软件测试·python·selenium·测试工具·ui·pytest
水银嘻嘻2 天前
07 APP 自动化- appium+pytest+allure框架封装
python·appium·自动化·pytest
天才测试猿3 天前
接口自动化测试之pytest接口关联框架封装
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·pytest
not coder4 天前
Pytest Fixture 详解
数据库·pytest
not coder4 天前
pytest 常见问题解答 (FAQ)
开发语言·python·pytest
程序员的世界你不懂4 天前
(1)pytest简介和环境准备
pytest
not coder4 天前
Pytest Fixture 是什么?
数据库·oracle·pytest
Tester_孙大壮4 天前
pytest中的元类思想与实战应用
pytest