在网络线程上使用pyunit

时间:2009-07-23 18:52:24

标签: python unit-testing networking python-unittest

我的任务是为一套用python编写的网络软件编写单元测试。为消息构建器和其他静态方法编写单元非常简单,但在为网络循环线程编写测试时,我遇到了障碍。

例如:它连接的服务器可以在任何端口上,我希望能够测试连接到多个端口(按顺序,而不是并行)的能力,而无需实际运行多个服务器。有什么好方法可以解决这个问题?也许使服务器构建和破坏成为测试的一部分?有些东西告诉我,必须有一个更简单的答案来逃避我。

我必须想象有单元测试网络线程的方法,但我似乎找不到任何方法。

4 个答案:

答案 0 :(得分:1)

我会尝试将一个工厂引入您声称创建套接字对象的现有代码中。然后在模拟工厂的测试过程中,创建模拟套接字,只是假装它们已经连接到服务器(或者不是因为错误情况,你也想测试,不是吗?)并记录消息流量以证明您的代码使用正确的端口连接到正确类型的服务器。

尽量不要使用线程,以简化测试。

答案 1 :(得分:0)

这取决于您的网络软件的分层方式以及您希望测试的详细程度,但在某些情况下,确保服务器设置和拆卸部分测试肯定是可行的。例如,当我在处理Python日志包时(在它成为Python的一部分之前),我进行了测试(我没有使用pyunit / unittest - 它只是一个临时的脚本)它启动了(在一次测试中)四台服务器来监听TCP,UDP,HTTP和HTTP / SOAP端口,然后向它们发送网络流量。如果您感兴趣,则分发为here,并且要查看的归档中的相关测试脚本为log_test.py。从那时起,Python日志包已经有了某种方式,但旧的软件包仍然可以用于Python的版本< 2.3和> = 1.5.2。

答案 2 :(得分:0)

我有一些测试用例在setUp中运行服务器并在tearDown中关闭它。我不知道它是否是非常优雅的方式,但它适用于我。

我很高兴拥有它并且它对我有很大帮助。

如果服务器init很长,另一种方法是用ant自动化它。 ant会在执行测试之前/之后运行/停止服务器。

有关ant和python的非常有趣的教程,请参阅here

答案 3 :(得分:0)

您需要创建模拟套接字。确切的方法取决于你如何创建套接字和创建套接字生成器将是一个好主意。您还可以使用像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()