Skip to main content

Extract more information from your Python unittests

Hi guys, I know you love to write your unittest with python unittest module since its so easy and fun .
But sometimes we need to have a little more information than usual. This article is for those who want to use the powers of unittest module to get better control. Have more decision variables to play with.


I am going to use the below test script for reference.



import unittest

class TestExample(unittest.TestCase):
    def setUp(self):
        self.name = 'Python'
    def test_title(self):
        self.assertTrue(self.name.istitle(), 'Name not a title')
    def test_string(self):
        self.assertTrue(isinstance(self.name, str), 'self.name variable is not a string')
    def test_capital(self):
        self.assertEqual(self.name, self.name.capitalize(), 'Name not in capital')





Case 1:  Find number of test cases in your test script.



if __name__ == '__main__':
    # Creating a TestSuite object
    test_suite = unittest.TestLoader().loadTestsFromTestCase(TestExample)  
    # Creating a TestResult Object
    test_result = unittest.TextTestRunner(verbosity=2).run(test_suite)
    print test_suite.countTestCases()





   

You can also use the TestResult object to get the same.

   print 'No of test run : ', test_result.testsRun  # Note the value depends on how many tests have been run.


Case 2:  Test passed or failed ? Full and final result.

You might sometimes just want to get a single final result. Whether the test passed or failed.
Change the last line in above program to look like this.


if __name__ == '__main__':
    test_suite = unittest.TestLoader().loadTestsFromTestCase(TestExample)
    test_result = unittest.TextTestRunner(verbosity=2).run(test_suite)
    print "The test was:", test_result.wasSuccessful()


       

Output is a Boolean




test_capital (__main__.TestExample) ... ok
test_string (__main__.TestExample) ... ok
test_title (__main__.TestExample) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.017s

OK
Result is: True


Case 3:  Collect failure and error cases with details


Lets fail some test cases intentionally...change the self.name = 'python' . This will fail 2 tests.

The test_result.failures is a list of tuple. Each tuple has an object, and a trace back.

Lets say we just want names of the failed tests.


if test_result.wasSuccessful():

        pass

    elif test_result.failures:

        print 'These tests failed !'

        for test_case, traceback in test_result.failures:

            print 'Test case:', test_case

            #print 'Traceback info:', traceback


   

Output looks like this. (Note: Showing here only relevant lines of the output):




FAILED (failures=2)
No of test run: 3
These tests failed !
Test case: test_capital (__main__.TestExample)
Test case: test_title (__main__.TestExample)

The Complete code


if __name__ == '__main__':
    test_suite = unittest.TestLoader().loadTestsFromTestCase(TestExample)
    print 'No of test cases in test suite', test_suite.countTestCases()
    test_result = unittest.TextTestRunner().run(test_suite)  # test_result is a TextTestResult instance
   
    if test_result.wasSuccessful():
        pass
    elif test_result.failures or test_result.errors:
        print '%d Test failed!' % len(test_result.failures)
        print '%d Test with errors!' % len(test_result.errors)
        for test_case, traceback in test_result.failures:
            print 'Failed test case name:', str(test_case).split(' ')[0]
            #print traceback

        for test_case, traceback in test_result.errors:
            print 'Test case:', str(test_case).split(' ')[0]
            #print traceback

    if test_result.skipped:
        print "Test cases skipped", test_result.skipped





Final Result:


>>>
No of test cases in test suite 3
F.s
======================================================================
FAIL: test_capital (__main__.TestExample)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "D:\inchowar\Desktop\test_example.py", line 17, in test_capital
    self.assertEqual(self.name, self.name.capitalize(), 'Name not in capital')
AssertionError: Name not in capital

----------------------------------------------------------------------
Ran 3 tests in 0.002s

FAILED (failures=1, skipped=1)
No of test run: 3
1 Test failed!
0 Test with errors!
Failed test case name: test_capital
Test cases skipped [(<__main__.TestExample testMethod=test_title>, 'Example skip')]


Case 4: Get the name of the test running

There might be some situation when you need the name of the test running. (I needed the name so I can use it to create a log file with name of the test case).

self._testMethodName

Example:


import unittest

class TestName(unittest.TestCase):
    def test_1(self):
        print self._testMethodName

    def test_2(self):
        print self._testMethodName

if __name__ == '__main__':
    unittest.main()

Output:


test_1
.test_2
.
----------------------------------------------------------------------
Ran 2 tests in 0.010s

OK
>>> 


Popular posts from this blog

Why should you visit Kashmir sooner?

"If there is paradise on Earth, this is it"
And paradise it was . Early winter is the perfect time to plan for a visit to Kashmir. We will suggest to keep your itinerary  short . And enjoy the best trip of your life. 

   My Visit Month : Mid November 2015

As we were flying close to Srinagar, about 20 minutes before landing , all of a sudden , every passenger in the aircraft was on his toes craning theirs necks over the tiny window to catch a glimpse of the above. A fleet of Snow Giants.


   Visit Meena Bazaar in Dal Lake
  You will find a floating village with houses , shops, and hotels on all kinds of boats.


    A night on a House Boat




Take a Shikara ride.Watch the super clear reflection of the mountain. Spot fishes and water birds.



Take a 2 day stay in Pahalgam. Visit Mini Switzerland first day on a horse ride.


Visit Sonemarg. Enjoy the snow.



On your way to Pahalgam, visit apple orchids . Taste all kind of apples. The golden ones are supposed to be the best.



The dark ominous mou…

Kerala : How to plan for a lifetime's experience

I have been planning this for months and it finally came along in the best time. A full stretch Kerala trip with Kanyakumari as an added bonus. I will not tell you what to do, but HOW to do it. How to plan your dream Kerala Trip. 

Caution: Mine was too comprehensive. Needs high energy and will be quite tiring. 

I chose the monsoon theme..I wanted to be in the middle of the action. This is the only place in India which offers monsoon as a tourism opportunity. I was lucky. I expected super heavy rains. Instead. I ended up right in between the rainy season and summer which was Perfect.

Advantages in travelling in mid AugustRainfall almost over.Waterfalls at their fullest.Greenery all over the state.Backwaters, beach sides and rivers all very clean.Abundant coconuts to enjoy.Hotel rates brought down.Less crowd everywhere.Festive Preparation going on.Shopping becomes pocket friendly.Our route map:






Day 1 Day 2 Day 3 Day 4 Day 5 Day 6

CNTLM in Office

If you are facing a proxy problem , CNTLM is a general option everybody considers. But the working of CNTLM is not always guaranteed. I myself get confused every time I need to use it.

What problem are we actually talking about?

While working in offices and restricted environments where firewalls and other invisible barriers stop your requests from going out, you sometimes need a way to temporarily jump over that barrier to get your job done . Example: You might face them while trying to install using pip in command line, trying to clone a personal git repository. 

What is CNTLM exactly?

I think this is best answered by the creator himself. Refer this. You can download it from here. For configuration, you an refer this. There are many uses of CNTLM but I am trying to solve my own problem here. So I will stick to breaking office barriers for now ;) .

Why do I need to use it :
1) Python package installations using PIP
2) Git operations : Cloning and pushing to server.

Here are a set of steps I …