标签: assertraises

assertRaises在python单元测试中没有捕获异常

有人可以告诉我为什么下面的单元测试在test_bad中的ValueError上失败了,而不是用assertRaises捕获它并成功吗?我想我正在使用正确的过程和语法,但ValueError没有被捕获.

我在Linux机器上使用Python 2.7.5.

这是代码......

import unittest

class IsOne(object):
    def __init__(self):
        pass
    def is_one(self, i):
        if (i != 1):
            raise ValueError

class IsOne_test(unittest.TestCase):

    def setUp(self):
        self.isone = IsOne()

    def test_good(self):
        self.isone.is_one(1)
        self.assertTrue(True)

    def test_bad(self):
        self.assertRaises(ValueError, self.isone.is_one(2))

if __name__ == "__main__":
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

这是单元测试的输出:

======================================================================
ERROR: test_bad (__main__.IsOne_test)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test/raises.py", line 20, in test_bad
    self.assertRaises(ValueError, self.isone.is_one(2))
  File "test/raises.py", line 8, in is_one
    raise ValueError
ValueError

----------------------------------------------------------------------
Ran 2 tests in 0.008s

FAILED (errors=1)
Run Code Online (Sandbox Code Playgroud)

python unit-testing assertraises

20
推荐指数
1
解决办法
2万
查看次数

使用unittest测试作业失败

我的一个属性是一个属性,其中setter调用验证函数,如果新值无效则引发异常:

pos.offset = 0
# @offset.setter calls validate(offset=0)
# PositionError: Offset may not be 0.
Run Code Online (Sandbox Code Playgroud)

我正在尝试添加测试以确保此操作失败.但是,我无法弄清楚如何让assertRaises与赋值一起工作.

assertRaises的正常语法需要一个方法,而不是一个属性/属性:

self.assertRaises(PositionError, pos.offset, 0)
# TypeError: 'int' object is not callable
Run Code Online (Sandbox Code Playgroud)

我尝试过的其他形式是无效的Python:

self.assertRaises(PositionError, pos.offset = 0)
# SyntaxError: Keyword can't be an expression
self.assertRaises(PositionError, lambda: pos.offset = 0)
# SyntaxError: lambda cannot contain assignment
Run Code Online (Sandbox Code Playgroud)

如何测试对属性的分配失败?

注意:Python 2.6,我知道unittest在2.7中有一些新功能

python unit-testing properties variable-assignment assertraises

12
推荐指数
2
解决办法
1895
查看次数

适当的Assert_Raise单元测试和异常类的使用

我正在练习练习49学习Ruby的艰辛之路

练习要求为所提供的每个功能编写单元测试.我正在测试的一个项目是,是否引发了适当的异常.建议我们assert_raise为此目的使用.

这是我正在测试的代码:

class ParserError < Exception

end

Pair = Struct.new(:token, :word)

def peek(word_list)
    begin
        word_list.first.token
    rescue
        nil
    end 
end

def match(word_list, expecting)
    word = word_list.shift
    if word.token == expecting
        word
    else
        nil
    end
end

def skip_word(word_list, token)
    while peek(word_list) == token
        match(word_list, token)
    end
end

def parse_verb(word_list)
    skip_word(word_list, :stop)

    if peek(word_list) == :verb
        return match(word_list, :verb)
    else
        raise ParserError.new("Expected a verb next.")
    end
end
Run Code Online (Sandbox Code Playgroud)

这是测试,对于函数parse_verb:

def test_parse_verb
    list_one = [Pair.new(:verb, 'go'), Pair.new(:noun, 'king')]
    assert_equal(parse_verb(list_one), Pair.new(:verb, 'go')) …
Run Code Online (Sandbox Code Playgroud)

ruby unit-testing assert assertraises learn-ruby-the-hard-way

9
推荐指数
1
解决办法
1万
查看次数

在Python中使用`assertRaises()`的自定义失败消息?

Python 2.7版单元测试文档说:

所有断言方法(除了assertRaises(),assertRaisesRegexp())接受一个msg论点,即,如果指定,则使用作为在发生故障时的错误消息

...但是如果我想为assertRaises()或指定错误消息assertRaisesRegexp()怎么办?

使用案例:在循环中测试各种值时,如果失败,我想知道哪一个:

NON_INTEGERS = [0.21, 1.5, 23.462, math.pi]

class FactorizerTestCase(unittest.TestCase):
    def test_exception_raised_for_non_integers(self):
        for value in NON_INTEGERS:
            with self.assertRaises(ValueError):
                factorize(value)
Run Code Online (Sandbox Code Playgroud)

如果其中任何一个失败,我得到:

