【问题标题】:Write a unit test with pytest to test a socket用pytest写一个单元测试来测试一个socket
【发布时间】:2017-02-11 22:34:40
【问题描述】:

我写了一个小型服务器聊天,它做非常基本的事情,我想围绕它编写测试。不幸的是,我很迷茫。我需要一些帮助才能走上正轨。

我有一个名为 Server() 的类,它包含一个名为 bind_socket() 的方法。我想编写单元测试(最好使用pytest)来测试以下方法:

class Server(Threading.Thread):
""" Server side class

Instanciate a server in a thread.

"""

MAX_WAITING_CONNECTIONS = 10

def __init__(self, host='localhost', port=10000):
    """ Constructor of the Server class.

    Initialize the instance in a thread.

    Args:
        host (str):     Host to which to connect (default=localhost)
        port (int):     Port on which to connect (default=10000)

    """
    threading.Thread.__init__(self)
    self.host = host
    self.port = port
    self.connections = []
    self.running = True

def bind_socket(self, ip=socket.AF_INET, protocol=socket.SOCK_STREAM):
    self.server_socket = socket.socket(ip, protocol)
    self.server_socket.bind((self.host, self.port))
    self.server_socket.listen(self.MAX_WAITING_CONNECTIONS)
    self.connections.append(self.server_socket)

我想知道为这种方法编写测试的最佳方法是什么,因为它不返回任何内容。我应该模拟它并尝试返回 socket()、bind()、listen() 和 append() 的调用次数还是继续进行的错误方法?我对此很迷茫,我使用 pytest 和 unittest 进行了许多测试,观看会议和阅读文章,但我仍然没有任何工作。 一些解释和/或示例将不胜感激。

非常感谢

【问题讨论】:

  • 你的类有两个职责:作为服务器和作为线程。这应该是一个警告信号。
  • @PeterWood,感谢您的评论,您选择了我的兴趣,您能否再明确一点您的想法?

标签: python unit-testing sockets mocking pytest


【解决方案1】:

对于bind_socket 的每一行,您应该问自己以下问题:

  • 如果这条线不存在怎么办
  • (对于条件句...我知道你这里没有)如果这个条件正好相反会怎样
  • 此行能否引发异常。

您希望您的测试涵盖所有这些可能性。

例如,socket.bind 可以在已经绑定的情况下引发异常,或者socket.listen 可以引发异常。之后你会关闭套接字吗?

【讨论】:

  • 回答你的最后一个问题,是的,我有一个调用 server_socket.close() 的方法。所以,我不应该尝试模拟它们,而是改进代码以尽可能地引发错误并相应地编写测试?
  • 不,你没有。如果在调用bindbind_socket 失败,您不会关闭套接字。
  • 好的,我想我明白了。我应该检查套接字是否已经打开,如果没有,则绑定它,否则会引发异常。
  • 好吧,如果您对此感到满意,可以让它引发异常(请参阅AFNP)。但这应该是你的测试之一。
  • 这是目前最简单的任务。我对单元测试很陌生。在纸上看起来很容易,但是一旦我尝试写它们,我就会很挣扎,而且我无法从它开始。我苦苦研究了好几个小时都没有成功。
猜你喜欢
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
相关资源
最近更新 更多