替换pytest中的测试用例继承?

Pau*_*aul 7 python unit-testing pytest python-unittest

背景

在 Python 的unittest框架中,在一组基本测试上使用继承来将一整套测试应用于新问题,并偶尔添加额外测试是一种相当常见的习惯用法。一个简单的例子是:

from unittest import TestCase

class BaseTestCase(TestCase):
    VAR = 3

    def test_var_positive(self):
        self.assertGreaterEqual(self.VAR, 0)

class SubTestCase(BaseTestCase):
    VAR = 8

    def test_var_even(self):
        self.assertTrue(self.VAR % 2 == 0)
Run Code Online (Sandbox Code Playgroud)

运行时,运行 3 个测试:

$ python -m unittest -v
test_var_positive (test_unittest.BaseTestCase) ... ok
test_var_even (test_unittest.SubTestCase) ... ok
test_var_positive (test_unittest.SubTestCase) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.000s
Run Code Online (Sandbox Code Playgroud)

如果您正在测试类层次结构,这尤其有用,其中每个子类都是父类子类型,因此除了它自己的测试套件之外,还应该能够通过父类的测试套件。

问题

我想切换到 using pytest,但我有很多这样构建的测试。据我所知,pytest打算TestCase用fixtures替换类的大部分功能,但是是否有允许测试继承的pytest习惯用法,如果有的话,它是什么

我知道pytest可以用于运行unittest样式测试,但支持有限,我想pytest在我的测试中使用一些“永远不会被支持”的功能。

Ara*_*Fey 9

Pytest 允许您将测试用例分组到类中,因此它自然支持测试用例继承。

unittest测试重写为pytest测试时,请记住遵循pytest 的命名准则

  • 类名必须以 Test
  • 函数/方法名称必须以 test_

不遵守此命名方案将阻止您的测试被收集和执行。


您为 pytest 重写的测试如下所示:

class TestBase:
    VAR = 3

    def test_var_positive(self):
        assert self.VAR >= 0

class TestSub(TestBase):
    VAR = 8

    def test_var_even(self):
        assert self.VAR % 2 == 0
Run Code Online (Sandbox Code Playgroud)