【问题标题】:When to use TestClass instance variables vs Pytest Fixtures何时使用 TestClass 实例变量与 Pytest Fixtures
【发布时间】:2020-06-10 23:26:13
【问题描述】:

什么时候适合使用 Pytest 固定装置而不是实例变量?

假设我有一个大型的预期 JSON 输出存储在本地,多个测试使用该输出。以下哪种方法更合适?我可以看到对象的状态在测试之间保持不变。

@pytest.fixture
def expected_output():
    return <fixture>

def test_1(expected_output):
    <do something>
    assert output == expected_output

def test_2(expected_output):
    <do something>
    assert output == expected_output
class SomeTestClass(TestCase):
    def setUp(self):
        self.expected_output = <fixture>

    def test_1(self):
        <do something>
        self.assertEqual(output, self.expected_output)

    def test_2(self):
        <do something>
        self.assertEqual(output, self.expected_output)

我已经梳理了 Pytest 文档,但似乎不明白其中的区别。拥有实例变量似乎带来了固定装置的许多好处——即跨测试共享值。

【问题讨论】:

    标签: python unit-testing testing pytest fixtures


    【解决方案1】:

    您在示例中已经展示的第一个区别:夹具不需要测试类。

    如果使用测试类,也可以使用pytest中的setup方法,不需要使用unittest.TestCase

    class SomeTestClass:
        def setup_method(self):
            self.expected_output = <fixture>
    
        def test_1(self):
            <do something>
            assert output == self.expected_output
    

    这在pytest 中被描述为classic xunit-style setup。从该文档中:

    虽然这些设置/拆卸方法对于单元测试或鼻子背景的人来说很简单和熟悉,但您也可以考虑使用 pytest 更强大的fixture mechanism,它利用依赖注入的概念,允许更模块化和更具可扩展性管理测试状态的方法,特别是对于大型项目和功能测试。您可以在同一个文件中混合使用两种夹具机制,但 unittest.TestCase 子类的测试方法无法接收夹具参数。

    一般来说,我建议不要将 unittestpytest 混合用于新的测试代码。 unittest 中没有什么是 pytest 无法完成的,但您不能针对使用 pytest 功能的测试运行 unittest

    在您的具体示例中,您实际上不需要实例变量,因为预期输出不会随测试而改变。您可以只静态声明变量并使用它(在类内或类外),或者您可以使用类变量(并使用setup_class 将其设置在pytest 中)。

    对于这个简单的示例,使用哪个概念可能没有真正的区别,但如果您需要 setupteardown,固定装置可能会更有帮助,因为它们同时提供:

    @pytest.fixture
    def some_resource():
        resource = acquire_resource()
        yield resource
        free(resource)
    

    最后,在您可以同时使用这两种变体的情况下,没有“合适”的选择,但使用固定装置总是感觉更一致——一种机制而不是两种不同的机制——这就是pytest 方式。并非最不重要的因素 - 大多数使用 pytest 的人在这些情况下使用固定装置,因此如果您使用固定装置,查找帮助和共享代码会更容易。

    【讨论】:

      猜你喜欢
      • 2019-11-12
      • 2021-09-07
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 2014-10-18
      • 2016-06-26
      • 1970-01-01
      • 2012-07-23
      相关资源
      最近更新 更多