使用Python脚本在持续集成测试中启动和停止Google App Engine dev_appserver

4 投票
2 回答
1492 浏览
提问于 2025-04-16 16:25

我正在尝试写一个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()

撰写回答