Как правильно сделать GET-запрос внутри теста Flask?
Есть фласк-эндпоинт, запускающий сервер дочерним процессом.
@app.route("/start_server", methods=["POST"])
def start_server():
form_data = request.get_data(as_text=True)
try:
data_object = json.loads(form_data)
except JSONDecodeError as err:
return "Invalid data. " + str(err), 400
server_path = data_object['server_path']
port = data_object['port']
timeout = data_object['timeout']
output_path = data_object['output_path']
with open(output_path, 'w') as log:
command = f'python {server_path} {port}'
command_list = shlex.split(command)
server_process = subprocess.Popen(command_list, stdout=log, stderr=log)
time.sleep(timeout)
server_process.kill()
return 'Success'
К нему необходимо написать тест.
class StartServerTest(unittest.TestCase):
def setUp(self):
app.config['TESTING'] = True
app.config['DEBUG'] = False
app.config["WTF_CSRF_ENABLED"] = False
self.app = app.test_client()
self.base_url = '/start_server'
def start_server_thread(self, post_data):
self.app.post(self.base_url, data=post_data)
def test_server_success(self):
data = {
'server_path': 'server.py',
'port': 4000,
'timeout': 5,
'output_path': 'output.txt',
}
post_data = json.dumps(data)
start_server = threading.Thread(target=self.start_server_thread, args=(post_data,))
start_server.start()
requests.get('http://127.0.0.1:4000/')
start_server.join()
with open('output.txt') as file:
output = file.read()
self.assertTrue('GET / HTTP/1.1" 200' in output)
Проблема в том, что запрос внутри теста не работает. Я пробовал делать его как в параллельных потоках, так и просто следом за запуском сервера. В результате всегда выбрасывается одна и та же ошибка.
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=4000)
Ответы (1 шт):
Автор решения: Михаил Пестов
→ Ссылка
Проблема разрешена. Достаточно было сделать паузу перед запросом
start_server.start()
time.sleep(1)
requests.get('http://127.0.0.1:4000/')
start_server.join()