Использование скрипта Python для запуска и остановки Google App Engine dev_appserver во время непрерывного тестирования интеграции - PullRequest
4 голосов
/ 26 апреля 2011

Я пытаюсь написать скрипт на Python, который позволит мне запустить dev_appserver Google App Engine с помощью cover.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 для этого?

Ответы [ 2 ]

4 голосов
/ 26 апреля 2011

Вы должны перейти с подпроцесс 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 голосов
/ 26 апреля 2011

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

Вот пример фрагмента, который запускает 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...