使用线程对网络进行Ping并对其进行测试

时间:2010-01-26 14:21:01

标签: python testing multithreading ping

我正在尝试用线程ping两个不同的网络。我能够得到我想要的响应,但我想将其转换为测试。我有下面尝试过的代码,但测试运行器说没有运行任何测试。代码如下:

#!/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()

如果网络没有响应,我希望测试断言为true和false,并为要ping的2个网络运行两个测试。有谁知道我哪里出错了?

1 个答案:

答案 0 :(得分:3)

当您继承unittest.TestCase时,名称以test开头的所有方法都会自动运行。否则,代码不会作为测试运行。 (所以RunTest没有运行。)

因此,如果您将RunTest更改为(不是那么多)test_RunTest

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

然后代码将运行。另请注意,unittest期望test_RunTest的第一个且唯一的参数为self

如果您想测试func(args)是否会引发错误,请使用self.assertRaises,如下所示:

self.assertRaises(AssertionError, func, args)

或者,如果func返回TrueFalse,那么您可以使用self.assertTrueself.assertFalse来测试是否返回了正确的值。

此外,当您编写单元测试时,最好将所有函数/类放在模块中,导入单元测试脚本的模块,然后测试函数返回或提高您对unittest的期望脚本。我可能是错的,但似乎现在你把这两件混合在一起。