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

NOO*_*OOB 82 python unit-testing

任何人都可以在编写测试用例时解释Python setUptearDown方法的使用,setUp在调用测试方法之前立即调用tearDown它并在调用它之后立即调用吗?

Art*_*nka 72

通常,您将所有先决条件步骤添加到setUp,并将所有清理步骤添加到tearDown.

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

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

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

另外你知道每个测试应该停在它启动的地方 - 这意味着我们必须将app状态恢复到它的初始状态 - 例如关闭文件,连接,删除新创建的项目,调用事务回调等等 - 所有这些泪滴中包含了一些步骤.

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

您可以为一组测试创建setUp和tearDown,并在父类中定义它们 - 因此您可以轻松地支持此类测试并更新常见的准备工作和清理.

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


Mat*_*tis 48

您可以使用这些来分解测试套件中所有测试的通用代码.

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

  • +1因为9行代码是我需要100%完成的.优雅,简洁的例子.说实话,除了问题之外,我在页面上阅读的那9行是唯一的,这也是我的问题.你在代码示例之前用英语说了什么吗?它不需要!代码说了一切!谢谢马特. (14认同)
  • 我不清楚这里如何演示“如果设置不正确,则跳过测试”。或者这只是一个旁白? (3认同)

Joh*_*ooy 6

假设您有一个包含10个测试的套件.8个测试共享相同的设置/拆卸代码.另外2个没有.

设置和拆解为您提供了一个很好的方法来重构这8个测试.现在你用其他两个测试做什么?你将它们移动到另一个测试用例/套件.所以使用setup和teardown也有助于提供一种自然的方法来将测试分解为案例/套件

  • 有时不希望将测试移动到另一个测试用例。在这种情况下,您可以使用设置/拆卸代码编写装饰器,并仅装饰所需的测试功能。 (2认同)
  • 这绝不是问题的答案。 (2认同)
  • @gented 无论你同意与否,这个提示很有帮助..:) (2认同)