代码之家  ›  专栏  ›  技术社区  ›  JustJeff

单元测试UDP套接字处理代码

  •  1
  • JustJeff  · 技术社区  · 16 年前

    是否有任何“好的”方法可以使等待recvFrom()调用的线程变得不被阻塞并返回错误?

    这样做的动机是为一个系统编写单元测试,该系统包括一个读取UDP数据报的单元。其中一个分支处理recvfrom调用本身的错误。代码不需要区分不同类型的错误,只需要设置一个标志。

    我曾经想过关闭另一个线程的套接字,或者关闭它,以使recvFrom返回时出错,但这似乎有点麻烦。我在其他地方也看到过,发送一个过大的包可以做到这一点,所以建立了一个实验,在这个实验中,16K缓冲区被发送到一个等待4K的recvrom,但这并没有导致错误。recvFrom只返回4096,表明它已经得到了这么多字节。

    5 回复  |  直到 16 年前
        1
  •  2
  •   mbauman    16 年前

    如果您正在测试的类与应用程序的其余部分隔离得很好,那么也许您可以批发 #include 来自单元测试的.c源文件。然后可以使用宏 #define recvfrom(...) 只在测试中用于您自己的私人功能。

    请注意,这将使您的私有实现暴露在单元测试中;您仍然应该针对公共接口进行测试,并假装看不到内部结构。它非常简单,但是它至少包含了单元测试的所有丑陋之处,并且没有破坏可交付代码。

        2
  •  1
  •   Community Mohan Dere    9 年前

    您可以在网络库周围创建一个类,有时根据某些条件使它失败。例如,您可以让这个网络层基于特定的网络性能级别而失败,在那里您可以在特定的频率上模拟错误。

    I have asked a similar question 在过去,这也可能有帮助。

        3
  •  0
  •   nategoose    16 年前

    我认为有必要采取一种有点粗暴或棘手的方法。

    你试过用吗 ioctl(sock, FIONBIO, 将插座切换到非阻塞模式?

        4
  •  0
  •   Nikolai Fetissov    16 年前

    最简单的可能是发送一个信号,尽管这取决于原始代码是否有处理程序设置。

        5
  •  0
  •   JoeGeeky    16 年前

    我从未在C中这样做过,但是在C/J/Java中,我在套接字、TCPclipse等周围创建包装类。每个包装类都实现了一个我所创建的表示我感兴趣的方法的接口。这允许我使用依赖注入模式来注入模拟或存根套接字。也许这个模式可以帮助你,尽管你必须为你的语言翻译。