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