Проблема с функцией assertRaises в Python - PullRequest
0 голосов
/ 25 мая 2010

Я пытаюсь запустить следующий тест

 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))

, где простое число является функцией, а

но в

self.assertRaises(Exception,lambda:
unit_test.testBasic())

лямбда-функция не выдает исключение после тест

def testBasic_helper(self):

   self.failIf(is_prime(2))
   self.assertTrue(is_prime(1))

терпит неудачу Может кто-нибудь предложит решение проблемы?


Я попытаюсь объяснить мою проблему, опять же, потому что в моем первом посте я не очень хорошо объяснил это Так вот источник is_prime (x) - это просто функция для проверки простых чисел

def is_prime (число): PRIME, NOT_PRIME = не is_prime.broken, is_prime.broken если число == 2: возврат ПРАЙМ

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

класс 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))

а вот Test, мы можем сказать, что тест тестирует программу, которая является тестом - тест над тестом

класс MetaProgrammingTest (unittest.TestCase): def test_decorator (self): из 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 (Исключение, лямбда: unit_test.testBasic ()) должен оставаться без изменений Моя проблема заключается в том, что при сбое функции testBasic (), например, если у нас есть self.assertFailIf (is_prime (2)), self.assertfailIf генерирует исключение, unit_test.testBasic () выдает то же исключение в верхнюю область, но lambda: unit_test.testBasic () не выдает исключение и чек self.assertRaises (Исключение, лямбда: unit_test.testBasic ()) терпит неудачу Мой вопрос заключается в том, как заставить функцию testBasic () сделать так, чтобы lambda: unit_test.testBasic () испортила исключение, а selfassertRaises не провалилось, какие-либо идеи?

1 Ответ

1 голос
/ 25 мая 2010

Правильно ли я вас понимаю, поскольку вы спрашиваете, почему метод testBasic_helper не вызывает исключение при выполнении теста? Я не понимаю, почему это так, is_prime должен возвращать значение bool, по которому тест проверяет наличие ошибок. Если тест не пройден, он просто не пройден, ни ваш код, ни инфраструктура unittest не выдают исключение.

P.S. «unit_test.testBasic» уже вызывается, «lambda: unit_test.testBasic ()» является излишним, поэтому вы можете просто написать self.assertRaises (Exception, unit_test.testBasic).

...