views:

290

answers:

5

Can someone explain this result to me. The first test succeeds but the second fails, although the variable tested is changed in the first test.

>>> class MyTest(unittest.TestCase):
    def setUp(self):
     self.i = 1
    def testA(self):
     self.i = 3
     self.assertEqual(self.i, 3)
    def testB(self):
     self.assertEqual(self.i, 3)


>>> unittest.main()
.F
======================================================================
FAIL: testB (__main__.MyTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "<pyshell#61>", line 8, in testB
AssertionError: 1 != 3

----------------------------------------------------------------------
Ran 2 tests in 0.016s
A: 

If I recall correctly in that test framework the setUp method is run before each test

mmaibaum
+6  A: 

From http://docs.python.org/lib/minimal-example.html :

When a setUp() method is defined, the test runner will run that method prior to each test.

So setUp() gets run before both testA and testB, setting i to 1 each time. Behind the scenes, the entire test object is actually being re-instantiated for each test, with setUp() being run on each new instantiation before the test is executed.

pjz
A: 

The setUp method, as everyone else has said, runs before every test method you write. So, when testB runs, the value of i is 1, not 3.

You can also use a tearDown method which runs after every test method. However if one of your tests crashes, your tearDown method will never run.

Jon Homan
+4  A: 

Each test is run using a new instance of the MyTest class. That means if you change self in one test, changes will not carry over to other tests, since self will refer to a different instance.

Additionally, as others have pointed out, setUp is called before each test.

Sebastian Rittau
A: 

From a methodological point of view, individual tests should be independent, otherwise it can produce more hard-to-find bugs. Imagine for instance that testA and testB would be called in a different order.

Roman Plášil