unittest python中的拆解方法

时间:2015-07-16 12:08:54

标签: python python-unittest

我是python的新手。我阅读了unittest docs。在有关tearDown()方法的文档中,我找到了以下行

"即使测试方法引发异常,也会调用此方法,因此子类中的实现可能需要特别注意检查内部状态。"

这句话传达了什么?你可以借助一些好的例子让我理解我,内部陈述会造成破坏吗?

提前致谢。

编辑:

我得到了一些答案,但它们很简单。我需要一些例子,涉及一些状态,比如涉及数据库的测试等等。

2 个答案:

答案 0 :(得分:0)

这意味着无论您的测试方法是通过还是失败(引发异常),都会执行tearDown()方法。

例如:

def tearDown():
    print 'In teardown: cleaning up'

def test_Example1():
    try:
        result = 2 / 0
    except ZeroDivisionError as e:
        raise e

def test_Example2():
    try:
       result = 2 / 2
    except ZeroDivisionError as e:
        raise e   

test_Example1运行时,它会引发ZeroDivisionError,然后执行tearDown(),将In teardown: cleaning up打印到控制台。 test_Example2 会引发ZeroDivisionError例外,但tearDown()仍然会被执行。

编辑我并不完全熟悉Python的数据库模块,但这应该足以让球滚动......

def tearDown():
    print 'In teardown: cleaning up'

def test_do_database_task():
    db = sqlite3.connect(DB_NAME)        
    try:
        # code related to task at hand
    except:
        raise Exception("Error in connection!")
    finally:
        closeDb(db)

答案 1 :(得分:0)

来自OP:

"即使测试方法引发异常,也会调用此方法,因此子类中的实现可能需要特别注意检查内部状态。"

这传达的第一件事是,您可以确定teardown被称为测试方法中发生的任何事情。因此,这意味着您应该在测试方法中有任何拆卸代码,您应该将其移到teardown方法中。

但是,如果测试方法中有异常,这可能意味着测试实例的状态在不同的测试运行中可能会有所不同,而teardown方法必须考虑到这一点,或者您必须构建您的代码,以便它始终有效。

一个例子可能是您测试代码涉及在数据库中创建表。如果您有异常,那么可能并非所有表都已创建,因此teardown应确保它不会尝试删除不存在的表。但是,更好的方法是setup启动事务并teardown回滚事务。