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

132 投票
3 回答
158287 浏览
提问于 2025-04-16 22:25

有没有人能解释一下在写测试用例时,Python的setUptearDown这两个方法的用法?除了setUp是在测试方法之前马上调用,tearDown是在测试方法之后马上调用之外,还有什么其他的作用吗?

3 个回答

13

假设你有一组包含10个测试的程序。其中8个测试使用相同的准备和清理代码,而另外2个测试则不一样。

准备和清理的过程让你可以更好地整理这8个测试。那么,另外2个测试该怎么处理呢?你可以把它们放到另一个测试组里。所以,使用准备和清理的方式也能帮助你自然地把测试分成不同的组。

75

你可以用这些方法把所有测试中共有的代码提取出来。

如果你的测试代码里有很多重复的部分,可以通过把这些代码放到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())
113

一般来说,你会把所有需要的准备步骤放在setUp里,把所有清理步骤放在tearDown里。

你可以通过这个链接查看更多示例 这里

当定义了setUp()方法时,测试运行器会在每个测试之前运行这个方法。同样,如果定义了tearDown()方法,测试运行器会在每个测试之后调用这个方法。

比如说,你有一个测试需要一些物品存在,或者需要某种状态——所以你把这些操作(创建对象实例、初始化数据库、准备规则等等)放到setUp里。

而且你知道每个测试应该在开始的地方结束——这意味着我们需要把应用的状态恢复到最初的状态——例如关闭文件、连接,删除新创建的项目,调用事务回调等等——所有这些步骤都应该放在tearDown里。

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

你可以为一组测试创建setUp和tearDown,并在一个父类中定义它们——这样你就可以轻松维护这些测试,并更新共同的准备和清理步骤。

如果你想要一个简单的例子,请 使用这个链接查看示例

撰写回答