我正在尝试用线程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个网络运行两个测试。有谁知道我哪里出错了?
答案 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
返回True
或False
,那么您可以使用self.assertTrue
或self.assertFalse
来测试是否返回了正确的值。
此外,当您编写单元测试时,最好将所有函数/类放在模块中,导入单元测试脚本的模块,然后测试函数返回或提高您对unittest的期望脚本。我可能是错的,但似乎现在你把这两件混合在一起。