4

我正在用 python 编写一个 Web 应用程序,并使用带有splinter的生菜来为其编写验收测试。

为此,我需要一个 wsgi 服务器在后台启动我的应用程序,以便该应用程序可用于我的测试套件。为此,我一直在另一个线程中启动一个女服务员服务器实例,以使浏览器连接到:

def setUp():
    base = os.path.dirname(__file__) + "/../../.."
    world.app = loadapp('config:test.ini', relative_to=base)
    world.server_thread = thread.start_new_thread(serve_app,  (world.app,))

def serve_app(app):
    serve(app, host='0.0.0.0', port=7654)

这工作得很好 - 我的测试套件可以使用正在运行的应用程序实例来设置固定装置/模拟等,并且服务器可供我的测试连接到。但是,当测试完成时,我无法向服务器发送信号以彻底关闭自身。因此,无论如何,我是否可以以某种方式向KeyboardInterrupt我生成的服务器线程发送一个(这将被女服务员捕获并提示它干净地关闭),或者如果失败,是否存在一个暴露非阻塞的现有 wsgi 服务器实现start()stop()我可以用来代替服务员的方法?

4

3 回答 3

1

您不一定需要 WSGI 服务器来对 WSGI 应用程序进行单元测试,例如.

对于您的验收测试,您可以在单独的进程中启动服务器并在完成后发送 SIGINT。

如果您想坚持当前的设置;您可以在主线程中运行服务器,在后台线程中运行测试。然后你可以将 KeyboardInterrupt 从 subthreads 发送到主线程

于 2012-08-14T02:47:17.907 回答
1

问题只是进程不会关闭吗?

自从我使用 Python 进行 Web 开发已经有一段时间了,所以我对这些库没有经验,但是如果关闭是问题,那么使用守护线程似乎是一个很好的场景。

这里提到:http: //docs.python.org/library/threading.html

于 2012-08-14T10:21:11.600 回答
1

将运行 WSGI 服务器的线程标记为守护线程。这样,当您退出主线程时,它不会等待服务器正在运行的线程完成,而只会退出应用程序。

于 2012-08-14T11:08:20.687 回答