在Python构造函数中对异常进行单元测试

11 python constructor unit-testing

我只是Python和编程的初学者,对unittest模块有一些疑问.

我有一个类,在__init__方法中我正在做一些断言来检查错误的参数.我想创建一个unittest,在创建新实例时检查这样的AssertionError.

在unittest模块中,可以assertRaises在调用callable时测试(with )特定异常,但显然这将适用于类的方法.为构造函数运行此类测试的正确方法是什么?

我知道我可以尝试使用错误的参数创建类的实例,并且unittest将报告测试失败,但是在第一次这样的异常之后立即停止,即使我可以在多个测试函数中包装多个测试,它只是看起来并不优雅.

Mil*_*les 17

在unittest模块中,可以assertRaises在调用callable时测试(with )特定异常,但显然这将适用于类的方法.为构造函数运行此类测试的正确方法是什么?

构造函数本身是可调用的:

self.assertRaises(AssertionError, MyClass, arg1, arg2)
Run Code Online (Sandbox Code Playgroud)

话虽如此,我想回应nosklo和S.Lott关于对参数进行类型检查的担忧.此外,您不应该使用断言来检查函数参数:断言最有用,因为除非您的代码出现内部错误,否则将无法触发健全性检查.此外,当Python以"优化" -O模式运行时,会编译断言语句.如果函数需要对其参数进行某种检查,则应该引发一个正确的异常.


S.L*_*ott 7

不要乱用assertRaises.它太复杂了.

做这个

class Test_Init( unittest.TestCase ):
    def test_something( self ):
        try:
            x= Something( "This Should Fail" )
            self.fail( "Didn't raise AssertionError" )
        except AssertionError, e:
            self.assertEquals( "Expected Message", e.message )
            self.assertEquals( args, e.args )
Run Code Online (Sandbox Code Playgroud)

任何其他异常都是普通的测试错误.

另外,不要在__init__方法中混淆太多的前期错误检查.如果有人提供了错误类型的对象,则代码将在正常事件过程中失败并通过正常方式引发正常异常.您不需要"预先筛选"对象.

  • 你能扩展"它太复杂了"吗?我一直遇到`assertRaises(assertionError,...)`(断言被提出,但没有被'assertRaises`捕获)的问题,知道为什么会有趣... (2认同)

nos*_*klo 1

首先,在 python 中检查错误参数并不是一个好主意。Python 是动态强类型的是有原因的。

你应该假设这些论据是好的论据。您永远不知道您的类的用户的意图,因此通过检查良好的参数是限制类在更通用的实例中使用的一种方法。

相反,使用文档字符串和文本定义一个好的 API 并很好地记录它,并将错误参数的错误自动传递给用户。

例子:

def sum_two_values(value_a, value_b):
    return value_a + value_b
Run Code Online (Sandbox Code Playgroud)

好吧,这个例子很愚蠢,但是如果我检查并断言该值是整数,那么该函数将无法处理浮点数、字符串、列表,除了我的检查之外没有任何原因,那么为什么要首先检查呢?对于无法工作的类型,它会自动失败,因此您不必担心。