python - 使用 pytest 中的 AdWordsClient 时出错 - 检测到递归(相同的局部变量和位置)

标签 python google-analytics pytest google-ads-api

我需要编写一组测试来检查对 Google AdWords API 的某些调用是否带来了正确的数据。

为此,我编写了一个生成 google 客户端的固定方法:

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

    return client

然后我有一个方法尝试连接到 Google API,但甚至在此之前,就在尝试获取报告下载器时

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] certificate verify failed (_ssl.c:749)

最佳答案

这看起来像是 geventrequests 之间的不良交互,如 this issue 中所述。

如果您使用的是 gevent,请确保您也对其进行了测试补丁 - 您的根目录 conftest.py 是放置 gevent 补丁代码的好地方:

from gevent import monkey
monkey.patch_all()

关于python - 使用 pytest 中的 AdWordsClient 时出错 - 检测到递归(相同的局部变量和位置),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55087351/

相关文章:

javascript - 在 Flask 中完成调查后重定向用户不起作用

python - 即使文件存在,文件 b'train.csv' 也不存在

Python 2.6 - 解析参数

javascript - 防止 Google Optimize 中的 2 个实验重叠?

python - pytest-cov 如何报告由于 pexpect.spawn 而执行的 python 代码的覆盖率?

python - 使用正则表达式查找两个字符串之间的所有匹配项

javascript - 使用 Google 标签管理器发送优惠券数据

google-analytics - Google Analytics Reporting API V4 batchGet 方法需要 viewEd,但如何找到它?

python - 为主要功能测试设置命令行参数

Python 和 pytest 测试