【问题标题】:How do I tell Jenkins to run a Python Flask application, then Selenium tests, then close the Flask application?如何告诉 Jenkins 运行 Python Flask 应用程序,然后进行 Selenium 测试,然后关闭 Flask 应用程序?
【发布时间】:2020-06-29 18:19:13
【问题描述】:

我有一个 Flask 应用程序,可以将我的 Web 应用程序启动到特定端口(例如,8080)。它通过运行python run.py 启动。我还有一个 Python 文件,它为 Web 应用程序运行 Selenium 端到端测试。

这是 GitHub 存储库的一部分,我已将其连接起来,以便每当我推送/提交到 GitHub 存储库时,它都会启动 Jenkins 测试。 Jenkins 使用我的机器作为代理来运行命令。我在 Jenkins 的管道中有一系列命令要执行。

理想情况下,命令的顺序应该是:

  1. 启动 Flask Web 应用程序
  2. 运行 Selenium 测试
  3. 终止 Flask Web 应用程序

现在,我的问题是:我可以使用 Jenkins 将 repo 克隆到我的计算机(代理)上的本地工作区,然后运行 ​​Python 命令来启动我的 Web 应用程序。我可以使用 Jenkins 并行运行一个任务,在 Web 应用程序使用的端口上进行 Selenium 测试。

但是一旦 Selenium 测试完成,我无法弄清楚如何结束 Flask Web 应用程序。如果我不结束 run.py 执行,它就会陷入无限循环,无休止地为端口提供应用程序。我可以让 Jenkins 在指定的时间后自动中止,但这会将整个过程标记为失败。

Selenium 测试完成后,是否有人知道如何结束 Flask 托管进程?或者,如果我以一种笨拙的方式来做这件事(我承认我是出于大量的无知和缺乏经验而说话),有没有更好的方法来处理这个问题?

【问题讨论】:

  • 澄清一下,我不需要 Selenium 来进行关闭;我只提到 Selenium 是为了说明我为什么要这样做。关键部分是以编程方式关闭端口的实际行为。谢谢!
  • 这能回答你的问题吗? How to run Flask Server in the background

标签: python selenium jenkins testing flask


【解决方案1】:

我不知道导致开发服务器在 Selenium 控制下退出的官方方法,但以下路线适用于 Flask 1.1.2

from flask import request
...

if settings.DEBUG:
    @app.route('/quit')
    def quit():
        shutdown_hook = request.environ.get('werkzeug.server.shutdown')
        if shutdown_hook is not None:
            shutdown_hook()
            return "Bye"
        return "No shutdown hook"

【讨论】:

  • 谢谢,戴夫。创建关闭路由肯定会起作用,但我对是否有一个任何人都可以用来关闭我的服务器的路由犹豫不决。我想知道是否有办法只保护那一条路线,仅出于测试目的而保持开放?
  • 您可以选择性地启用路由,例如,仅当启用了 DEBUG 时。我稍微改变了这个例子来证明这一点。
  • 使用 token_required 装饰器来保护路由。
猜你喜欢
  • 2016-07-24
  • 1970-01-01
  • 2015-03-03
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
相关资源
最近更新 更多