Ошибка при использовании AdWordsClient из pytest - обнаружена рекурсия (те же самые местные и позиция) - PullRequest
0 голосов
/ 10 марта 2019

Мне нужно написать набор тестов, чтобы проверить, приносят ли некоторые вызовы Google AdWords API правильные данные.

Для этого я написал метод фикстуры, который приводит к клиенту Google:

@pytest.fixture
def google_client():
    client = adwords.AdWordsClient.LoadFromStorage('tests/googleads.yaml')
    client.cache = common.ZeepServiceProxy.NO_CACHE

    return client

Тогда у меня есть метод, который пытается подключиться к API Google, но даже до этого, просто при попытке загрузить загрузчик отчетов

def test_performance_report(google_client):
    google_client.SetClientCustomerId(*****)
    report_downloader = google_client.GetReportDownloader(version='v201809')
    > 

Там он разрывается с этой трассировкой стека:

tests/test_googleads_api.py:12:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
env/lib/python3.6/site-packages/googleads/adwords.py:478: in GetReportDownloader
    return ReportDownloader(self, version, server)
env/lib/python3.6/site-packages/googleads/adwords.py:1321: in __init__
    self.proxy_config, self._namespace, self._adwords_client.cache)
env/lib/python3.6/site-packages/googleads/common.py:821: in __init__
    data = transport.load(endpoint)
env/lib/python3.6/site-packages/zeep/transports.py:110: in load
    content = self._load_remote_data(url)
env/lib/python3.6/site-packages/zeep/transports.py:126: in _load_remote_data
    response = self.session.get(url, timeout=self.load_timeout)
env/lib/python3.6/site-packages/requests/sessions.py:546: in get
    return self.request('GET', url, **kwargs)
env/lib/python3.6/site-packages/requests/sessions.py:533: in request
    resp = self.send(prep, **send_kwargs)
env/lib/python3.6/site-packages/requests/sessions.py:646: in send
    r = adapter.send(request, **kwargs)
env/lib/python3.6/site-packages/requests/adapters.py:449: in send
    timeout=timeout
env/lib/python3.6/site-packages/urllib3/connectionpool.py:600: in urlopen
    chunked=chunked)
env/lib/python3.6/site-packages/urllib3/connectionpool.py:343: in _make_request
    self._validate_conn(conn)
env/lib/python3.6/site-packages/urllib3/connectionpool.py:839: in _validate_conn
    conn.connect()
env/lib/python3.6/site-packages/urllib3/connection.py:332: in connect
    cert_reqs=resolve_cert_reqs(self.cert_reqs),
env/lib/python3.6/site-packages/urllib3/util/ssl_.py:281: in create_urllib3_context
    context.options |= options
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py:465: in options
    super(SSLContext, SSLContext).options.__set__(self, value)
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py:465: in options
    super(SSLContext, SSLContext).options.__set__(self, value)
E   RecursionError: maximum recursion depth exceeded
!!! Recursion detected (same locals & position)

Просто отметим, что тот же код работает в производственном процессе, однако при выполнении этого в тесте он ломается.Я не понимаю, в чем дело, я был бы признателен за любую помощь

Я запускаю это с:

платформа darwin - Python 3.6.7, pytest-4.3.0, py-1.7.0, плагины pluggy-0.8.0: flask-0.14.0, celery-4.2.0

ОТЛАДКА: если я запускаю это из консоли python, это работает, однако из теста это не так:

from requests.packages.urllib3.util.ssl_ import create_urllib3_context
    create_urllib3_context()
    print(ssl.SSLContext)

Ошибка:

env/lib/python3.6/site-packages/urllib3/util/ssl_.py:281: in create_urllib3_context
    context.options |= options
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py:465: in options
    super(SSLContext, SSLContext).options.__set__(self, value)
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py:465: in options
    super(SSLContext, SSLContext).options.__set__(self, value)
E   RecursionError: maximum recursion depth exceeded while calling a Python object
!!! Recursion detected (same locals & position)

Спасибо!

ОБНОВЛЕНИЕ 1 Я добавил:

import eventlet
eventlet.monkey_patch()

, прежде чем что-либо еще вмой conftest.py и теперь я получаю эту ошибку:

            except OSError as err: # timeout error
>               raise URLError(err)
E               urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:847)>

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py:1320: URLError

ОБНОВЛЕНИЕ 2 Вторая проблема с версией Python OpenSSL, я решил ее, следуя совету из этого поста:

ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] проверка сертификата не удалась (_ssl.c: 749)

1 Ответ

1 голос
/ 10 марта 2019

Это выглядит как плохое взаимодействие между gevent и requests, как описано в этой проблеме

Убедитесь, что при использовании gevent вы также исправляете его вtest - ваш корень conftest.py является хорошим местом для установки кода исправления gevent:

from gevent import monkey
monkey.patch_all()
...