2010-01-26 50 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腳本。我可能是錯的,但似乎目前你有兩塊混合在一起。