0

我在 assertRaises 上搜索了 StackOverflow Q&As,以确定我做错了什么。由于我仍然不明白问题是什么,我想提出自己的问题以获得具体答案。

我有两个不同的计算器程序,我使用 unittest 模块为其创建了单元测试。程序 A 的单元测试使用 assertRaises,而在 B 中使用 assertRaises 会产生错误。

参考 assertRaises,A 和 B 有什么区别?

一个代码:

import unittest

class Calculator:       
    def __init__(self):
        pass

    def add(self, a, b):
        return a + b
    def sub(self, a, b):
        return a - b
    def mul(self, a, b):
        return a * b
    def div(self, a, b):
        if b == 0:
            raise ZeroDivisionError("The divisor must not be zero.")
        else:
            return a / b

class TestCalculator(unittest.TestCase):  
    def test_add(self):
           #Test case function for addition
        self.calc = Calculator()
        result = self.calc.add(4, 7)
        expected = 11
        self.assertEqual(result, expected)

    def test_sub(self):
           #Test case function for subtraction
        self.calc = Calculator()
        result = self.calc.sub(10, 5)
        expected = 5
        self.assertEqual(result, expected)

    @unittest.skip('Some reason')
    def test_mul(self):
           #Test case function for multiplication
        self.calc = Calculator()
        result = self.calc.mul(3, 7)
        expected = 21
        self.assertEqual(result, expected)

    def test_div(self):
           #Test case function for division
        self.calc = Calculator()
        result = self.calc.div(10, 2)
        expected = 5
        self.assertEqual(result, expected)
        self.assertRaises(ZeroDivisionError, self.calc.div, 10, 0)   # ??
    

unittest.main(argv=[''], verbosity=2, exit=False)   

B代码:

import unittest 

# Creates unit tests for a calculator that only summarises numbers.                       
class CalculatorTestCase(unittest.TestCase):  
   
    def test_calculator_returns_correct_sum(self): # Checks that the calculator works properly.   
        self.assertEqual(calculator(1, 3), 4, msg = "Inaccurate Result")
        self.assertEqual(calculator(1, -3), -2, msg= "Inaccurate Result")

 
    def test_calculator_rejects_invalid_arguments(self):   # Wants the calculator to raise TypeError when the input values for num1 and num2 are anything but two integers.
        self.assertRaises(TypeError, calculator("one", "two"))
        self.assertRaises(TypeError, calculator(1, "two"))
        self.assertRaises(TypeError, calculator("one", 2))
        self.assertRaises(TypeError, calculator(1.0, "two"))
        self.assertRaises(TypeError, calculator("one", 2.0))
        self.assertRaises(TypeError, calculator(1.0, 2.0))
        self.assertRaises(TypeError, calculator(1, 2.0))
        self.assertRaises(TypeError, calculator(1.0, 2))

                          # The calculator #
def calculator(num1, num2): 
    if isinstance(num1, int) and isinstance(num2, int): # summarise num1 and num2 only if both arguments are integers...
        return num1+num2
    else:
        raise TypeError("Arguments num1 and num2 must be integers.")
# ... otherwise "TypeError" is raised and this will be in line with the test_calculator_rejects_invalid_argument test.

if __name__ == "__main__":
    num1 = 1
    num2 = 3
    print(calculator(num1, num2))
    #unittest.main()
    unittest.main(argv=[''], verbosity=2, exit=False) 

为什么 A 在没有错误的情况下工作,而 B 产生以下输出:

test_calculator_rejects_invalid_arguments (__main__.CalculatorTestCase) ... ERROR
test_calculator_returns_correct_sum (__main__.CalculatorTestCase) ... ok

======================================================================
ERROR: test_calculator_rejects_invalid_arguments (__main__.CalculatorTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\Users\XXXXX\.vscode\YY_ZZ\Calculator_project\calculator.py", line 12, in test_calculator_rejects_invalid_arguments
    self.assertRaises(TypeError, calculator("one", "two"))
  File "c:\Users\XXXXX\.vscode\YY_ZZ\Calculator_project\calculator.py", line 26, in calculator
    raise TypeError("Arguments num1 and num2 must be integers.")
TypeError: Arguments num1 and num2 must be integers.

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (errors=1)
4

0 回答 0