Writing tests for functions and classes in Python

Here's a simple example code that I wrote to test a mathOps class in Python. I use the unittest package which is part of the Python Standard Library.

As you can see, the mathOps class has two attributes, a,b, and there are methods defined that take care of addition, subtraction, multiplication and division. Now, I want to write a code, that tests mathOps class objects to make sure that the methods are giving the output we desire.

One interesting thing to note is the last function/test defined in the mathOpsTest class. The decorator @unittest.expectedFailure tells the testing framework that this test is expected to fail, given that we're passing vectors/arrays to the add method, expecting it to perform vector addition, where as the add method expects input of type Float. The traits package does this type-checking to make sure that the inputs we give are of the right kind!


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import unittest
from traits.api import HasTraits, Float


class mathOps(HasTraits):
    a = Float
    b = Float

    def add(self, a, b):
        self.a = a
        self.b = b

        return self.a +self.b

    def sub(self, a, b):
        self.a = a
        self.b = b

        return self.a -self.b

    def mul(self, a, b):
        self.a = a
        self.b = b

        return self.a*self.b

    def div(self, a, b):
        self.a = a
        self.b = b

        return self.a/self.b

class mathOpsTest(unittest.TestCase):
    obj = mathOps()

    def test_add(self):
        self.assertEqual(self.obj.add(1,1), 2)
        self.assertEqual(self.obj.add(1,2.0), 3.0)
        self.assertEqual(self.obj.add(3.0,1), 4.0)
        self.assertEqual(self.obj.add(5.0,6.0), 11.0)

    def test_sub(self):
        self.assertEqual(self.obj.sub(1,1), 0)
        self.assertEqual(self.obj.sub(1,2.0), -1.0)
        self.assertEqual(self.obj.sub(3.0,1), 2.0)
        self.assertEqual(self.obj.sub(4.0,8.0), -4.0)

    def test_mul(self):
        self.assertEqual(self.obj.mul(1,1), 1)
        self.assertEqual(self.obj.mul(1,2.0), 2.0)
        self.assertEqual(self.obj.mul(4.0,2), 8.0)
        self.assertEqual(self.obj.mul(3.0,7.0), 21.0)

    def test_div(self):
        self.assertEqual(self.obj.div(1,1), 1)
        self.assertEqual(self.obj.div(1.0,2), 0.5)
        self.assertEqual(self.obj.div(1,10.0), 0.1)
        self.assertEqual(self.obj.div(1.0,5.0), 0.2)

    @unittest.expectedFailure
    def test_vector_add(self):
        self.assertIsInstance(self.a, )
        self.assertEqual(self.obj.add([1,1],[1,1]),[2,2])

Popular posts from this blog

Animation using GNUPlot

Pandas download statistics, PyPI and Google BigQuery - Daily downloads and downloads by latest version

Adaptive step size Runge-Kutta method