Let's assume we have smth like that :
让我们假设我们有这样的样子:
import py, pytestERROR1 = ' --- Error : value 10! ---'class MyError(Exception): def __init__(self, m): self.m = m def __str__(self): return self.mdef foo(i): if i 10: raise MyError(ERROR2) return i# ---------------------- TESTS -------------------------def test_foo1(): with pytest.raises(MyError) as e: foo(3) assert ERROR1 in str(e)def test_foo2(): with pytest.raises(MyError) as e: foo(11) assert ERROR2 in str(e)def test_foo3(): .... foo(7) ....Q: How can I make test_foo3() to test, that no MyError is raised? It's obvious, that i could just test :
问:如何让test_foo3()进行测试,没有引发MyError?很明显,我可以测试一下:
def test_foo3(): assert foo(7) == 7but i want to test that via pytest.raises(). Is is possible someway? For example: in a case, that function "foo" has no return-value at all,
但我想通过pytest.raises()测试。有可能吗?例如:在一个案例中,该函数“foo”根本没有返回值,
def foo(i): if i 10: raise MyError(ERROR2)it could make sense to test this way, imho.
imho,用这种方式测试是有意义的。
3 个解决方案
#1
50
A test will fail if it raises any kind of unexpected Exception. You can just invoke foo(7) and you will have tested that no MyError is raised. So, following will suffice:
如果引发任何意外的异常,测试将失败。你可以只调用foo(7),你将测试不会引发MyError。所以,以下就足够了:
def test_foo3(): foo(7)If you want to be explicit and write an assert statement for this, you can do:
如果你想明确并为此编写一个断言语句,你可以这样做:
def test_foo3(): try: foo(7) except MyError: pytest.fail("Unexpected MyError ..")#2
7
Building on top of what Oisin mentioned..
建立在Oisin提到的基础之上..
You can make a simple not_raises function that acts similar to pytest's raises:
你可以创建一个简单的not_raises函数,其作用类似于pytest的引发:
from contextlib import contextmanager@contextmanagerdef not_raises(exception): try: yield except exception: raise pytest.fail("DID RAISE {0}".format(exception))This is fine if you want to stick to having raises having a counterpart and thus your tests being more readable. In essence however you don't really need anything than just running the block of code you want to test on its own line - pytest will fail anyway as soon as that block raises an error.
如果你想坚持让对手加注,那么你的测试更具可读性。从本质上讲,除了运行你想要在自己的行上测试的代码块之外,你真的不需要任何东西 - 一旦该块引发错误,pytest就会失败。
#3
4
I was curious to see if a not_raises would work. A quick test of this is (test_notraises.py):
我很想知道not_raises是否有效。对此的快速测试是(test_notraises.py):
from contextlib import contextmanager@contextmanagerdef not_raises(ExpectedException): try: yield except ExpectedException, err: raise AssertionError( "Did raise exception {0} when it should not!".format( repr(ExpectedException) ) ) except Exception, err: raise AssertionError( "An unexpected exception {0} raised.".format(repr(err)) )def good_func(): print "hello"def bad_func(): raise ValueError("BOOM!")def ugly_func(): raise IndexError("UNEXPECTED BOOM!")def test_ok(): with not_raises(ValueError): good_func()def test_bad(): with not_raises(ValueError): bad_func()def test_ugly(): with not_raises(ValueError): ugly_func()It does seem to work. However I'm not sure if it really reads well in the test.
它确实有效。但是我不确定它在测试中是否真的很好。