Python中的assertRaises函数问题
我正在尝试运行以下测试
self.assertRaises(Exception,lambda:
unit_test.testBasic())
其中
test.testBasic()
是
class IsPrimeTest(unittest.TestCase):
def assertRaises(self,exception,callable,*args,**kwargs):
print('dfdf')
temp = callable
super().assertRaises(exception,temp,*args,**kwargs)
def testBasic_helper(self):
self.failIf(is_prime(2))
self.assertTrue(is_prime(1))
这里的prime是一个函数,而
但是在
self.assertRaises(Exception,lambda:
unit_test.testBasic())
这个lambda函数在测试失败后并没有抛出异常
def testBasic_helper(self):
self.failIf(is_prime(2))
self.assertTrue(is_prime(1))
有人能给我提供解决这个问题的方法吗?
我再试着解释一下我的问题,因为在我第一次发帖时没有解释清楚。
这里是源代码,is_prime(x)只是一个用来检查素数的函数
def is_prime(number):
PRIME, NOT_PRIME = not is_prime.broken, is_prime.broken
if number == 2:
return PRIME
if not isinstance(number, int) and not isinstance(number, float):
raise Exception
if number % 2 == 0 or number < 2 or isinstance(number, float):
return NOT_PRIME
max = int(number**0.5) + 1
for i in range(3, max, 2):
if number % i == 0:
return NOT_PRIME
return PRIME
is_prime.broken = False
class IsPrimeTest(unittest.TestCase):
def testBasic_helper(self): self.failIf(is_prime(1)) self.assertTrue(is_prime(2)) self.failIf(is_prime(4)) self.failIf(is_prime(6)) self.assertTrue(is_prime(7)) def testBasic(self): return self.testBasic_helper() def testNegative(self): self.failIf(is_prime(-2)) self.failIf(is_prime(-11 ** 3)) def testNonNumber(self): self.assertRaises(Exception,is_prime,'asd') self.assertRaises(Exception,is_prime,self.__class__.__name__) def testRandom(self): for i in range(0,10000): rand = randint(-10000,10000) self.assertEquals(prime(rand),is_prime(rand))
这里是测试,我们可以说这个测试是在测试一个程序,这个程序本身也是一个测试 - 就是对测试的测试。
class MetaProgrammingTest(unittest.TestCase):
def test_decorator(self):
from p10 import unit_converter
def celsius_function(val):
return val
self.assertTrue(hasattr(unit_converter(1,2),'__call__'))
decorated = unit_converter(1.8, 32)(celsius_function)
self.assertTrue(hasattr(decorated, '__call__'))
self.assertAlmostEquals(64.4, decorated(val = 18.0))
def test_unit_test(self):
import p10
from p10sample import is_prime as is_prime_actual
unit_test = p10.IsPrimeTest('testBasic')
unit_test.setUp()
is_prime_actual.broken = False
self.assertEquals(None, unit_test.testBasic())
self.assertEquals(None, unit_test.testNegative())
self.assertEquals(None, unit_test.testNonNumber())
self.assertEquals(None, unit_test.testRandom())
is_prime_actual.broken = True
self.assertRaises(Exception,lambda: unit_test.testBasic())
self.assertRaises(Exception, lambda: unit_test.testNegative())
self.assertRaises(Exception, lambda: unit_test.testRandom())
unit_test.tearDown()
我不能更改第二个测试 - 这个对测试的测试。
所以表达式self.assertRaises(Exception,lambda: unit_test.testBasic())必须保持不变。
我的问题是,当testBasic()函数失败时,比如我们有self.assertFailIf(is_prime(2)),self.assertFailIf抛出一个异常,unit_test.testBasic()也会把同样的异常抛到上层,但是lambda:unit_test.testBasic()却没有抛出异常,导致检查self.assertRaises(Exception,lambda: unit_test.testBasic())失败。
我的问题是如何让testBasic()函数能够让lambda: unit_test.testBasic()抛出异常,这样self.assertRaises就不会失败,有什么想法吗?
1 个回答
我理解你的意思是,你在问为什么在运行testBasic_helper方法时没有抛出异常,对吗?我觉得没有必要抛出异常,因为is_prime应该返回一个布尔值,测试就是用这个值来检查是否失败。如果测试失败了,那就直接失败了,你的代码和unittest框架都不会抛出异常。
顺便说一下,“unit_test.testBasic”本身就是一个可以调用的函数,"lambda: unit_test.testBasic()"是多余的,所以你可以直接写self.assertRaises(Exception, unit_test.testBasic)。