情况:
我有一个应用程序,它有一个TCP服务器(基于socketserver
),我想在功能上测试它。
我自己创建了一个测试mixin,我在每个测试用例中使用它:
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()
,我可以依赖停止我的应用。我需要我的应用程序的许多实例(并且无法在全班设置/拆卸中启动/停止应用程序),因为我的一些测试正在检查应用程序是否在从空工作目录开始的情况下运行良好(我只需要"空& #34;那些测试的app实例。)
第二种方法_take_tcp_port
出现问题。在我介绍它之前,我经常遇到已经占用地址的问题(因为所有测试都尝试在同一端口上运行TCP服务器)。现在它并不经常发生,但仍然 - 它发生了。
我知道它是系统相关的,几秒钟后端口将再次可用,但它会使自动化测试变得更难。
问题:
如何检查某些地址(主机和端口)是否可用于TCP服务器?我想在_take_tcp_port
中检查一下,以确保测试不会失败,因为应用实例遇到了端口问题。
研究我已经完成了:
我浏览了以下谷歌搜索的第一页:
我发现的所有方法都是基于尝试获取套接字。事实上,如果我成功获得套接字,我可以确定这个端口是打开的,但因为我做了,我不能确定我的应用程序是否能够获得它。我需要一些没有副作用的东西。
平台
这需要是多平台的(至少是Windows,Linux,MacOS)。它必须至少在p3.3 +中起作用。如果"那就是那个"这就够了;)
答案 0 :(得分:1)
您无需手动扫描可用端口 - 操作系统会为您执行此操作。只需在调用bind()时指定端口0,操作系统将选择一个。这通常对测试有用 - 您可以使用端口0启动一个端点,让它询问系统实际获得的端口(getsockaddr),然后使用该端口号启动第二个端点。