我做了一个简单的测试用例:
def setUp(self):
self.testListNone = None
def testListSlicing(self):
self.assertRaises(TypeError, self.testListNone[:1])
Run Code Online (Sandbox Code Playgroud)
我期待测试通过,但我得到例外:
Traceback (most recent call last):
self.assertRaises(TypeError, self.testListNone[:1])
TypeError: 'NoneType' object is unsubscriptable
Run Code Online (Sandbox Code Playgroud)
我认为assertRaises会通过,因为会引发TypeError异常?
有人可以告诉我为什么下面的单元测试在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) 无论我做什么,sys.exit()都由unittest调用,即使是最琐碎的例子.我无法判断我的安装是否搞砸了或者发生了什么.
IDLE 1.2.2 ==== No Subprocess ====
>>> import unittest
>>>
>>> class Test(unittest.TestCase):
def testA(self):
a = 1
self.assertEqual(a,1)
>>> unittest.main()
option -n not recognized
Usage: idle.pyw [options] [test] [...]
Options:
-h, --help Show this message
-v, --verbose Verbose output
-q, --quiet Minimal output
Examples:
idle.pyw - run default set of tests
idle.pyw MyTestSuite - run suite 'MyTestSuite'
idle.pyw MyTestCase.testSomething - run MyTestCase.testSomething
idle.pyw MyTestCase - run all 'test*' test methods
in MyTestCase
Traceback (most recent call last):
File …Run Code Online (Sandbox Code Playgroud) 我想测试是否有异常,我该怎么办?
在我的models.py我有这个函数,我要测试的那个:
def validate_percent(value):
if not (value >= 0 and value <= 100):
raise ValidationError('error')
Run Code Online (Sandbox Code Playgroud)
在我的tests.py中我试过这个:
def test_validate_percent(self):
self.assertRaises(ValidationError, validate_percent(1000))
Run Code Online (Sandbox Code Playgroud)
测试的输出是:
..E
======================================================================
ERROR: test_validate_percent (tm.tests.models.helpers.HelpersTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/...py", line 21, in test_validate_percent
self.assertRaises(ValidationError, validate_percent(1000))
File "/....py", line 25, in validate_percent
raise ValidationError(u'error' % value)
ValidationError: ['error']
Run Code Online (Sandbox Code Playgroud) 我试图使用unittest在Python中进行一个简单的测试,看看如果一个类在构造函数中获得不合适的输入时是否抛出异常.这个类看起来像这样:
class SummaryFormula:
def __init__( self, summaryFormula):
self.atoms = {}
for atom in re.finditer( "([A-Z][a-z]{0,2})(\d*)", summaryFormula):
symbol = atom.group(1)
count = atom.group(2)
if pocet != "":
self.atoms[ symbol] = int(count)
else:
self.atoms[ symbol] = 1
Run Code Online (Sandbox Code Playgroud)
我的测试如下:
class ConstructorTestCase(unittest.TestCase):
def testEmptyString(self):
self.assertRaises(TypeError, ukol1.SummaryFormula(), "testtest")
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
我想要的只是测试失败,这意味着不处理构造函数的不合适输入的异常.
相反,我得到一个错误:__init__() takes exactly 2 arguments (1 given).
我错过了什么?我应该指定的第二个参数是什么?
另外,我应该使用什么类型的错误来处理异常,即我的regexp无法匹配的输入被传递给构造函数?
托马斯,谢谢你
我已经阅读了这个问答,并且已经尝试在我的代码上捕获异常,这会引发IntegrityError异常,这样:
self.assertRaises(IntegrityError, db.session.commit())
Run Code Online (Sandbox Code Playgroud)
但不知何故,我的单元测试仍然失败并因IntegrityError异常而停止.我希望它说好,因为我已经预计在我的单元测试中会有异常.这是由于代码尝试插入具有相同唯一字段值的行.
任何的想法?
我正在为 api 进行几个单元测试。测试使用 @patch 来模拟 api 调用。我希望创建的一些测试应该会触发异常。我如何在单元测试中处理这个问题?
这是我到目前为止所拥有的。Pylint 抱怨 assertTrue() 语句。我确信有更好的方法来处理异常。
@patch('myapi.myapi.requests.request')
def test_auth_failure(self, mock_request):
# Configure the request mock to return an auth failure
# Auth/login (/session) failures return status 200, but without a token!
mock_request.return_value.status_code = 200
mock_request.return_value.content = json.dumps(self.mock_auth_failure)
try:
# Call auth()
self.api.auth()
# Exception should have been raised
self.assertTrue(False)
except exceptions.HTTPUnauthorized:
# Exception caught
self.assertTrue(True)
Run Code Online (Sandbox Code Playgroud)
附加信息:这是从unittest.TestCase 扩展的类中。例子:
class MyApiTests(unittest.TestCase):
Run Code Online (Sandbox Code Playgroud) 我是python的新手。我想测试我的代码是否抛出异常。我从这里得到了代码:你如何测试 Python 函数抛出异常?
import mymod
import unittest
class MyTestCase(unittest.TestCase):
def test1(self):
self.assertRaises(SomeCoolException, mymod.myfunc, compulsory_argument)
Run Code Online (Sandbox Code Playgroud)
现在,如果没有抛出异常,我还想显示一条消息。我怎么做 ?python 文档没有明确提到它。我在“compulsory_argument”之后添加了消息,但失败了。
编辑:我尝试了第一个修改后的答案并得到了一个例外。我的错误是什么?
import unittest
def sayHelloTo(name):
print("Hello " + name)
class MyTestCase(unittest.TestCase):
def test1(self):
person = "John"
with self.assertRaises(Exception, "My insightful message"):
sayHelloTo(person)
Run Code Online (Sandbox Code Playgroud)
错误:
Error
Traceback (most recent call last):
File "C:\tests\tester.py", line 9, in test1
with self.assertRaises(Exception, "My insightful message"):
AttributeError: __exit__
Run Code Online (Sandbox Code Playgroud) python ×8
unit-testing ×6
assertraises ×1
django ×1
exception ×1
python-3.x ×1
sqlalchemy ×1
testing ×1