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


93

谁能在编写测试用例时解释Python setUptearDown方法的使用,除了setUp在调用测试方法之前立即调用和在调用测试方法tearDown之后立即调用之外?

Answers:


85

通常,您将所有必备步骤添加到setUp,并将所有清理步骤添加到tearDown。

您可以在此处阅读更多示例。

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

例如,您有一个测试,要求项目存在或处于某种状态-因此您将这些操作(创建对象实例,初始化db,准备规则等)放入setUp中。

同样,您知道每个测试都应该在开始的地方停止-这意味着我们必须将应用程序状态恢复到其初始状态-例如关闭文件,连接,删除新创建的项目,调用事务回调等等-所有这些步骤将包含在tearDown中。

因此,想法是测试本身应该只包含要在测试对象上执行以获取结果的动作,而setUp和tearDown是帮助您保持测试代码干净灵活的方法。

您可以为一堆测试创建setUp和tearDown并在父类中定义它们-因此,您很容易支持此类测试并更新常规准备工作和清理工作。

如果您正在寻找简单的示例,请使用以下带有示例的链接


53

您可以使用它们来排除测试套件中所有测试通用的代码。

如果您的测试中有很多重复的代码,可以通过将此代码移到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())

16
+1是因为我只需要9行代码就能100%熟练掌握。优雅简洁的例子。老实说,这9行是我在页面上唯一阅读的内容,而不是问题,这也是我的问题。您在代码示例之前是否用英语说过什么?没必要!代码说明了一切!谢谢马特。
内森·C·特雷施

2
我不清楚此处如何演示“如果没有正确设置,请跳过测试”。还是只是放在一边?
user5359531

6

假设您有一个包含10个测试的套件。其中8个测试共享相同的设置/拆卸代码。其他2个没有。

设置和拆卸提供了一种重构这8个测试的好方法。现在您如何处理其他两个测试?您可以将它们移动到另一个测试用例/套件。因此,使用设置和拆卸也有助于提供一种自然的方式将测试分解为案例/套件


1
有时不希望将测试移至另一个测试用例。在这种情况下,您可以使用设置/拆卸代码编写装饰器,并且仅装饰所需的测试功能。
Matthijs '18年

2
这绝不是问题的答案。
gented '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.