我是python的新手。我阅读了unittest docs。在有关tearDown()方法的文档中,我找到了以下行
"即使测试方法引发异常,也会调用此方法,因此子类中的实现可能需要特别注意检查内部状态。"
这句话传达了什么?你可以借助一些好的例子让我理解我,内部陈述会造成破坏吗?
提前致谢。
编辑:
我得到了一些答案,但它们很简单。我需要一些例子,涉及一些状态,比如涉及数据库的测试等等。
答案 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
回滚事务。