要真凭据的用例打标记统一剔除

Edge TTS 那条要连微软公网,runner 的出口 IP 会被风控挡掉。以前在 CI 命令行上用 -k 排除,看不出排掉了什么。现在给它打 live_api 标记,由 conftest 统一剔除,日志里列出剔的是哪几条。
This commit is contained in:
hrz committed 2026-10-24 07:27:15 +00:00
1 parent e3e043a9ed
commit aff47ee6de
4 files changed
+40 -6

No files matched your search

+3 -3
View File
@@ -42,9 +42,9 @@ jobs:
- name: Run tests
working-directory: main/xiaozhi-server
run: |
# Edge TTS 那条要连微软公网,runner 的出口 IP 会被风控挡掉,先排除。
# 根治办法是给它打 live 标记,让 mock 模式下自动不收(另开一条改)
pytest tests/ -v -k "not test_tts_text_to_speak_writes_file"
# 要真凭据/真网络的用例由 tests/conftest.py 按 live_api 标记统一剔除,
# 剔掉的是哪几条会打在日志里
pytest tests/ -v
java:
name: Java (manager-api)
+3
View File
@@ -5,6 +5,9 @@ python_files = ["test_*.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]
addopts = "-ra"
markers = [
"live_api: 需要真凭据或真网络的用例,mock 模式下由 conftest 剔除并列出",
]
filterwarnings = [
"ignore::DeprecationWarning",
]
+30 -3
View File
@@ -454,8 +454,35 @@ import pytest # noqa: E402 (after conftest hooks so pytest is initialised)
def pytest_collection_modifyitems(config, items):
"""Live 模式下:``live_api`` 标记的测试必须配齐密钥才能跑(否则 skip)。"""
"""Mock 模式下:``live_api`` 标记的用例要真凭据或真网络,不收,并列出是哪几条。
以前是在 CI 命令行上用 ``-k`` 排除,看不出排掉了什么、为什么排。
改成打标记 + 这里统一剔除,日志里会一条条列出来,剔了什么一目了然。
"""
if LIVE_API_TESTS:
return
# Mock 模式下不强行 skip:测试应该都能跑(用 shim)。
return
keep = []
drop = []
for item in items:
if "live_api" in item.keywords:
drop.append(item)
else:
keep.append(item)
if not drop:
return
print(
"\n[conftest] 下面这些用例要真凭据或真网络,mock 模式下不收:",
flush=True,
)
for item in drop:
print(f"[conftest] - {item.nodeid}", flush=True)
print(
"[conftest] 真请求模式:export RUN_LIVE_API_TESTS=1 并配好凭据后再跑。\n",
flush=True,
)
config.hook.pytest_deselected(items=drop)
items[:] = keep
+4
View File
@@ -81,9 +81,13 @@ def test_tts_provider_has_output_dir() -> None:
assert provider.output_file, "output_file 不应为空"
@pytest.mark.live_api
def test_tts_text_to_speak_writes_file() -> None:
"""Mock 模式:断言 file 存在即可。Live 模式:断言 size > 0。
这条要连微软公网,runner 的出口 IP 会被风控挡掉,所以打了 live_api 标记:
mock 模式下由 conftest 统一剔除(会列出剔的是哪几条),live 模式下才收。
参考 performance_tester_tts.py 的实现:
- mock conn(sample_rate/audio_format/stop_event/client_abort/headers)
和 opus_encoder(SimpleNamespace 占位即可)