有人可以告诉我为什么下面的单元测试在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) 我的一个属性是一个属性,其中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
练习要求为所提供的每个功能编写单元测试.我正在测试的一个项目是,是否引发了适当的异常.建议我们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
所有断言方法(除了
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()并在我的测试中添加更多代码也不是一件非常重要的事情.
这是我的功能:
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不打印:匹配未找到!
我理解如何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并没有像第一个调用那样传递,就像调用实例方法时一样.我该如何解决?
我在其中创建了自定义异常 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用户定义的异常 …
是否可以将assertRaises与多种类型的异常一起使用.就像是
assertRaises(RuntimeError, "error message")
assertRaises(Exception, "exception message")
Run Code Online (Sandbox Code Playgroud)
这两个错误都发生在我的代码中,在同一个调用的不同地方.
我怎么能写一个singel assertRaises语句来处理这两个.
可以想象,当只提到其中一个execptions时,单元测试用例失败.
我有一个如下的小代码,请帮助我以正确的方式写这个.我想检查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)