任何人都可以在编写测试用例时解释使用Python的setUp
和tearDown
方法,而不是在调用测试方法之前立即调用setUp
并调用tearDown
在被叫之后立即?
答案 0 :(得分:64)
通常,您将所有先决条件步骤添加到setUp,并将所有清理步骤添加到tearDown。
您可以阅读更多示例here。
定义setUp()方法时,测试运行器将运行该方法 在每次测试之前。同样,如果定义了tearDown()方法,则 测试运行器将在每次测试后调用该方法。
例如,您有一个需要项目存在或某些状态的测试 - 因此您将这些操作(创建对象实例,初始化db,准备规则等)放入setUp。
同样你知道每个测试都应该停在它启动的地方 - 这意味着我们必须将app状态恢复到它的初始状态 - 例如关闭文件,连接,删除新创建的项目,调用事务回调等等 - 所有这些步骤都应包含在tearDown中。
所以我的想法是测试本身应该只包含要在测试对象上执行的操作以获得结果,而setUp和tearDown是帮助您保持测试代码清洁和灵活的方法。
您可以为一堆测试创建一个setUp和tearDown,并在父类中定义它们 - 这样您就可以轻松地支持此类测试并更新常见的准备工作和清理工作。
如果您正在寻找一个简单的示例,请use the following link with example
答案 1 :(得分:40)
您可以使用这些来分解测试套件中所有测试的通用代码。
如果测试中有很多重复的代码,可以通过将此代码移动到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())
答案 2 :(得分:6)
假设您有一个包含10个测试的套件。 8个测试共享相同的设置/拆卸代码。另外2个没有。
设置和拆解为您提供了一个很好的方法来重构这8个测试。现在你用其他两个测试做什么?你将它们移动到另一个测试用例/套件。所以使用setup和teardown也有助于提供一种自然的方法来将测试分解为案例/套件