让我们假设我们有这样的结果:
import py, pytest
ERROR1 = ' --- Error : value < 5! ---'
ERROR2 = ' --- Error : value > 10! ---'
class MyError(Exception):
def __init__(self, m):
self.m = m
def __str__(self):
return self.m
def foo(i):
if i < 5:
raise MyError(ERROR1)
elif 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(): …Run Code Online (Sandbox Code Playgroud) 在Python unittest框架中,如果没有引发异常,有没有办法传递单元测试,否则会出现AssertRaise失败?
我知道unittestPython模块.
我知道课堂的assertRaises()方法TestCase.
我想编写一个在未引发异常时成功的测试.
有什么提示吗?
我正在numpy.testing.assert_almost_equal单元测试环境中使用 - 但我不确定结合 numpy 和单元测试的正确方法是什么。
我的第一个方法是使用单元测试中的assertTrue并结合is None如下比较:
from unittest import TestCase
import numpy as np
class TestPredict(TestCase):
def test_succeeding(self):
self.assertTrue(
np.testing.assert_almost_equal(1, 0.9999999999999) is None
)
def test_failing(self):
self.assertTrue(
np.testing.assert_almost_equal(1, 0.9) is None
)
Run Code Online (Sandbox Code Playgroud)
这给出了正确的测试结果,但它有点 hacky 并且使测试代码变得臃肿。
更简单的方法如下:
from unittest import TestCase
import numpy as np
class TestPredict(TestCase):
def test_succeeding(self):
np.testing.assert_almost_equal(1, 0.9999999999999)
def test_failing(self):
np.testing.assert_almost_equal(1, 0.9)
Run Code Online (Sandbox Code Playgroud)
此代码还返回正确的测试统计信息,如上面所示,但它更具可读性。我看到的唯一缺点是 pylint 抱怨“R0201 方法可能是一个函数”消息。这会成为一个问题吗?
PS:我在这里检查了多篇看起来相关的帖子,但没有回答我关于单元测试和 numpy 测试集成的具体问题。(例如/sf/answers/302390931/讨论了在单元测试中捕获异常。这似乎是错误的,或者只是一种矫枉过正。)
在严格的测试驱动开发方法中,每个步骤都需要事先进行测试.即使是一个类或它的方法的存在 - 严格来说 - 在实际创建之前要进行测试.
我有一个问题是进行写测试以查看方法是否存在.
class BasicTests(unittest.TestCase):
def setUp(self):
self.test = RandomGenClass()
def testRandomGenClassExists(self):
""" Does the class exist? """
self.assert_(self.test is not None)
def testMyMethodExists(self):
""" Does MyMethod() exist?"""
result = self.test.myMethod()
self.assert_(result is not None)
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,如果该类不存在,Python就已经失败了.测试永远不会断言.有没有更好的方法来实现这一目标?