【发布时间】:2015-07-16 12:08:54
【问题描述】:
我是 python 新手。我阅读了 unittest 文档。在有关 tearDown() 方法的文档中,我发现以下几行
“即使测试方法引发异常也会调用它,因此子类中的实现可能需要特别小心检查内部状态。”
这句话表达了什么?您能否通过一些很好的例子让我理解我,内部语句可能会造成严重破坏?
提前致谢。
编辑:
我得到了一些答案,但它们很简单。我需要一些涉及某些状态的示例,例如涉及数据库的测试等。
【问题讨论】:
我是 python 新手。我阅读了 unittest 文档。在有关 tearDown() 方法的文档中,我发现以下几行
“即使测试方法引发异常也会调用它,因此子类中的实现可能需要特别小心检查内部状态。”
这句话表达了什么?您能否通过一些很好的例子让我理解我,内部语句可能会造成严重破坏?
提前致谢。
编辑:
我得到了一些答案,但它们很简单。我需要一些涉及某些状态的示例,例如涉及数据库的测试等。
【问题讨论】:
来自 OP:
“即使测试方法引发异常也会调用它,因此子类中的实现可能需要特别小心检查内部状态。”
这传达的第一件事是您可以确定teardown 在您的测试方法中发生的任何事情都会被调用。因此,这意味着您应该不在您的测试方法中有任何拆卸代码,您应该将它移到teardown 方法中。
但是,如果您的测试方法中确实存在异常,这可能意味着您的测试实例的状态在不同的测试运行中可能会有所不同,teardown 方法必须考虑到这一点,或者您必须构建您的代码,使其始终有效。
一个例子可能是您的测试代码涉及在数据库中创建表。如果您有异常,则可能并非所有表都已创建,因此teardown 应确保它不会尝试删除不存在的表。不过,更好的方法可能是让setup 启动事务,而teardown 回滚事务。
【讨论】:
这意味着无论您的测试方法通过还是失败(引发异常),都会执行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)
【讨论】: