解释测试用例中使用的Python方法"setUp"和"tearDown"

131

除了setUp在调用测试方法之前立即调用,tearDown在它被调用后立即调用之外,有人能解释一下编写测试用例时使用Python的setUptearDown方法的用途吗?

3个回答

112

通常情况下,您应该将所有的前置步骤添加到 setUp 方法里,将所有的清理步骤放到 tearDown 方法中。

您可以在这里阅读更多有关此内容的例子。

如果定义了setUp()方法,则测试运行器将在每个测试之前运行该方法。同样,如果定义了tearDown()方法,则测试运行器将在每个测试之后调用该方法。

例如,如果您有一个需要存在条目或特定状态的测试,那么您应该将这些操作(创建对象实例、初始化数据库、准备规则等)放入setUp方法中。

另外,正如您所知,每个测试应该在其开始的地方停止,也就是说,我们必须将应用程序状态恢复到它的初始状态 - 关闭文件和连接、删除新创建的项目、调用事务回调等等,所有这些步骤都应该包含在tearDown方法里。

因此,测试本身应该只包含在测试对象上执行以获取结果的操作,而setUp和tearDown方法是帮助您使测试代码简洁和灵活的方法。

您可以为一组测试创建setUp和tearDown,并在父类中定义它们,这样就很容易支持这些测试并更新常见的准备和清理工作。

如果您正在寻找一个简单的例子,请使用以下链接查看示例


75

您可以使用这些方式来提取测试套件中所有测试共同的代码。

如果您在测试中有很多重复的代码,您可以通过将此代码移动到setUp/tearDown中使其更短。

您可以使用它来创建测试数据(例如设置伪造/模拟对象),或者使用伪造对象替换函数。

如果您正在进行集成测试,您可以在setUp中检查环境前提条件,如果某些条件未正确设置,则跳过测试。

例如:

class TurretTest(unittest.TestCase):

    def setUp(self):
        self.turret_factory = TurretFactory()
        self.turret = self.turret_factory.CreateTurret()

    def test_turret_is_on_by_default(self):
        self.assertEquals(True, self.turret.is_on())

    def test_turret_turns_can_be_turned_off(self):
        self.turret.turn_off()
        self.assertEquals(False, self.turret.is_on())

20
+1 因为这 9 行代码是我需要理解的全部内容。优雅而简洁的例子。老实说,除了问题本身,那 9 行代码是我在页面上唯一阅读的内容。你在代码示例之前说了什么英语吗?其实没必要!代码已经表达了一切!谢谢 Matt。 - Nathan C. Tresch
3
我不清楚这里是如何演示“如果某些设置没有正确设置,则跳过测试”的。还是那只是一个旁白? - user5359531

12

假设您有一个包含10个测试的套件。其中8个测试共享相同的setup/teardown代码,而另外2个则不同。

使用setup和teardown可以很好地重构这8个测试。那么对于另外2个测试,应该怎么办呢? 您可以将它们移动到另一个测试用例或测试套件中。因此,使用setup和teardown还可以自然地将测试分成不同的测试用例或测试套件。


4
有时将测试移动到另一个测试用例中是不希望的。在这种情况下,您可以编写一个装饰器来包含安装/拆卸代码,并仅对需要的测试函数进行修饰。 - Matthijs
2
这绝不是对问题的答案。 - gented
2
无论你是否同意,这个技巧都很有用.. :) - User

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接