Flask make_server always raises "OSError: [Errno 98] Address already in use"
Flask make_server always raises "OSError: [Errno 98] Address already in use"
我正在尝试为我正在处理的一些 Python 代码编写单元测试,并且其中一些代码在完成后与 API 联系。我正在尝试使用一个简单的 Flask API 运行 模拟此 API 并检查代码是否发送了正确的信息。这是代码:
import unittest
import time
from threading import Thread
from flask import Flask
from flask_restx import Api, Resource
from werkzeug.serving import make_server
mock_app = Flask(__name__)
mock_api = Api(mock_app)
# Mock API
data_in = []
data_out = ""
result_code = 200
@mock_api.route('/jobs')
class MockAPI(Resource):
def post(self):
global data_in, data_out, result_code
data_in.append(mock_api.payload)
return data_out, result_code
# Unit test class
class TestClass(unittest.TestCase):
def __init__(self, arg):
super().__init__(arg)
# Some needed fields
# ...
# Mock API Server
self.mock_server = make_server('localhost', 6000, mock_wfm)
self.mock_server_thread = Thread(target = self.mock_wfm.serve_forever)
调用 make_server
的那一行是导致异常的那一行。 lsof -i :6000
之类的命令不会 return 任何东西,更改地址或端口也不会解决任何问题。
编辑:
在错误行前加了一个简单的打印后,发现其实代码被调用了两次,才导致错误。我还不知道为什么。
问题是显然每次测试都会调用 __init__
方法,所以每次都在第二次失败。
解决方法是将server和Thread的创建放在setUp方法中,在tearDown中关闭。
def setUp(self):
self.mock_server = make_server('localhost', 6000, mock_wfm)
self.mock_server_thread = Thread(target = self.mock_server.serve_forever)
self.mock_server_thread.start()
time.sleep(1)
def tearDown(self):
self.mock_server.shutdown()
self.mock_server_thread.join()
编辑:
方法 setupClass
和 teardownClass
显然是更好的解决方案,因为它们 运行 每个 class 一次,而不是每个测试一次。
我正在尝试为我正在处理的一些 Python 代码编写单元测试,并且其中一些代码在完成后与 API 联系。我正在尝试使用一个简单的 Flask API 运行 模拟此 API 并检查代码是否发送了正确的信息。这是代码:
import unittest
import time
from threading import Thread
from flask import Flask
from flask_restx import Api, Resource
from werkzeug.serving import make_server
mock_app = Flask(__name__)
mock_api = Api(mock_app)
# Mock API
data_in = []
data_out = ""
result_code = 200
@mock_api.route('/jobs')
class MockAPI(Resource):
def post(self):
global data_in, data_out, result_code
data_in.append(mock_api.payload)
return data_out, result_code
# Unit test class
class TestClass(unittest.TestCase):
def __init__(self, arg):
super().__init__(arg)
# Some needed fields
# ...
# Mock API Server
self.mock_server = make_server('localhost', 6000, mock_wfm)
self.mock_server_thread = Thread(target = self.mock_wfm.serve_forever)
调用 make_server
的那一行是导致异常的那一行。 lsof -i :6000
之类的命令不会 return 任何东西,更改地址或端口也不会解决任何问题。
编辑:
在错误行前加了一个简单的打印后,发现其实代码被调用了两次,才导致错误。我还不知道为什么。
问题是显然每次测试都会调用 __init__
方法,所以每次都在第二次失败。
解决方法是将server和Thread的创建放在setUp方法中,在tearDown中关闭。
def setUp(self):
self.mock_server = make_server('localhost', 6000, mock_wfm)
self.mock_server_thread = Thread(target = self.mock_server.serve_forever)
self.mock_server_thread.start()
time.sleep(1)
def tearDown(self):
self.mock_server.shutdown()
self.mock_server_thread.join()
编辑:
方法 setupClass
和 teardownClass
显然是更好的解决方案,因为它们 运行 每个 class 一次,而不是每个测试一次。