Pytest调用不同的python解释器(由于边界效应)

Pytest调用不同的python解释器(由于边界效应),python,testing,pytest,Python,Testing,Pytest,我需要测试一些有边界效果的代码,所以我的测试需要有不同的Python解释器 有没有办法告诉pytest为给定的测试用例使用Python解释器的新Python实例 例如,我有一个类C1,它设置了在实例化另一个类C2(我知道,不是一个正确的实现:)之前需要的环境。我需要测试: *类C1被实例化,然后C2被实例化=>OK *类C2已实例化=>引发异常 由于边界效应,以下代码将不正确 def test_OK(): C1() C2() def test_NOK(): with p

我需要测试一些有边界效果的代码,所以我的测试需要有不同的Python解释器

有没有办法告诉pytest为给定的测试用例使用Python解释器的新Python实例

例如,我有一个类C1,它设置了在实例化另一个类C2(我知道,不是一个正确的实现:)之前需要的环境。我需要测试: *类C1被实例化,然后C2被实例化=>OK *类C2已实例化=>引发异常

由于边界效应,以下代码将不正确

def test_OK():
    C1()
    C2()

def test_NOK():
    with pytest.raises(Exception):
        C2()
我使用了一种解决方法,通过创建使用子进程运行的外部文件来解决问题,但它非常难看

from pathlib import Path
import subprocess
import pytest

test_dir = Path(__file__).parent.absolute()
python_lib = test_dir.parent / "PythonLib"


no_standard = """
from a661test import TestFramework
from a661libgen_rev6_v1 import Label
framework = TestFramework()
framework.create_df([Label(1).define()])
"""

with_standard = """
from a661test import TestFramework
from a661libgen_rev6_v1 import Label, Standard_rev6_v1
Standard_rev6_v1()
framework = TestFramework()
framework.create_df([Label(1).define()])
"""

class Test_Framework_Nominal:
    def tc_A661_TESTFRAMEWORK_FRAMEWORK_TC_R_01(self, monkeypatch):
        """Checking an exception is raised when Standard not set"""
        monkeypatch.setenv("PYTHONPATH", str(python_lib))
        script = Path("script.py")
        script.write_text(no_standard)
        with pytest.raises(Exception):
            subprocess.run(["python", str(script)], check=True)

    def tc_A661_TESTFRAMEWORK_FRAMEWORK_TC_N_02(self, monkeypatch):
        """Checking no exception is raised if Standard is set"""
        monkeypatch.setenv("PYTHONPATH", str(python_lib))
        script = Path("script.py")
        script.write_text(with_standard)
        subprocess.run(["python", str(script)], check=True)
是否有一些神奇的选项,或conftest.py的插件/设置,允许类似以下内容:

@pytest.mark.new_python_instance
def test_OK():
    C1()
    C2()

@pytest.mark.new_python_instance
def test_NOK():
    with pytest.raises(Exception):
        C2()

谢谢

通常情况下,您可以用另一种方式进行测试-对所有受支持的python版本运行测试(例如,使用
tox
或其他任何工具)并有条件地跳过只应使用选定解释器执行的测试。@hoefling感谢今天的提示,但这里不是关于使用不同版本进行测试,而是使用给定python解释器的不同“实例”进行测试。您还可以使用同一解释器的不同“实例”配置测试(不管这意味着什么-相同的可执行文件具有不同的设置?)。否则,您必须像现在这样派生一个新的进程,Python中没有魔法可以替代正在运行的进程。@hoefling这确实是一种有趣的探索方式。因此,您可以创建几个“tox配置”使用相同的解释器命名?IIRC是的,但我不知道您的确切要求是什么。请查看您可以修改的内容。通常,您可以用另一种方式进行操作-对所有受支持的python版本(例如,使用
tox
或其他方式)运行测试并有条件地跳过只应使用选定解释器执行的测试。@hoefling感谢今天的提示,但这里不是关于使用不同版本进行测试,而是使用给定python解释器的不同“实例”进行测试。您还可以使用同一解释器的不同“实例”配置测试(不管这意味着什么-相同的可执行文件具有不同的设置?)。否则,您必须像现在这样派生一个新的进程,Python中没有魔法可以替代正在运行的进程。@hoefling这确实是一种有趣的探索方式。因此,您可以创建几个“tox配置”是的,但我不知道你的确切要求是什么。看看你能修改的东西。