AssertionError: ValueError not raised
Run Code Online (Sandbox Code Playgroud)

这对我来说找不到哪一个失败并没有太大帮助...如果我能提供msg=像我一样的论据assertEqual()等等!

(我当然可以将它们分解为单独的测试函数 - 但是我可能需要测试一些值,或者它需要一些缓慢/昂贵的设置,或者它是更长时间功能测试的一部分)

我很喜欢它,如果我可以很容易地得到它报告:

AssertionError: ValueError not raised for input 23.462
Run Code Online (Sandbox Code Playgroud)

- 但是要保证重新实现/扩展assertRaises()并在我的测试中添加更多代码也不是一件非常重要的事情.

python unit-testing assertraises python-unittest

7
推荐指数
1
解决办法
1743
查看次数

python单元测试用例中self.assertRaises未涵盖的异常声明

这是我的功能:

def get_value(request, param):
  s = get_string(request, param)
  value = re.search('(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)', s)
  if not value:
    print 'match not found!'  
    raise Exception('incorrect format: %s' % param)
Run Code Online (Sandbox Code Playgroud)

测试功能:

def test_get_value(self):
    m = test_mocks.HttpRequestMock(REQUEST = {'start_date': '2011.07.31'})
    print '*************************'
    print 'date format changed'
    self.assertRaises(Exception, get_value, (m, 'start_date'))
    print '*********************
Run Code Online (Sandbox Code Playgroud)

get_value不打印:匹配未找到!

python unit-testing assertraises

5
推荐指数
2
解决办法
1148
查看次数

如何使用assertRaises在Python中测试实例方法?

我理解如何assertRaises在函数或lambda上使用,但我想在实例方法上使用它.

因此,例如,如果我有一个calculator执行无限精度算术的类,我可能会编写测试:

def setUp(self):
    self.calculator = calculator.calculator()

def test_add(self):
    self.assertRaises(TypeError, self.calculator.add, ['hello', 4])
Run Code Online (Sandbox Code Playgroud)

因为self.calculator.add是可调用的并且['hello', 4]是我想传递它的参数,但是,当我运行测试时,我得到以下致命错误:

TypeError: add() missing 1 required positional argument: 'num2'
Run Code Online (Sandbox Code Playgroud)

我相信它会抛出这个错误,因为在self.assertRaises调用时self.calculator.add,self并没有像第一个调用那样传递,就像调用实例方法时一样.我该如何解决?

python unit-testing assertraises

5
推荐指数
2
解决办法
1637
查看次数

单元测试中的自定义异常

我在其中创建了自定义异常 errors.py

mapper = {
    'E101':
    'There is no data at all for these constraints',
    'E102':
    'There is no data for these constraints in this market, try changing market',
    'E103':
    'There is no data for these constraints during these dates, try changing dates',
}


class DataException(Exception):
    def __init__(self, code):
        super().__init__()
        self.msg = mapper[code]

    def __str__(self):
        return self.msg
Run Code Online (Sandbox Code Playgroud)

DataException如果数据pandas帧中没有足够的数据,代码中其他地方的另一个函数会引发不同的实例.我想用unittest它来确保它返回相应的异常及其相应的消息.

使用一个简单的例子,为什么这不起作用:

from .. import DataException
def foobar():
    raise DataException('E101')

import unittest
with unittest.TestCase.assertRaises(DataException):
    foobar()
Run Code Online (Sandbox Code Playgroud)

正如这里建议的那样:Python assertRaises用户定义的异常 …

python unit-testing assertraises python-3.x python-unittest

2
推荐指数
1
解决办法
2231
查看次数

assertRaises()在一个引发多个异常的测试用例中

是否可以将assertRaises与多种类型的异常一起使用.就像是

assertRaises(RuntimeError, "error message")
assertRaises(Exception, "exception message")
Run Code Online (Sandbox Code Playgroud)

这两个错误都发生在我的代码中,在同一个调用的不同地方.

我怎么能写一个singel assertRaises语句来处理这两个.

可以想象,当只提到其中一个execptions时,单元测试用例失败.

python unit-testing assertraises

2
推荐指数
1
解决办法
841
查看次数

Python self.assertRaises

我有一个如下的小代码,请帮助我以正确的方式写这个.我想检查ID是否存在value,如果不存在则会引发异常.

value = ({'av' : '123', 'user' : 'abc', 'version' : 'xyz'})

with self.assertRaises(IndexError, value[0]["ID"]):
    print "not an error"
Run Code Online (Sandbox Code Playgroud)

python unit-testing assertraises python-unittest

1
推荐指数
1
解决办法
4504
查看次数