Ping a network using threads and testing it
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 gi开发者_JAVA技巧ves no response and to run two tests for the 2 networks to be pinged. Does anyone know where I have gone wrong?
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.
精彩评论