使用Python脚本在持续集成测试中启动和停止Google App Engine dev_appserver
我正在尝试写一个Python脚本,目的是启动Google App Engine的开发服务器(dev_appserver),然后用coverage.py来监控代码的覆盖率。接着,我会从我启动的应用中获取/test这个网址,等服务器把页面返回完毕后,再关闭开发服务器,最后生成一个报告。
我面临的挑战是,如何在后台启动开发服务器,这样我才能进行HTTP请求,然后在生成报告之前关闭开发服务器。
我想要的效果大概是这样的:
# 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 个回答
2
threading
是实现这种任务的一种方法。简单来说,你可以在一个线程中启动 dev_appserver,然后在它运行的时候,使用 coverage 模块来收集结果。接着在另一个线程中结束 dev_appserver 的 Python 进程,这样就能得到 coverage 的结果。
下面是一个示例代码,它在一个线程中运行 dev_appserver.py
,然后等待 10 秒钟后再结束这个 Python 进程。你可以根据需要修改这个方法,比如不等 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()
4
你可以使用 subprocess 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()