下面是Google Cloud Functions python测试示例:https://cloud.google.com/functions/docs/testing/test-http
import os
import subprocess
import uuid
import requests
from requests.packages.urllib3.util.retry import Retry
def test_args():
name = str(uuid.uuid4())
port = os.getenv('PORT', 8080) # Each functions framework instance needs a unique port
process = subprocess.Popen(
[
'functions-framework',
'--target', 'hello_http',
'--port', str(port)
],
cwd=os.path.dirname(__file__),
stdout=subprocess.PIPE
)
# Send HTTP request simulating Pub/Sub message
# (GCF translates Pub/Sub messages to HTTP requests internally)
BASE_URL = f'http://localhost:{port}'
retry_policy = Retry(total=6, backoff_factor=1)
retry_adapter = requests.adapters.HTTPAdapter(
max_retries=retry_policy)
session = requests.Session()
session.mount(BASE_URL, retry_adapter)
name = str(uuid.uuid4())
res = session.post(
BASE_URL,
json={'name': name}
)
assert res.text == 'Hello {}!'.format(name)
# Stop the functions framework process
process.kill()
process.wait()
在针对该测试文件运行pytest
之后,测试通过,代码几乎立即退出,但它似乎并没有杀死进程:
± ps -ef | grep functions
thoraxe 11661 1985 49 20:30 pts/0 00:00:02 /home/thoraxe/.pyenv/versions/3.9.13/envs/avogadro-trainer-3-9-13/bin/python3.9 /home/thoraxe/.pyenv/versions/3.9.13/envs/avogadro-trainer-3-9-13/bin/functions-framework --target train --port 8080
thoraxe 11684 11661 0 20:30 pts/0 00:00:00 /home/thoraxe/.pyenv/versions/3.9.13/envs/avogadro-trainer-3-9-13/bin/python3.9 /home/thoraxe/.pyenv/versions/3.9.13/envs/avogadro-trainer-3-9-13/bin/functions-framework --target train --port 8080
我在Fedora的虚拟环境中使用Python 3.9.13。
由于这是来自谷歌的示例代码,我希望它能起作用,但有些东西在这里肯定不起作用。有人能告诉我可能做错了什么吗?
当Python断言失败时,程序将立即退出,不再继续。除非测试成功,否则绝不会实际执行kill/wait。这是一个主要的障碍,因为函数框架将继续在后台运行,并且在随后的pytest
运行中显然不会发现新的代码更改。
使用不同的包装器框架,如https://github.com/okken/pytest-check解决了问题,因为即使出现故障,也会执行所有步骤。
但是,请注意,合法的Python失败/错误/爆炸仍然会导致函数框架无法正确退出。