Reputation: 11
I've searched through StackOverflow Q&As on assertRaises to identify what I'm doing wrong. As I still don't understand what the problem is, I wanted to pose my own question to get a specific answer.
I have two different calculator programmes for which I have created unit tests with the unittest module. The unit test for programme A works with assertRaises whereas using assertRaises in B produces an ERROR.
What is the difference between A and B with reference to assertRaises?
A code:
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 code:
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)
Why does A work without ERRORS whereas B produces the following output:
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)
Upvotes: 0
Views: 83