6.2 fixture

在单元测试中,fixture表示“测试前创建,测试后销毁”的(辅助性)组件。比较好的方式是为它们构建一个特殊的组件,因为它们会在许多不同的地方被重用。例如,如果你需要一个对象来表示你的应用程序的配置状态,很可能你希望在每个测试前初始化它,并在测试结束后将其重置为默认值。对临时文件创建的依赖也需要该文件在测试开始前被创建,测试结束后被删除。

unittest只为我们提供了已经提及的setUptearDown函数。不过,是有机制可以hook这两个函数的。fixtures(https://pypi.python.org/pypi/fixtures)Python模块(并非标准库的一部分)提供了一种简单的创建fixture类和对象的机制,如useFixture方法。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

fixtures模块提供了一些内置的fixture,如fixtures.EnvironmentVariable,对于在os.environ中添加或修改变量很有用,并且变量会在测试退出后重置,如示例6.5所示。

示例6.5 使用fixtures.EnvironmentVariable

import fixtures
import os

class TestEnviron(fixtures.TestWithFixtures):
    def test_environ(self):
        fixture = self.useFixture(
            fixtures.EnvironmentVariable("FOOBAR", "42"))
        self.assertEqual(os.environ.get("FOOBAR"), "42")

    def test_environ_no_fixture(self):
        self.assertEqual(os.environ.get("FOOBAR"), None)

当你发现类似的通用模式时,最好创建一个fixture,以便它可以被你的所有其他测试用例重用。这极大地简化了逻辑,并且能准确地体现你在测试什么以及以何种方式测试。

 注意

  本节的示例代码之所以没有用unittest.TestCase,是因为fixtures.TestWith-Fixtures继承自unittest.TestCase