【问题标题】:Replacement for test case inheritance in pytest?替换pytest中的测试用例继承?
【发布时间】:2018-08-27 17:44:21
【问题描述】:

背景

在 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)

在运行时会运行 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

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

问题

我想改用pytest,但我有很多测试都是这样组织的。据我所知,pytest 打算用fixture 替换TestCase 类的大部分功能,但是是否有允许测试继承的pytest 习语,如果有,它是什么

我知道pytest 可用于运行unittest 样式的测试,但the support is limited,我想在我的测试中使用pytest 的一些“永远不会被支持”的功能.

【问题讨论】:

    标签: python unit-testing pytest python-unittest


    【解决方案1】:

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

    unittest 测试重写为pytest 测试时,请记住关注pytest's naming guidelines

    • 类名必须以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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多