除了setUp
在调用测试方法之前立即调用,tearDown
在它被调用后立即调用之外,有人能解释一下编写测试用例时使用Python的setUp
和tearDown
方法的用途吗?
除了setUp
在调用测试方法之前立即调用,tearDown
在它被调用后立即调用之外,有人能解释一下编写测试用例时使用Python的setUp
和tearDown
方法的用途吗?
通常情况下,您应该将所有的前置步骤添加到 setUp 方法里,将所有的清理步骤放到 tearDown 方法中。
您可以在这里阅读更多有关此内容的例子。
如果定义了setUp()方法,则测试运行器将在每个测试之前运行该方法。同样,如果定义了tearDown()方法,则测试运行器将在每个测试之后调用该方法。
例如,如果您有一个需要存在条目或特定状态的测试,那么您应该将这些操作(创建对象实例、初始化数据库、准备规则等)放入setUp方法中。
另外,正如您所知,每个测试应该在其开始的地方停止,也就是说,我们必须将应用程序状态恢复到它的初始状态 - 关闭文件和连接、删除新创建的项目、调用事务回调等等,所有这些步骤都应该包含在tearDown方法里。
因此,测试本身应该只包含在测试对象上执行以获取结果的操作,而setUp和tearDown方法是帮助您使测试代码简洁和灵活的方法。
您可以为一组测试创建setUp和tearDown,并在父类中定义它们,这样就很容易支持这些测试并更新常见的准备和清理工作。
如果您正在寻找一个简单的例子,请使用以下链接查看示例。
您可以使用这些方式来提取测试套件中所有测试共同的代码。
如果您在测试中有很多重复的代码,您可以通过将此代码移动到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代码,而另外2个则不同。
使用setup和teardown可以很好地重构这8个测试。那么对于另外2个测试,应该怎么办呢? 您可以将它们移动到另一个测试用例或测试套件中。因此,使用setup和teardown还可以自然地将测试分成不同的测试用例或测试套件。