0

首先,我知道带有类的烧瓶测试库,LiveServerTestCase但它自 2017 年以来一直没有更新,而且 GitHub 充满了它在 Windows 或 MacO 上都不起作用的问题,而且我还没有找到任何其他解决方案。

我正在尝试使用 selenium 为烧瓶应用程序编写一些测试来验证此应用程序中的 FlaskForms。

像这样的简单测试:

def test_start(app):
    driver.get("http://127.0.0.1:5000/endpoint")
    authenticate(driver)

落在selenium.common.exceptions.WebDriverException: Message: unknown error: net::ERR_CONNECTION_REFUSED错误上。(据我了解,在我的案例中,应用程序在 @pytest.fixtures 中创建并立即关闭,我需要找到一种方法让它在整个测试期间保持运行)

我的问题是:是否可以在每个测试中创建一些将继续工作的实时服务器,以便我可以通过 selenium 调用 API 端点?

简单的固定装置,如果它有帮助:

@pytest.fixture
def app():
    app = create_app()
    ...
    with app.context():
        # creating db
        ...
    yield app

还:

@pytest.fixture
def client(app):
    """Test client"""
    return app.test_client()
4

1 回答 1

0

终于让一切正常了。我的 conftest.py

import multiprocessing
import pytest

from app import create_app


@pytest.fixture(scope="session")
def app():
    app = create_app()
    multiprocessing.set_start_method("fork")
    return app


@pytest.fixture
def client(app):
    return app.test_client()

重要说明, multiprocessing.set_start_method("fork")没有必要使用 python <3.8 行(据我在 v.3.8 中了解,他们重构了多处理模块,因此如果没有此行,您将pickle Error在 windows 和 Mac 上获得更多信息)。

一个简单的测试看起来像

def test_add_endpoint_to_live_server(live_server):
    @live_server.app.route('/tests-endpoint')
    def test_endpoint():
        return 'got it', 200

    live_server.start()

    res = urlopen(url_for('.te', _external=True))# ".te is a method path I am calling"
    assert  url_for('.te', _external=True) == "some url"
    assert res.code == 200
    assert b'got it' in res.read()

我也在使用url_for. 关键是每次实时服务器在随机端口上启动并且url_for函数在内部生成具有正确端口的 url。所以现在实时服务器正在运行,并且可以实现硒测试。

于 2021-08-05T11:50:49.850 回答