Python: 如何创建正向测试程序?
Python: how to create a positive test for procedures?
我有一个 class 和一些 @staticmethod
的程序,因此它们没有 return 任何东西/它们的 return 类型是 None
.
如果他们在执行过程中失败,他们会抛出 Exception
.
我想unittest
这个class,但我正在努力设计积极的测试。
对于负面测试,这个任务很简单:
assertRaises(ValueError, my_static_method(*args))
assertRaises(MyCustomException, my_static_method(*args))
...但是如何创建阳性测试?我是否应该重新设计程序以在执行后始终 return True
,以便我可以对它们使用 assertTrue
?
如果您的方法有所作为,那么我相信那里应该有逻辑。让我们考虑这个虚拟示例:
cool = None
def my_static_method(something):
try:
cool = int(something)
except ValueError:
# logs here
对于阴性测试,我们有:
assertRaises(ValueError, my_static_method(*args))
对于阳性测试,我们可以检查 cool:
assertIsNotNone(cool)
所以您要检查调用 my_static_method
是否影响 cool
。
在没有看到实际代码的情况下很难猜测,但我会做一些假设:
- 静态方法中的逻辑是确定性的。
- 对输入值进行一些计算后得到一个结果
并用这个结果完成了一些操作。
- python3.4(mock 在过去的几个版本中有所发展和移动)
为了测试代码,至少要检查它最终是否产生了预期的结果。如果没有 return 值,则结果通常存储或发送到某处。在这种情况下,我们可以检查存储或发送结果的方法是否使用预期参数调用。
这可以使用 mock
包中提供的工具来完成,该包已成为 unittest
包的一部分。
例如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
已调用。
- 已计算出预期的文件名。
open
已在 write
模式下调用。
- 已使用预期参数调用文件句柄的
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'))
我有一个 class 和一些 @staticmethod
的程序,因此它们没有 return 任何东西/它们的 return 类型是 None
.
如果他们在执行过程中失败,他们会抛出 Exception
.
我想unittest
这个class,但我正在努力设计积极的测试。
对于负面测试,这个任务很简单:
assertRaises(ValueError, my_static_method(*args))
assertRaises(MyCustomException, my_static_method(*args))
...但是如何创建阳性测试?我是否应该重新设计程序以在执行后始终 return True
,以便我可以对它们使用 assertTrue
?
如果您的方法有所作为,那么我相信那里应该有逻辑。让我们考虑这个虚拟示例:
cool = None
def my_static_method(something):
try:
cool = int(something)
except ValueError:
# logs here
对于阴性测试,我们有:
assertRaises(ValueError, my_static_method(*args))
对于阳性测试,我们可以检查 cool:
assertIsNotNone(cool)
所以您要检查调用 my_static_method
是否影响 cool
。
在没有看到实际代码的情况下很难猜测,但我会做一些假设:
- 静态方法中的逻辑是确定性的。
- 对输入值进行一些计算后得到一个结果 并用这个结果完成了一些操作。
- python3.4(mock 在过去的几个版本中有所发展和移动)
为了测试代码,至少要检查它最终是否产生了预期的结果。如果没有 return 值,则结果通常存储或发送到某处。在这种情况下,我们可以检查存储或发送结果的方法是否使用预期参数调用。
这可以使用 mock
包中提供的工具来完成,该包已成为 unittest
包的一部分。
例如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
已调用。- 已计算出预期的文件名。
open
已在write
模式下调用。- 已使用预期参数调用文件句柄的
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'))