【发布时间】:2011-10-14 20:12:44
【问题描述】:
除了setUp在调用测试方法之前立即调用和tearDown在它被调用之后立即调用之外,任何人都可以解释Python的setUp和tearDown方法的使用吗?
【问题讨论】:
标签: python unit-testing python-unittest
除了setUp在调用测试方法之前立即调用和tearDown在它被调用之后立即调用之外,任何人都可以解释Python的setUp和tearDown方法的使用吗?
【问题讨论】:
标签: python unit-testing python-unittest
通常,您将所有先决步骤添加到 setUp,并将所有清理步骤添加到 tearDown。
您可以阅读更多示例here。
当定义了 setUp() 方法时,测试运行器将运行该方法 在每次测试之前。同样,如果定义了 tearDown() 方法,则 测试运行器将在每次测试后调用该方法。
例如,您有一个测试需要项目存在或特定状态 - 所以您将这些操作(创建对象实例、初始化数据库、准备规则等)放入 setUp。
你也知道每个测试都应该在它开始的地方停止——这意味着我们必须将应用程序状态恢复到它的初始状态——例如关闭文件、连接、删除新创建的项目、调用事务回调等等- 所有这些步骤都将包含在tearDown中。
所以这个想法是测试本身应该只包含要在测试对象上执行以获得结果的操作,而 setUp 和 tearDown 是帮助您保持测试代码干净和灵活的方法。
您可以为一堆测试创建 setUp 和 tearDown 并在父类中定义它们 - 这样您就可以轻松支持此类测试并更新常见的准备和清理。
如果您正在寻找一个简单的例子,请use the following link with example
【讨论】:
您可以使用这些来分解测试套件中所有测试的通用代码。
如果您的测试中有很多重复的代码,您可以通过将此代码移动到 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())
【讨论】:
假设您有一个包含 10 个测试的套件。 8 个测试共享相同的设置/拆卸代码。其他两个没有。
setup 和 teardown 为您提供了重构这 8 个测试的好方法。现在你如何处理其他 2 个测试?您会将它们移动到另一个测试用例/套件。因此,使用 setup 和 teardown 也有助于提供一种将测试分解为案例/套件的自然方式
【讨论】: