gla*_*con 341 python unit-testing
我想编写一个测试来确定在给定的环境中不会引发异常.
这是简单的测试,如果一个异常是引发...
sInvalidPath=AlwaysSuppliesAnInvalidPath()
self.assertRaises(PathIsNotAValidOne, MyObject, sInvalidPath)
Run Code Online (Sandbox Code Playgroud)
......但你怎么能做相反的事情.
像我这样的东西,我在追求...
sValidPath=AlwaysSuppliesAValidPath()
self.assertNotRaises(PathIsNotAValidOne, MyObject, sValidPath)
Run Code Online (Sandbox Code Playgroud)
DGH*_*DGH 358
def run_test(self):
try:
myFunc()
except ExceptionType:
self.fail("myFunc() raised ExceptionType unexpectedly!")
Run Code Online (Sandbox Code Playgroud)
S.L*_*ott 62
嗨 - 我想编写一个测试来确定在特定情况下不会引发异常.
这是默认假设 - 不会引发异常.
如果你别说什么,那就是在每一次测试中都假设的.
您不必为此实际编写任何断言.
use*_*876 52
只需调用该函数即可.如果它引发异常,单元测试框架会将此标记为错误.您可能想添加评论,例如:
sValidPath=AlwaysSuppliesAValidPath()
# Check PathIsNotAValidOne not thrown
MyObject(sValidPath)
Run Code Online (Sandbox Code Playgroud)
gla*_*con 14
我是原始海报,我在没有首先在代码中使用它的情况下接受了DGH的上述答案.
一旦我使用了,我意识到需要做一些调整才能真正做我需要做的事情(对DGH来说,他/她确实说"或类似的东西"!).
为了别人的利益,我认为值得在这里发布调整:
try:
a = Application("abcdef", "")
except pySourceAidExceptions.PathIsNotAValidOne:
pass
except:
self.assertTrue(False)
Run Code Online (Sandbox Code Playgroud)
我在这里尝试做的是确保如果尝试使用第二个空格参数实例化Application对象,则会引发pySourceAidExceptions.PathIsNotAValidOne.
我相信使用上面的代码(严重依赖DGH的答案)会这样做.
您可以定义assertNotRaises通过重用对原执行的90%assertRaises的中unittest模块。使用这种方法,最终得到的assertNotRaises方法除了其反转的失败条件外,其行为与相同assertRaises。
事实证明,向其中添加assertNotRaises方法非常容易unittest.TestCase(编写此答案所花的时间大约是代码的4倍)。这是该assertNotRaises方法的现场演示。就像一样assertRaises,您可以将callable和args传递给assertNotRaises,也可以在with语句中使用它。现场演示包括一个测试案例,演示了assertNotRaises预期的工作方式。
assertRaisesin 的实现unittest相当复杂,但是通过一些巧妙的子类化,您可以覆盖和逆转其失败条件。
assertRaises是一个简短的方法,基本上只创建unittest.case._AssertRaisesContext该类的实例并返回它(请参见unittest.case模块中的定义)。您可以_AssertNotRaisesContext通过继承_AssertRaisesContext并覆盖其__exit__方法来定义自己的类:
import traceback
from unittest.case import _AssertRaisesContext
class _AssertNotRaisesContext(_AssertRaisesContext):
def __exit__(self, exc_type, exc_value, tb):
if exc_type is not None:
self.exception = exc_value.with_traceback(None)
try:
exc_name = self.expected.__name__
except AttributeError:
exc_name = str(self.expected)
if self.obj_name:
self._raiseFailure("{} raised by {}".format(exc_name,
self.obj_name))
else:
self._raiseFailure("{} raised".format(exc_name))
else:
traceback.clear_frames(tb)
return True
Run Code Online (Sandbox Code Playgroud)
通常,您可以通过从中继承来定义测试用例类TestCase。如果您改为继承子类MyTestCase:
class MyTestCase(unittest.TestCase):
def assertNotRaises(self, expected_exception, *args, **kwargs):
context = _AssertNotRaisesContext(expected_exception, self)
try:
return context.handle('assertNotRaises', args, kwargs)
finally:
context = None
Run Code Online (Sandbox Code Playgroud)
现在,您所有的测试用例都将具有assertNotRaises可用的方法。
| 归档时间: |
|
| 查看次数: |
96504 次 |
| 最近记录: |