Использование скрипта Python для запуска и остановки Google App Engine dev_appserver во время тестирования непрерывной интеграции

#python #google-app-engine

#python #google-app-engine

Вопрос:

Я пытаюсь написать скрипт на Python, который позволит мне запустить Google App Engine dev_appserver с помощью coverage.py извлеките URL-адрес / test из приложения, которое я запускаю, дождитесь, пока сервер завершит возврат страницы, затем выключите dev_appserver, а затем сгенерируйте отчет.

Моя задача заключается в том, как запустить dev_appserver в фоновом режиме, чтобы я мог выполнять выборку http, а затем как отключить dev_appserver перед созданием моего отчета.

Я направляюсь к чему-то вроде этого:

 # get_gae_coverage.py
# Launch dev_appserver with coverge.py
coverage run --source=./ /usr/local/bin/dev_appserver.py --clear_datastore --use_sqlite .
#Fetch /test
urllib.urlopen('http://localhost:8080/test').read()
# Shutdown dev_appserver somehow
# ??
# Generate coverage report
coverage report
  

Какой наилучший способ написать скрипт на Python для этого?

Ответ №1:

Вы должны использовать подпроцесс Popen

 import os
import signal
import subprocess

coverage_proc = subprocess.Popen(
          ['coverage','run', your_flag_list]
          stdout=subprocess.PIPE,
          stderr=subprocess.STDOUT)
time.sleep(5) #Find the correct sleep value
urllib.urlopen('http://localhost:8080/test').read()
time.sleep(1)
os.kill(coverage_proc.pid, signal.SIGINT)
  

Здесь вы можете найти другой подход для проверки работоспособности сервера:

 line = proc.stdout.readline()
while '] Running application' not in line:
     line = proc.stdout.readline()
  

Ответ №2:

threading это способ выполнить такого рода задачу. А именно, вы запускаете dev_appserver в потоке или в главном потоке и во время его выполнения запускаете и собираете результаты с помощью модуля coverage, а затем завершаете процесс dev_appserver python в другом потоке, и вы получите результаты от coverage.

Вот пример фрагмента, который запускает dev_appserver.py в потоке, а затем ожидает 10 секунд, прежде чем завершит процесс Python. Вы можете изменить метод end подходящим образом, в котором вместо ожидания 10 секунд он ожидает несколько секунд (для того, чтобы запустить процесс python), а затем начать тестирование покрытия и после его завершения отключить appserver и завершить покрытие.

 import threading
import subprocess
import time

hold_process = []

def start():
    print 'In the start process'
    proc = subprocess.Popen(['/usr/bin/python','dev_appserver.py','yourapp'])
    hold_process.append(proc)

def end():
    time.sleep(10)
    proc = hold_process.pop(0)
    print 'Killing the appserver process'
    proc.kill()


t = threading.Thread(name='startprocess',target=start)
t.deamon = True
w = threading.Thread(name='endprocess',target=end)
t.start()
w.start()
t.join()
w.join()
  

Комментарии:

1. операционная система пытается запустить dev_appserver с запуском покрытия.

2. @systempuntout — да, я понял. если я правильно понимаю. Вы запускаете dev_appserver в одном потоке, а затем запускаете покрытие в другом потоке, а затем координируете, правильно? Это был мой ответ.