我有一个类,其中有一些@staticmethod
是过程,因此它们不返回任何内容/它们的返回类型是None
。
如果它们在执行过程中失败,则抛出一个Exception
。
我想在这门课上unittest
,但我正在努力设计阳性测试。
对于阴性测试,这项任务很容易:
assertRaises(ValueError, my_static_method(*args))
assertRaises(MyCustomException, my_static_method(*args))
但我如何创建阳性测试?我是否应该重新设计我的过程,使其在执行后始终返回True
,以便在它们上使用assertTrue
?
如果没有看到实际的代码,很难猜测,但我会做出一些假设:
- 静态方法中的逻辑是确定性的
- 对输入值进行一些计算后,会有一个结果并且利用该结果进行一些操作
- python3.4(mock在过去的几个版本中进行了改进和移动(
为了测试代码,必须检查至少在最后它是否产生了预期的结果。如果没有返回值,那么结果通常会被存储或发送到某个地方。在这种情况下,我们可以检查存储或发送结果的方法是否使用预期的参数进行了调用。
这可以使用已成为unittest
包一部分的mock
包中可用的工具来完成。
例如my_package/my_module.py
中的以下静态方法:
import uuid
class MyClass:
@staticmethod
def my_procedure(value):
if isinstance(value, str):
prefix = 'string'
else:
prefix = 'other'
with open('/tmp/%s_%s' % (prefix, uuid.uuid4()), 'w') as f:
f.write(value)
在单元测试中,我将检查以下内容:
- 已调用
open
- 已计算出所需的文件名
- CCD_ 11已经在CCD_
- 已使用预期参数调用文件句柄的
write()
方法
单元测试:
import unittest
from unittest.mock import patch
from my_package.my_module import MyClass
class MyClassTest(unittest.TestCase):
@patch('my_package.my_module.open', create=True)
def test_my_procedure(self, open_mock):
write_mock = open_mock.return_value.write
MyClass.my_procedure('test')
self.assertTrue(open_mock.call_count, 1)
file_name, mode = open_mock.call_args[0]
self.assertTrue(file_name.startswith('/tmp/string_'))
self.assertEqual(mode, 'w')
self.assertTrue(write_mock.called_once_with('test'))
如果你的方法做了一些事情,那么我相信那里应该有一个逻辑。让我们考虑这个伪示例:
cool = None
def my_static_method(something):
try:
cool = int(something)
except ValueError:
# logs here
对于阴性检测,我们有:
assertRaises(ValueError, my_static_method(*args))
对于阳性测试,我们可以检查是否很酷:
assertIsNotNone(cool)
因此,您正在检查调用my_static_method
是否会影响cool
。