2016-10-02 57 views
2

我有一个类@staticmethod的程序,因此他们不返回任何东西/他们的返回类型是NonePython:如何为程序创建一个正面测试?

如果他们在执行过程中失败,他们会抛出一个Exception

我想unittest这个班,但我正在努力设计积极的测试。

对于负测试这个任务很简单:

assertRaises(ValueError, my_static_method(*args)) 
assertRaises(MyCustomException, my_static_method(*args)) 

...但我怎么创造积极的测试?我是否应该重新设计我的程序,以便在执行后始终返回True,以便我可以在其上使用assertTrue

+2

只是调用函数,没有任何断言。如果它发生异常,测试将失败。 – zvone

+1

所以如果程序_doesn't_引发异常,它成功了吗?然后调用过程_without_ try/catch包装器。 –

+0

是;如果程序不*引发异常,则成功。如果引发异常,则被其他使用该过程的类捕获。因此,如果发生不良情况,将会在unittest方法中抛出任何异常。 – daniel451

回答

1

没有看到实际的代码是很难猜测,但是我会作出一些假设:

  1. 逻辑在静态方法是确定性的。
  2. 在对输入值进行了一些计算之后,结果为 ,并且使用此结果完成了一些操作。
  3. python3.4(模拟已经演变和移动在过去的几个版本)

为了测试代码,一个必须检查并确保至少它到底会产生预期的结果。如果没有返回值,那么通常会将结果存储或发送到某个地方。在这种情况下,我们可以检查存储或发送结果的方法是否以期望的参数调用。

这可以使用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')) 
1

如果你的方法做了一些事情,那么我确信那里应该有一个逻辑。让我们看看这个虚拟例如:

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

相关问题