views:

112

answers:

1

I am trying to ping two different networks with thread. I am able to get the response I want but I want to convert it into a test. I have the code that I have tried below but the test runner says that no tests were run. The code is below:

#!/home/workspace/downloads/Python-2.6.4/python
from threading import Thread 
import subprocess, unittest
from Queue import Queue 


class TestPing(unittest.TestCase):
    num_threads = 4 
    queue = Queue() 
    ips = ["10.51.54.100", "10.51.54.122"] 
    #wraps system ping command 
    def RunTest(i, q): 
        """Pings subnet""" 
        while True: 
            ip = q.get() 
            print "Thread %s: Pinging %s" % (i, ip) 
            ret = subprocess.call("ping -c 1 %s" % ip, 
                            shell=True, 
                            stdout=open('/dev/null', 'w'), 
                            stderr=subprocess.STDOUT) 
            if ret == 0: 
                print "%s: is alive" % ip
                assert True 
            else: 
                print "%s: did not respond" % ip 
                assert False
            q.task_done() 
        #Spawn thread pool 
        for i in range(num_threads): 

            worker = Thread(target=pinger, args=(i, queue)) 
            worker.setDaemon(True) 
            worker.start() 
            #Place work in queue 
        for ip in ips: 
            queue.put(ip) 
        #Wait until worker threads are done to exit     
            queue.join()


class PingTestSuite(unittest.TestSuite):

    def makePingTestSuite():
        suite = unittest.TestSuite()
        suite.addTest(TestPingMove("TestPing"))
        return suite

    def suite():
        return unittest.makeSuite(TestPing)

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

I want the test to assert either true and false if a network gives no response and to run two tests for the 2 networks to be pinged. Does anyone know where I have gone wrong?

+3  A: 

When you subclass unittest.TestCase, all methods whose name begins with test, get run automatically. Otherwise, the code is not run as a test. (So RunTest is not getting run).

So if you change RunTest to (the not so mellifluous) test_RunTest:

class TestPing(unittest.TestCase):
    def test_RunTest(self):
         add code here

then the code will run. Also note, that unittest expects test_RunTest's first and only argument to be self.

If you want to test that func(args) raises an error, then use self.assertRaises like this:

self.assertRaises(AssertionError, func, args)

Or, if func returns True or False, then you can tests that the proper value is returned by using self.assertTrue or self.assertFalse.

Also, when you write unit tests, it would be wise to place all your functions/classes in a module, import the module for the unittest script, and then test that the functions are returning or raising what you expect in the unittest script. I could be wrong, but it seems as though at the moment you have the two pieces mixed together.

unutbu