2010-01-26 3 views
0

J'essaie de faire un ping sur deux réseaux différents avec thread. Je suis en mesure d'obtenir la réponse que je veux, mais je veux la convertir en un test. J'ai le code que j'ai essayé ci-dessous mais le coureur d'essai dit qu'aucun essai n'a été exécuté. Le code est ci-dessous:Effectuer un ping sur un réseau à l'aide de threads et le tester

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

Je veux le test d'affirmer soit vrai et faux si un réseau ne donne aucune réponse et exécuter deux tests pour les 2 réseaux être épinglées. Est-ce que quelqu'un sait où je me suis trompé?

+1

Juste un nit: vous ne pouvez pas ping "un réseau". Vous ping * hôtes *, pas des réseaux entiers. Sauf si vous faites un ping de diffusion bien sûr, ce qui implique de compter les réponses et les choses que vous ne faites clairement pas. – unwind

Répondre

3

Lorsque vous sous-classe unittest.TestCase, toutes les méthodes dont le nom commence par test, s'exécutent automatiquement. Sinon, le code n'est pas exécuté en tant que test. (Donc, RunTest ne fonctionne pas).

Donc, si vous changez RunTest à (pas si mielleuse) test_RunTest:

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

alors le code sera exécuté. Notez également que Unittest s'attend à ce que le premier et unique argument de test_RunTest soit self.

Si vous voulez vérifier que func(args) déclenche une erreur, utilisez self.assertRaises comme ceci:

self.assertRaises(AssertionError, func, args) 

Ou, si func retours True ou False, alors vous pouvez les tests que la valeur correcte est renvoyée à l'aide self.assertTrue ou self.assertFalse. De même, lorsque vous écrivez des tests unitaires, il serait sage de placer toutes vos fonctions/classes dans un module, d'importer le module pour le script unittest, puis de tester que les fonctions retournent ou augmentent ce que vous attendez dans le module. script unittest. Je peux me tromper, mais il semble que, pour le moment, vous ayez les deux morceaux mélangés.

Questions connexes