В настоящее время я работаю над набором интеграционных тестов с pytest в python 2.7, которые выполняют следующее:
1) запускает двоичный файл сервера в фоновом режиме на моей локальной машине
2)отправлять запросы на сервер и проверять результаты
3) завершать фоновый серверный процесс
Кажется, все работает нормально, за исключением того, что я не могу остановить серверный процесс, запущенный на моем компьютере.Хотя он продолжает работать на моем компьютере, Python, похоже, забыл об этом;мой Popen
объект - None
.
AttributeError: 'NoneType' object has no attribute 'terminate'
Есть какие-нибудь мысли о том, что вызывает это?Я что-то упускаю из виду?
import time
import subprocess
server_background_process_pipe = None
def setup_module():
# Start the test server in the background
cmd = 'bin/my_server --key1='+value1+' --key2='+value2+' &' # The '&' tells my bin to run in the background
server_background_process_pipe = subprocess.Popen(cmd, shell=True,stderr=subprocess.STDOUT)
print(server_background_process_pipe) # prints '<subprocess.Popen object at 0x10aabd250>'
time.sleep(1) # Wait for the server to be ready
def test_basic_get_request():
print(server_background_process_pipe) # prints 'None'
response = send_request_to_server()
fail_if_not_as_expected(response) # Response is exactly as expected
def teardown_module():
# kill the server that was launched in setup_module to serve requests in the tests
# AttributeError: 'NoneType' object has no attribute 'terminate'
server_background_process_pipe.terminate()
Дополнительная информация:
Это None
, даже если процесс на сервере все еще выполняется.Это None
во время выполнения тестов.Он запускается долго после окончания тестирования.Если я повторно запускаю тесты, я получаю сообщение в консоли, что мой сервер не удалось развернуть, потому что он уже запущен.Тесты все еще проходят, потому что они отправляют запросы на сервер из предыдущего выполнения.
Поскольку сервер должен работать в фоновом режиме, я использую конструктор subprocess.Popen напрямую вместо одного из вспомогательных методов, таких как check_output
.