如何将 pytest 固定装置与 Unittest 方法一起使用

boa*_*der 8 python pytest

class MyTestCase(unittest.Testcase):
    def setUp(self):
        self.something = True

    @pytest.fixture(autouse=True)
    def MyTestMethod(self, frozentime):
        fn(self.something)  # self.something is NOT defined
Run Code Online (Sandbox Code Playgroud)

如果我使用,@pytest.fixture(autouse=True)我最终会从 PyTest 中得到一些奇怪的行为。setUpPyTest 没有在测试方法之前调用我的方法,而是跳过setUp和 调用MyTestMethod,就好像它是一个 PyTest MyTestFunction,这当然不能很好地工作。

如何MyTestMethodfrozentime不忽略setUp应该首先调用的方法的情况下使用夹具。

class MyTestCase(unittest.Testcase):
    def setUp(self):
        self.something = True

    #@pytest.fixture(autouse=True)
    def MyTestMethod(self, frozentime): # Fails on call, because it needs too many arguments.
        fn(self.something)  
Run Code Online (Sandbox Code Playgroud)

hoe*_*ing 4

\n\n

这是因为自动使用装置是在setUp/tearDown方法之前执行的:

\n\n
\n

笔记

\n\n

由于两个框架之间的架构差异,unittest基于 的测试的设置和拆卸是在call测试阶段而不是在pytest\xe2\x80\x98s 标准setupteardown阶段中执行的。在某些情况下,理解这一点可能很重要,特别是在推理错误时。例如,如果unittest基于 的套件在安装期间出现错误,pytest则在其阶段不会报告任何错误setup,而是会在 期间引发错误call

\n
\n\n

来源

\n\n

您无法采取任何措施来解决此问题。您可以将与固定装置相关的代码移出setUp/tearDown方法,例如:如果self.flag在类范围的固定装置中使用,则可以替换

\n\n
class Tests(unittest.TestCase):\n\n    def setUp(self):\n        self.flag = True\n\n    def tearDown(self):\n        self.flag = False\n\n    @pytest.fixture(autouse=True)\n    def myfixture(self):\n        print(self.flag)\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
class Tests(unittest.TestCase):\n\n    @pytest.fixture(autouse=True)\n    def prepare_flag(self):\n        self.flag = True\n        yield\n        self.flag = False\n\n    @pytest.fixture(autouse=True)\n    def myfixture(self, prepare_flag):\n        print(self.flag)\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者您可以从装置中移动所有setUp相关代码:

\n\n
class Tests(unittest.TestCase):\n\n    def setUp(self):\n        self.flag = True\n\n    @pytest.fixture(autouse=True)\n    def myfixture(self, somearg):\n        fn(self.flag, somearg)\n
Run Code Online (Sandbox Code Playgroud)\n\n

变成

\n\n
class Tests(unittest.TestCase):\n\n    def setUp(self):\n        self.flag = True\n        fn(self.flag, self._somearg)\n\n    @pytest.fixture(autouse=True)\n    def assign_stuff(self, somearg):\n        self._somearg = somearg\n
Run Code Online (Sandbox Code Playgroud)\n