2014-02-21 34 views
1

检查插座端口是否可用情况

我有一个应用程序,其中有一个TCP服务器作为其一部分(基于socketserver),我想在功能测试。

我创建自己测试混入,这是我在每个测试用例中:

class AppProcessManagingMixin: 
    _used_tcp_ports = set() 

    def start_my_app(self): 
     port = self._take_tcp_port() 
     prepare_config_with_given_tcp_port(port) 
     # use prepared config by subprocess below 
     Popen([python_executable_path, my_app_name, ...).start() 

    def _take_tcp_port(self): 
     available_found = False 
     while not available_found: 
      port = random.randint(9000, 9999) # these ints are arbitrary here 
      available_found = port not in self._used_tcp_ports 
     self._used_tcp_ports.add(port) 
     return port 

    def stop_my_app(self): 
     so_something_that_Im_sure_will_stop_my_app_after_a_few_seconds() 

setUp()电话self.start_my_app()每个测试的情况下,每tearDown() - self.stop_my_app(),我可以靠我的停止的应用程序。我需要应用程序的很多实例(并且无法在全班范围设置/拆卸中启动/停止应用程序),因为我的一些测试正在检查应用程序是否适用于以空工作目录开始的场景(我只需要“空”应用程序实例为那些测试)。我的第二种方法_take_tcp_port有问题。在我介绍它之前,我经常遇到已经占用地址的问题(因为所有的测试都尝试在相同的端口上运行TCP服务器)。现在并不经常发生,但仍然发生。

我知道它是依赖于系统的,几秒钟后端口将再次可用,但它使自动化测试变得更加困难。

问:

如何检查,一些地址(主机和端口)是否可用于TCP服务器?我想检查它在_take_tcp_port,以确保测试不会失败,因为应用程序实例有采取端口的问题。

研究我做:

我浏览之后的谷歌搜索页面一号:

  • 检查,如果端口是开放的蟒蛇
  • 检查端口可用蟒蛇
  • 发现可用端口

和全部我发现基于尝试获取套接字的方法。事情是,如果我成功获取套接字,我可以肯定这个端口是开放的,但是因为我做到了,我不能确定我的应用能够获得它。我需要一些没有副作用的东西。

平台

这需要是多平台(至少在Windows,Linux,MacOS的)。它必须至少在p3.3 +中工作。如果“有这个lib”就足够了)

回答

1

你不需要手动扫描一个可用的端口 - 操作系统会为你做。当您调用bind()时,只需指定端口0,操作系统将选择一个端口。这通常对测试非常有用 - 您可以启动一个端口为0的端点,让它向系统询问实际获得的端口(getsockaddr),然后使用该端口号启动第二个端点。

+0

这很有用,但是我怎样才能在Popened进程之外获得这个端口?有些测试需要连接到这个TCP服务器,并且要尽可能接近模拟真实场景,我想用Popen(可能是shell = True)来运行它,以隔离测试过程和应用程序进程(而不是调用它的main ()函数在测试过程中的附加线程或multiprocessing.Process中)。 –

+0

一种选择是通过Popen将命令行参数传递给程序,该参数指定程序在知道该信息后立即写入端口号的文件的名称。或者甚至让你的发射器在任何端口上侦听,并让它将该端口号传递给孩子,并且孩子将使用该端口号发回端口号。有点古怪,但如果你不愿意使用这个IPC的文件系统,它会起作用。 –

+0

这意味着,我需要在应用程序中实现某些功能,但没有真正的用法,但是仅为测试而创建。我认为这是一种不好的做法 - 我开始将应用程序逻辑和测试逻辑耦合起来,这并不好。尽管如此,我们可能会添加一些将已使用配置(将其复制到工作区)的内容,以便可以检查应用程序状态 - 然后,我们将使用此方法。谢谢! –