2010-01-26 53 views
0

我想用线程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() 

我想测试如果网络没有给出回应,并运行两个试验被ping 2个网络断言无论真假。有谁知道我出错的地方吗?

+1

只是一个nit:你不能ping“一个网络”。你ping *主机*,而不是整个网络。除非你正在做一个广播ping,当然这包括计算响应和你明显没有做的事情。 – unwind 2010-01-26 14:55:41

回答

3

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

所以,如果你改变RunTest到(不那么流畅的)test_RunTest

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

然后代码将运行。另请注意,单元测试期望test_RunTest的第一个也是唯一的参数是self

如果你想测试func(args)引发错误,然后使用self.assertRaises这样的:

self.assertRaises(AssertionError, func, args) 

或者,如果func回报TrueFalse,那么你就可以在适当的值是通过使用self.assertTrue返回测试或self.assertFalse。另外,当你编写单元测试时,将所有的函数/类放在模块中,为unittest脚本导入模块,然后测试函数返回或提高你期望的unittest脚本。我可能是错的,但似乎目前你有两块混合在一起。