Python 在pytest中,skipif不';如果测试类是子类,则无法按预期工作

Python 在pytest中,skipif不';如果测试类是子类,则无法按预期工作,python,subclass,pytest,Python,Subclass,Pytest,通常,我有两个测试类,它们共享除setup_类和teardown_类之外的所有测试用例。这两个测试类针对需要不同设置的两个不同服务器运行相同的客户端操作测试。根据测试运行的位置/时间,我可能希望跳过某些测试,因为该服务器可能不可用。所以我想出了一个设计: class AllTests: def test_1(self): ... def test_2(self): ... @pytest.mark.skipif(condition1) class Tes

通常,我有两个测试类,它们共享除setup_类和teardown_类之外的所有测试用例。这两个测试类针对需要不同设置的两个不同服务器运行相同的客户端操作测试。根据测试运行的位置/时间,我可能希望跳过某些测试,因为该服务器可能不可用。所以我想出了一个设计:

class AllTests:
   def test_1(self):
       ...
   def test_2(self):
       ...

@pytest.mark.skipif(condition1)
class TestA(AllTests):
   @classmethod
   def setup_class(cls):
       ...
   @classmethod
   def teardown_class(cls):
       ...

@pytest.mark.skipif(condition2)
class TestB(AllTests):
   @classmethod
   def setup_class(cls):
       ...
   @classmethod
   def teardown_class(cls):
       ... 
如果不跳过任何类,则可以正常工作。 但是,如果满足条件1并且跳过了TestA,那么AllTests中的测试函数也不会为TestB运行(这显然不是我想要的!)

那么如何解决这个问题呢


或者是否有其他设计来满足我的需求(测试类共享除setup_类和teardown_类之外的所有测试用例,并且每个测试用例都应该可以跳过)?“参数化”可用吗?我试过了,但就是找不到正确的代码:(

这确实是实现的副作用。类标记只是填充到函数中

使用参数化是一种可行的替代方法。如果您的设置和拆卸功能相似,这一方法尤其有效。您可以使用带有参数化的屈服夹具:

@pytest.fixture(scope="class", params=['a', 'b'])
def do_setup(request):
    # setup
    a = open(request.param)
    yield a  # provide the fixture value
    # teardown
    close(a)
如果您不需要结果(
a
此处),则可以使用
autouse=True
并使夹具自动运行


有关更多信息,请参阅pytest关于Fixture的文档:

也许您可以解释更多为什么要这样做,例如跳过条件、数据等@NilsWerner我在顶部添加了它~是。Fixture也是我找到的解决方案。谢谢~