【问题标题】:Raise ValueError not getting through unit test提高 ValueError 未通过单元测试
【发布时间】:2021-08-16 10:01:37
【问题描述】:

我正在尝试使用下面的代码在值为负数时引发值错误。

添加了一个 raise 错误:number 应该大于 0 但是当我运行下面的代码时:

from functools import reduce
import math
import unittest

def calculate_factorial(number):
    if number < 0:
        print('about to throw value error')
        raise ValueError('number should be greater than 0')
    elif type(number) != int:
        raise  TypeError('number should be an integer type')
    else:
        data = []
        for i in range(number):
            data.append(number - i)
            print(data)
        results = reduce((lambda x, y: x * y), data, 1)
        return results

class TestCalc(unittest.TestCase):
    def test_factorial(self):
        print('Function is starting to check for values')
        print()
        result = calculate_factorial(n)
        print('results are:',result)
        print()
        self.assertEqual(result,math.factorial(n))
        
        
    def test_n(self):
        print('The value of n taken by the class function is:',n)
        

run = True
while run:
    n = int(input('Enter an integer value: '))
    if n != -9999:
        unittest.main(argv=[''], verbosity=2, exit=False)
    else:
        run = False

我收到如下错误。我可以在下面看到我的 raise 值正在通过,但不知何故测试类没有考虑它。

test_factorial (__main__.TestCalc) ... ERROR
test_n (__main__.TestCalc) ... ok

======================================================================
ERROR: test_factorial (__main__.TestCalc)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "<ipython-input-3-d89c3d44c70d>", line 5, in test_factorial
    result = calculate_factorial(n)
  File "<ipython-input-2-2ad930b1e911>", line 5, in calculate_factorial
    raise ValueError('number should be greater than 0')
ValueError: number should be greater than 0

----------------------------------------------------------------------
Ran 2 tests in 0.010s

FAILED (errors=1)

【问题讨论】:

  • 你能解释一下你的期望吗?测试test_factorial 失败,如果由于引发ValueError 而出现负数。
  • @SvenEberth 我希望测试能够通过,因为如果数字为负数,我会提高值错误,但正如您从上面看到的那样,在这种情况下测试失败,即使我可以看到我的加薪值错误值
  • 这不是单元测试的工作方式。对于测试用例,这里的异常是意外的。但是您可以添加if number &lt; 0assertRaises(ValueError) 来正确处理这种情况。
  • 如果我正确理解您的需求,我相信您需要在输入为负数时使用 assertRaises。查看这个问题的答案:stackoverflow.com/questions/129507/…
  • @SvenEberth 你的意思是我应该在我的第一个 if 语句下添加 assert_raises(ValueError) 吗?如果你可以分享代码,它没有工作是可能的

标签: python unit-testing raiserror


【解决方案1】:

正如我在 cmets 中已经提到的,您的测试失败了,因为这里不期望出现 ValueError。 您可以使用 if 扩展您的测试,以不同方式处理正值和非正值。

class TestCalc(unittest.TestCase):
    def test_factorial(self):
        print('Function is starting to check for values')
        print()
        if n < 0:
            with self.assertRaises(ValueError) as context:
                calculate_factorial(n)
            self.assertEqual('number should be greater than 0', str(context.exception))
        else:
            result = calculate_factorial(n)
            print('results are:', result)
            print()
            self.assertEqual(result, math.factorial(n))

    def test_n(self):
        print('The value of n taken by the class function is:', n)

但是,最好对不同的值范围/种类进行不同的测试,并使用如下固定值:

class TestCalcFixedValues(unittest.TestCase):
    def test_factorial_positive(self):
        self.assertEqual(calculate_factorial(42), math.factorial(42))

    def test_factorial_negative(self):
        with self.assertRaises(ValueError) as context:
            calculate_factorial(-42)
        self.assertEqual('number should be greater than 0', str(context.exception))

    def test_factorial_NaN(self):
        with self.assertRaises(TypeError) as context:
            calculate_factorial("NaN")
        self.assertEqual('number should be an integer type', str(context.exception))

(然后你会看到,calculate_factorial 有一个错误;))

【讨论】:

  • 哦,太好了,因为我是新手,想确认这是否是您使用的逻辑:您使用了我的函数中的 raise value error 并将其与 ValueError 生成的 ValueError 字符串进行了比较, 默认情况下 ValueError 显示不同的错误描述(取决于条件),但由于我已将 ValueError 设置为“数字应大于 0”,因此 assert_raises 的 ValueError 将与我的 ValueError 值进行比较,即数字应大于 0 [如果 n
  • 还有为什么我们不把self.assertEqual('number should be greater than 0', str(context.exception))放在with下面
  • 1) 正确 2) 因为这里calculate_factorial() 失败(引发异常),所以 with 块中这行之后的代码不会被执行。您可以在此之后添加print("Hello"),然后会看到它永远不会被打印出来。
  • 是的,谢谢您确认代码。
猜你喜欢
  • 2014-03-02
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 2021-05-18
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多