tôi khuyên bạn sử dụng assert_raises
và assert_raises_regexp
từ nose.tools
, mà lặp lại trong các hành vi của assertRaises
và assertRaisesRegexp
từ unittest.TestCase
. Chúng cho phép sử dụng cùng chức năng như được cung cấp bởi unittest.TestCase
trong các bộ thử nghiệm không thực sự sử dụng lớp unittest.TestCase
.
Tôi thấy rằng @raises
là quá cùn một công cụ. Dưới đây là mã minh họa vấn đề:
from nose.tools import *
something = ["aaa", "bbb"]
def foo(x, source=None):
if source is None:
source = something
return source[x]
# This is fine
@raises(IndexError)
def test1():
foo(3)
# This is fine. The expected error does not happen because we made
# a mistake in the test or in the code. The failure indicates we made
# a mistake.
@raises(IndexError)
def test2():
foo(1)
# This passes for the wrong reasons.
@raises(IndexError)
def test3():
source = something[2] # This is the line that raises the exception.
foo(10, source) # This is not tested.
# When we use assert_raises, we can isolate the line where we expect
# the failure. This causes an error due to the exception raised in
# the first line of the function.
def test4():
source = something[2]
with assert_raises(IndexError):
foo(10, source)
test3
đèo, nhưng không phải vì foo
đã quyên góp được ngoại trừ chúng tôi mong đợi nhưng vì mã mà thiết lập các dữ liệu được sử dụng bởi foo
thất bại với cùng một ngoại lệ.test4
cho biết cách kiểm tra có thể được viết bằng cách sử dụng assert_raises
để thực sự kiểm tra những gì chúng tôi muốn thử nghiệm. Vấn đề trên dòng đầu tiên sẽ khiến Mũi báo cáo lỗi và sau đó chúng tôi có thể viết lại bài kiểm tra sao cho dòng đó để chúng tôi cuối cùng có thể kiểm tra những gì chúng tôi đã làm có nghĩa là để kiểm tra.
@raises
không cho phép kiểm tra thư được liên kết với ngoại lệ. Khi tôi nâng cao ValueError
, chỉ để lấy một ví dụ, tôi thường muốn nâng cao nó bằng một thông báo mang tính thông tin. Dưới đây là một ví dụ:
def bar(arg):
if arg: # This is incorrect code.
raise ValueError("arg should be higher than 3")
if arg >= 10:
raise ValueError("arg should be less than 10")
# We don't know which of the possible `raise` statements was reached.
@raises(ValueError)
def test5():
bar(10)
# Yes, we're getting an exception but with the wrong value: bug found!
def test6():
with assert_raises_regexp(ValueError, "arg should be less than 10"):
bar(10)
test5
trong đó sử dụng @raises
sẽ vượt qua, nhưng nó sẽ vượt qua với lý do sai lầm. test6
thực hiện một bài kiểm tra tốt hơn cho thấy rằng số ValueError
được nêu ra không phải là điều chúng tôi muốn.
gần như là một sự lừa đảo của http://stackoverflow.com/questions/11767938/how-to-use-noses-assert-raises – Stefano