希望Python assertRaises()失败,但测试始终通过
我正在尝试使用TDD,所以我一直在尝试从Python的unittest模块开始。我写了一个测试,我完全期待失败,但它总是通过!以下是测试代码:希望Python assertRaises()失败,但测试始终通过,python,unit-testing,python-unittest,Python,Unit Testing,Python Unittest,我正在尝试使用TDD,所以我一直在尝试从Python的unittest模块开始。我写了一个测试,我完全期待失败,但它总是通过!以下是测试代码: def test_file_not_found_exception(self): invalid_config = "Testing/invalidExperiment.xml" experiment_with_invalid_config = MyClass(invalid_config) self.assertRaises(O
def test_file_not_found_exception(self):
invalid_config = "Testing/invalidExperiment.xml"
experiment_with_invalid_config = MyClass(invalid_config)
self.assertRaises(OSError, experiment_with_invalid_config.run_experiment())
我的类定义如下:
class MyClass:
def __init__(self, experiments, output_directory = ".")
self._experiments = experiments
self._output_directory = output_directory
def run_experiment(self):
try:
x = 2 # dummy statement
except OSError:
print "Experiment file not found"
except:
print "Unexpected Error"
我认为try块应该总是正确执行,所以我不知道为什么我的unittest总是通过。我对Python中的OOP非常陌生,所以我可能犯了一个非常明显的错误。。。另外,如果我在run\u experience()方法的try-except块中捕获到异常,assertRaises()调用是否可以工作?您正在调用函数
MyClass.run\u experiment
,并将其输出传递给self.assertRaises,因此当它无法引发时,它不会正确注册错误
错误示例:
import unittest
class MyClass(object):
def __init__(self, config):
pass
def run_experiment(self): pass
class MainTest(unittest.TestCase):
def test_file_not_found_exception(self):
invalid_config = "Testing/invalidExperiment.xml"
experiment_with_invalid_config = MyClass(invalid_config)
self.assertRaises(OSError, experiment_with_invalid_config.run_experiment())
if __name__ == "__main__":
unittest.main()
正确:
with self.assertRaises(OSError):
experiment_with_invalid_config.run_experiment()
或
我认为,因为您正在捕获代码中的异常,所以您的测试不会收到OSError异常。我从方法体中删除了try-except块,它仍然会通过。。。可疑。我也不确定你的考试怎么会不及格?通常你不会调用传递给self.assertRaises的函数-你能建议重新编写测试代码吗?通常你不需要,比如self.assertRaises(Exception):func()或self.assertRaises(Exception,func),我不知道为什么传递值时它不会失败。谢谢!我没有注意到我应该在没有括号的情况下运行它。另外,在您对我的示例的重新表述中,您没有包含多余的括号,因此您标记为错误示例的内容实际上是正确的!我很惊讶您没有收到错误,因为通常像
1()
或None()
这样的东西会引发TypeError
,但显然,如果None
传递给self.assertRaises,它不会像传递了1
这样的非无、不可调用的值那样尝试调用None()
。这是一种奇怪的行为,的确很奇怪。再次感谢你的帮助!
self.assertRaises(OSError, experiment_with_invalid_config.run_experiment)