我的任务是为一套用 python 编写的网络软件编写单元测试。为消息构建器和其他静态方法编写单元非常简单,但是在为网络循环线程编写测试时我遇到了困难。
例如:它连接的服务器可以在任何端口上,我希望能够测试连接到多个端口(按顺序,而不是并行)的能力,而无需实际运行多个服务器。解决这个问题的好方法是什么?也许将服务器构建和销毁作为测试的一部分?有些东西告诉我,必须有一个更简单的答案来逃避我。
我不得不想象有一些方法可以对网络线程进行单元测试,但我似乎找不到任何方法。
我的任务是为一套用 python 编写的网络软件编写单元测试。为消息构建器和其他静态方法编写单元非常简单,但是在为网络循环线程编写测试时我遇到了困难。
例如:它连接的服务器可以在任何端口上,我希望能够测试连接到多个端口(按顺序,而不是并行)的能力,而无需实际运行多个服务器。解决这个问题的好方法是什么?也许将服务器构建和销毁作为测试的一部分?有些东西告诉我,必须有一个更简单的答案来逃避我。
我不得不想象有一些方法可以对网络线程进行单元测试,但我似乎找不到任何方法。
我会尝试在您现有的代码中引入一个工厂来创建套接字对象。然后在一个模拟工厂的测试通过中创建模拟套接字,这些套接字只是假装它们已经连接到服务器(或者对于错误情况,您也想测试,不是吗?)并记录消息流量以证明您的代码使用正确的端口连接到正确类型的服务器。
暂时不要使用线程,以简化测试。
这取决于您的网络软件的分层方式以及您希望测试的详细程度,但在某些情况下,将服务器设置和拆卸作为测试的一部分当然是可行的。例如,当我在编写 Python 日志记录包时(在它成为 Python 的一部分之前),我有一个测试(我没有使用pyunit
/ unittest
- 它只是一个临时脚本),它启动了(在一个测试中)四台服务器监听 TCP、UDP、HTTP 和 HTTP/SOAP 端口,然后向它们发送网络流量。如果您有兴趣,分发版在这里,存档中要查看的相关测试脚本是log_test.py
. Python 日志记录包当然从那时起以某种方式出现,但旧包仍然存在,可与 Python < 2.3 和 >= 1.5.2 的版本一起使用。
我有一些在setUp 中运行服务器并在tearDown 中关闭它的测试用例。我不知道这是否是一种非常优雅的方式,但它对我有用。
我很高兴拥有它,它对我帮助很大。
如果服务器初始化很长,另一种方法是使用 ant 将其自动化。ant 会在执行测试之前/之后运行/停止服务器。
有关 ant 和 python 的非常有趣的教程,请参见此处
您需要创建模拟套接字。执行此操作的确切方法取决于您如何创建套接字并创建套接字生成器将是一个好主意。您还可以使用像pymox这样的模拟库来让您的生活更轻松。它还可以消除仅出于测试目的而创建套接字生成器的需要。
使用 pymox,你会做这样的事情:
def test_connect(self):
m = mox.Mox()
m.StubOutWithMock(socket, 'socket')
socket_mock = m.MockAnything()
m.socket.socket(socket.AF_INET, socket.SOCK_STREAM).AndReturn(socket_mock)
socket_mock.connect(('test_server1', 80))
socket_mock.connect(('test_server2', 81))
socket_mock.connect(('test_server3', 82))
m.ReplayAll()
code_to_be_tested()
m.VerifyAll()
m.UnsetStubs()