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

在没有看到实际代码的情况下很难猜测,但我会做一些假设:

  1. 静态方法中的逻辑是确定性的。
  2. 对输入值进行一些计算后得到一个结果 并用这个结果完成了一些操作。
  3. 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)

在单元测试中我会检查以下内容:

  1. open 已调用。
  2. 已计算出预期的文件名。
  3. open已在 write 模式下调用。
  4. 已使用预期参数调用文件句柄的 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'))