115

任何人都可以在编写测试用例时解释 PythonsetUp和方法的使用,除了在调用测试方法之前立即调用并在调用后立即调用?tearDownsetUptearDown

4

3 回答 3

100

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

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

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

例如,您有一个需要项目存在或某些状态的测试 - 所以您将这些操作(创建对象实例、初始化数据库、准备规则等)放入 setUp。

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

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

您可以为一堆测试创建 setUp 和 tearDown 并在父类中定义它们 - 这样您就可以轻松支持此类测试并更新常见的准备和清理。

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

于 2011-07-28T06:08:43.177 回答
67

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

如果您的测试中有很多重复的代码,您可以通过将此代码移动到 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())
于 2011-07-28T06:02:05.787 回答
8

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

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

于 2011-07-28T06:08:00.793 回答