Пропингуйте сеть с помощью потоков и протестируйте ее - PullRequest
0 голосов
/ 26 января 2010

Я пытаюсь пропинговать две разные сети с потоком. Я могу получить ответ, который хочу, но хочу преобразовать его в тест. У меня есть код, который я попробовал ниже, но бегущий говорит, что тесты не выполнялись. Код ниже:

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

Я хочу, чтобы тест утверждал либо истину, либо ложь, если сеть не отвечает, и провел два теста для проверяемых сетей. Кто-нибудь знает, где я ошибся?

1 Ответ

3 голосов
/ 26 января 2010

Когда вы создаете подкласс 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 возвращает True или False, то вы можете проверить правильность возвращаемого значения, используя self.assertTrue или self.assertFalse.

Кроме того, когда вы пишете модульные тесты, было бы разумно поместить все ваши функции / классы в модуль, импортировать модуль для скрипта unittest, а затем проверить, что функции возвращают или повышают то, что вы ожидаете в unittest. скрипт. Я могу ошибаться, но кажется, что в данный момент у вас есть две части, смешанные вместе.

...