多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

ScrapeGraphAI 测试基础设施全解析:从 pytest 配置到 CI/CD 的完整实战指南

ScrapeGraphAI 测试基础设施全解析:从 pytest 配置到 CI/CD 的完整实战指南 网页爬虫人工智能AI 应用【免费下载链接】Scrapegraph-aiPython scraper based on AI项目地址https://gitcode.com/GitHub_Trending/sc/Scrapegraph-ai点击查看免费下载本篇技术指南以仓库根目录下的 TESTING_INFRASTRUCTURE.md 为主干结合pytest.ini、tests/conftest.py、tests/fixtures/ 与 .github/workflows/test-suite.yml 等真实源码系统拆解 ScrapeGraphAI 的增强测试体系。你将掌握其单元测试、集成测试、性能基准测试的组织方式学会使用 Mock HTTP 服务器与共享 fixtures 编写可复现的测试并理解 GitHub Actions 中从单元测试到覆盖率报告的全自动流水线从而能够直接在本仓库上运行、扩展与定制测试。一、测试基础设施总览ScrapeGraphAI 是一套基于 AI 的 Python 网页抓取框架核心图实现位于 scrapegraphai/graphs/。为了让这套以 LLM 为引擎的抓取逻辑在多次迭代中保持可靠仓库引入了一套全栈式增强测试基础设施覆盖四个层次单元测试借助 Mock 对象与本地 fixtures 快速验证节点、图与工具函数的逻辑不依赖任何外部网络与付费 API集成测试连接真实 LLM 提供商OpenAI、Ollama、Anthropic、Groq 等与测试网站验证端到端抓取能力性能基准测试跟踪执行时间、Token 消耗、API 调用次数实现性能回归检测自动化 CI/CD在 Ubuntu、macOS、Windows 三平台与 Python 3.10/3.11/3.12 三版本上自动执行上述全部测试。这一体系对应的文件布局为pytest.ini # pytest 与覆盖率配置位于仓库根目录 tests/ ├── conftest.py # 共享 fixtures 与自定义 pytest 插件逻辑 ├── fixtures/ │ ├── mock_server/server.py # 本地 Mock HTTP 服务器 │ ├── benchmarking.py # 性能基准框架数据类 Tracker 报告 │ ├── helpers.py # 断言辅助、Mock 响应构建、数据生成器 │ └── __init__.py ├── integration/ # 三类集成测试 │ ├── test_smart_scraper_integration.py │ ├── test_multi_graph_integration.py │ └── test_file_formats_integration.py ├── graphs/ # 图级测试如 smart_scraper_openai_test.py ├── nodes/ # 节点级测试如 fetch_node_test.py └── utils/ # 工具函数测试如 convert_to_md_test.py下文将沿配置 → 基础设施 → 测试套件 → CI/CD的顺序逐层深入。二、核心配置pytest.ini 逐项解读仓库根目录的 pytest.ini 是整个测试体系的总开关它同时承载了测试发现、标记注册、覆盖率与超时等配置。2.1 测试发现与收集规则python_files test_*.py *_test.py python_classes Test* python_functions test_* testpaths tests只要文件名以test_开头或以_test结尾都会被收集因此test_smart_scraper_multi_concat_graph.py与smart_scraper_clod_test.py这类命名都能被识别类名必须以Test开头、函数名必须以test_开头testpaths tests限定默认只在 tests/ 目录内收集配合norecursedirs排除.git、__pycache__、.venv、node_modules等目录避免误收集第三方依赖。2.2 默认运行参数addoptsaddopts -v # 详细输出 --tbshort # 精简回溯 --strict-markers # 未注册的 marker 直接报错 --covscrapegraphai # 覆盖率统计对象 --cov-reportterm-missing --cov-reporthtml:htmlcov --cov-reportxml --cov-branch # 分支覆盖率 --durations10 # 展示最慢的 10 个测试 -W default --strict-config --coloryes这些默认参数意味着直接运行pytest就会自动附带覆盖率统计与耗时排名无需额外传参。2.3 测试标记Markersmarkers integration: Integration tests requiring network access slow: Slow-running tests llm_provider: Tests for specific LLM providers requires_api_key: Tests requiring API keys benchmark: Performance benchmark tests unit: Unit tests (fast, no external dependencies) e2e: End-to-end tests共注册 7 个自定义标记。--strict-markers保证任何测试代码中出现的 marker 都必须在此处或 tests/conftest.py 中预先注册从根源上杜绝拼写错误导致的静默跳过。2.4 超时与异步配置timeout 300 asyncio_mode auto全局单测超时为 300 秒对应 pytest-timeout 插件单个测试也可用pytest.mark.timeout(120)覆盖。asyncio_mode auto允许异步测试函数被 pytest-asyncio 自动收集执行。2.5 覆盖率细节[coverage:run]指定统计scrapegraphai包本体并排除测试代码与site-packages[coverage:report]通过exclude_lines忽略pragma: no cover、raise NotImplementedError、if TYPE_CHECKING:等非业务行precision 2将覆盖率精确到小数点后两位。注意minversion 8.0表示要求pytest 8.x及以上版本运行前请确认环境中pytest --version满足要求。三、共享 Fixtures 层tests/conftest.pytests/conftest.py 是整个测试体系的核心枢纽它聚合了 LLM 提供商配置、Mock 模型、测试数据、临时文件、性能跟踪与自定义插件钩子。运行任何测试时pytest 会自动加载该文件无需手动 import。3.1 多 LLM 提供商配置 fixtures原文档强调多提供商支持conftest 中为每个支持的服务商都提供了即插即用的配置 fixtureFixture默认模型底层依赖openai_configgpt-3.5-turboOPENAI_APIKEY环境变量缺省回落为test-keyopenai_gpt4_configgpt-4同上ollama_configollama/llama3.2OLLAMA_BASE_URL默认http://localhost:11434anthropic_configanthropic/claude-3-sonnetANTHROPIC_APIKEYgroq_configgroq/llama3-8b-8192GROQ_APIKEYazure_configazure_openai/gpt-35-turboAZURE_OPENAI_KEYAZURE_OPENAI_ENDPOINTgemini_configgemini/gemini-proGEMINI_APIKEYmulti_llm_config参数化组合依次展开 openai / ollama / anthropic / groq以 openai_config 为例其返回结构完全对齐 ScrapeGraphAI 的图配置规范pytest.fixture def openai_config() - Dict[str, Any]: api_key os.getenv(OPENAI_APIKEY, test-key) return { llm: { api_key: api_key, model: gpt-3.5-turbo, temperature: 0, }, verbose: False, headless: True, }temperature: 0保证输出确定性headless: True关闭浏览器渲染这些默认值都是为了测试可重复。multi_llm_config是参数化 fixture用它在同一个测试函数上可以自动生成针对多个提供商的用例。3.2 Mock LLM 与 Mock Embedder单元测试不触碰真实 API靠的是mock_llm_model与mock_embedder_modeltests/conftest.pypytest.fixture def mock_llm_model(): mock Mock() mock.model_name mock-model mock.predict Mock(return_valueMocked LLM response) mock.invoke Mock(return_valueMocked LLM response) return mockMock 对象同时实现了predict与invoke两个接口覆盖了不同版本 LangChain LLM 的调用约定让底层节点如 generate_answer_node.py无需任何网络请求即可完成全链路单元测试。3.3 测试数据与临时文件 fixtures内容型 fixturesample_html含产品/项目列表的标准 HTML、sample_json_data公司信息 JSON、sample_xml员工 XML、sample_csv人员 CSV为不同格式的 ScraperGraph 提供输入文件型 fixturetemp_json_file、temp_html_file、temp_xml_file、temp_csv_file基于 pytest 内置的tmp_path将上述内容落盘为真实临时文件返回文件路径字符串正好匹配JSONScraperGraph、XMLScraperGraph、CSVScraperGraph等图对source参数的支持。3.4 性能跟踪 fixturesbenchmark_config提供基准配置warmup_runs: 1、test_runs: 3、timeout: 60performance_tracker返回收集执行时间、Token 用量与 API 调用次数的指标字典供测试自行记录。3.5 Mock Server fixturesmock_server在 localhost:8888 启动 HTTP 服务详见下一节mock_server_url给出其基础 URLmock_website_url则指向可被TEST_WEBSITE_URL覆盖的线上测试站点。3.6 自定义 pytest 钩子按标记自动跳过conftest 中定义了三个关键的钩子tests/conftest.pypytest_configure动态注册 integration / slow / llm_provider / requires_api_key / benchmark 五个标记与 pytest.ini 中的注册互补pytest_addoption新增--integration、--slow、--benchmark三个开关型命令行参数pytest_collection_modifyitems在收集阶段自动给未加开关的 integration / slow 测试打上skip标记对requires_api_key测试则检查OPENAI_APIKEY、ANTHROPIC_APIKEY、GROQ_APIKEY三者中是否存在任一环境变量若都没有就跳过——这让没有密钥的开发者也能安全地跑完整个测试目录。四、Mock HTTP 服务器tests/fixtures/mock_server原文档重点介绍了一个功能完整的本地 HTTP 服务器其实现位于 tests/fixtures/mock_server/server.py。它基于标准库http.server与线程实现无需安装任何外部服务核心价值是让基础测试完全不依赖外网。4.1 端点清单与文档一致含底层行为说明端点返回内容底层实现要点/首页含导航链接静态 HTML/products3 个产品条目名称/描述/价格/库存状态静态 HTML带data-id、product-name等语义化 class/projects2 个项目条目标题/描述静态 HTML/api/data.json公司 员工 JSONContent-type: application/json/api/data.xml公司 员工 XMLContent-type: application/xml/api/data.csv员工 CSVContent-type: text/csv/slow延迟 2 秒后返回简单 HTML内部time.sleep(2)/error/404404 错误页真实 HTTP 404 状态码/error/500500 错误页真实 HTTP 500 状态码/rate-limited前 5 次正常返回第 6 次起返回 429 Retry-After: 60按客户端 IP 计数见下方代码/dynamic带时间戳的动态内容每次请求内容不同/pagination?pageN每页 10 条、共 50 条的翻页列表解析 query 参数生成/rate-limited的实现揭示了它的工作方式tests/fixtures/mock_server/server.py按client_address[0]计数超过 5 次后返回 429 并携带Retry-After: 60头——这正是测试重试逻辑与限流处理的理想靶场。4.2 服务器生命周期MockHTTPServer封装了完整生命周期start()在后台守护线程中运行serve_foreverstop()执行shutdown()与server_close()get_url(path)拼接完整 URL同时实现了上下文管理器__enter__/__exit__支持with MockHTTPServer() as server:的写法。conftest 中的mock_serverfixture 正是用 yield 模式确保测试结束后调用stop()清理资源。典型用法def test_with_mock_server(mock_server): url mock_server.get_url(/products) scraper SmartScraperGraph( promptExtract products, sourceurl, configconfig, )五、性能基准框架tests/fixtures/benchmarking.pybenchmarking.py 是一套自研的轻量基准框架围绕三个数据类与一个可装饰函数展开。5.1 核心组件BenchmarkResultdataclass单次运行的记录字段包括test_name、execution_time、memory_usage可选、token_usage可选、api_calls、success、error、metadataBenchmarkSummary多次运行的统计摘要包含num_runs、mean_time、median_time、std_dev、min_time、max_time、success_rate、total_tokens、total_api_callsBenchmarkTracker结果收集器核心方法为record(result)追加一条结果get_summary(test_name)用statistics.mean/median/stdev计算该测试的统计量save_results(filenamebenchmark_results.json)将全部结果导出为 JSON自动创建benchmark_results/目录generate_report()生成人类可读的文本报告按测试名分组展示各项指标。5.2 可复用的 benchmark() 函数benchmark(func, nameNone, warmup_runs1, test_runs3, trackerNone)以函数为单位执行预热 多次实测流程预热轮异常被吞掉不计入实测轮用time.perf_counter()计时并捕获异常写入BenchmarkResult若被基准函数返回 dict 且含metadata键会自动提取进结果。5.3 基准 fixture 与基线对比benchmark_trackerfixturebenchmarking.py在测试结束后自动调用save_results()落盘因此任何使用该 fixture 的基准测试都会自动产出 JSON 结果。基线对比由pytest_benchmark_compare(baseline_file, current_file)承担它加载基线 JSON 与当前 JSON按test_name对齐计算执行时间百分比变化以 ±10% 为阈值超过 10% 记为回归regressions低于 -10% 记为改进improvements仅在当前出现的记为new_tests返回结构化对比字典。实践中可按如下流程操作# 保存基线 pytest --benchmark -m benchmark cp benchmark_results/benchmark_results.json baseline.json # 运行新版本并对比 pytest --benchmark -m benchmarkfrom pathlib import Path from tests.fixtures.benchmarking import pytest_benchmark_compare comparison pytest_benchmark_compare( Path(baseline.json), Path(benchmark_results/benchmark_results.json), )六、测试工具集tests/fixtures/helpers.pyhelpers.py 提供了可复用的断言、Mock 构造、数据生成与通用工具用于提升测试的可读性与一致性。6.1 断言辅助函数assert_valid_scrape_result(result, expected_keysNone)断言结果非空且为 dict/str可选校验必含键assert_execution_info_valid(exec_info)校验图执行元信息get_execution_info()的返回值为合法 dictassert_response_time_acceptable(execution_time, max_time30.0)性能断言默认上限 30 秒assert_no_errors_in_result(result)在结果文本中检索error、exception、failed、timeout、rate limit等错误指示词命中即失败。6.2 Mock 响应构造create_mock_llm_response(content, **kwargs)生成带content、response_metadata属性的 Mock 响应create_mock_graph_result(answer, exec_info, error)返回(state, exec_info)二元组state 内含answer/error键模拟AbstractGraph的节点状态流转。6.3 数据生成器generate_test_html(titleTest Page, num_items3, item_templateItem {n})定制标题与条目数生成 HTMLgenerate_test_json(num_records3)生成含itemsid/name/description/value与total的 JSONgenerate_test_csv(num_rows3)生成id,name,value三列的 CSV。6.4 校验与通用工具validate_schema_match(data, schema_class)尝试用 Pydantic schema 类实例化数据成功返回 True——与集成测试中传入schema参数的图行为呼应validate_extracted_fields(result, required_fields, min_values1)校验提取字段存在且 list 长度达标load_test_fixture(fixture_name)与save_test_output(content, filename)读写测试文件compare_results(result1, result2, ignore_keysNone)忽略指定键后比较两个抓取结果fuzzy_match_strings(str1, str2, threshold0.8)基于分词集合重叠度的相似性判断源码注释明确说明生产环境可改用 difflib/fuzzywuzzyRateLimitHelper(max_requests, time_window)滑动窗口限流模拟器can_make_request()/record_request()配合使用retry_with_backoff(func, max_retries3, initial_delay1.0, backoff_factor2.0)指数退避重试延迟按 1s、2s、4s 递增全部失败后抛出最后一次异常。七、三层集成测试套件原文档把集成测试划分为三个文件位于 tests/integration/全部以真实 LLM 连接验证端到端行为。7.1 智能抓取集成test_smart_scraper_integration.pytests/integration/test_smart_scraper_integration.py 面向SmartScraperGraph覆盖场景包括多提供商/多场景用mock_server抓取/projects、/products校验结果与执行信息Schema 化抓取定义ProjectSchema/ProjectListSchema继承pydantic.BaseModel传入schema参数验证结构化输出超时处理抓取/slow端点通过config[loader_kwargs] {timeout: 5000}配置 5 秒加载超时错误条件抓取/error/404断言要么优雅返回、要么异常信息包含404/not found真实网站TestRealWebsiteIntegration使用mock_website_url默认指向测试站点可由TEST_WEBSITE_URL覆盖做真实网络抓取性能基准TestSmartScraperPerformance用benchmark_tracker记录smart_scraper_basic的执行时间并断言 30 秒。典型集成测试骨架直接来自源码pytest.mark.integration pytest.mark.requires_api_key class TestSmartScraperIntegration: def test_scrape_with_openai(self, openai_config, mock_server): url mock_server.get_url(/projects) scraper SmartScraperGraph( promptList all projects with their descriptions, sourceurl, configopenai_config, ) result scraper.run() assert_valid_scrape_result(result) exec_info scraper.get_execution_info() assert_execution_info_valid(exec_info)7.2 多图并发集成test_multi_graph_integration.pytests/integration/test_multi_graph_integration.py 覆盖SmartScraperMultiGraph的并发抓取、多页面性能基准与SearchGraph集成专门验证多源并行场景的正确性。7.3 文件格式集成test_file_formats_integration.pytests/integration/test_file_formats_integration.py 同时覆盖 JSON、XML、CSV 三种格式每种都分别验证本地文件输入与Mock URL 输入两条路径例如JSONScraperGraph既抓temp_json_file也抓/api/data.json。八、CI/CD 自动化流水线原文档描述的 6 个 Job 在 .github/workflows/test-suite.yml 中均有对应实现这里对照源码逐项说明。8.1 触发器on: push: branches: [main, pre/beta, dev] pull_request: branches: [main, pre/beta] workflow_dispatch:推送至 main / pre/beta / dev、PR 合入 main / pre/beta、以及手动触发三种方式都会启动流水线。所有 Job 都先执行uv sync安装依赖并playwright install chromium安装抓取所需的浏览器内核。8.2 六个 Job 的职责与实现Job关键配置要点unit-tests矩阵3 个 OS × 3 个 Python 版本命令pytest tests/ -m unit or not integration --cov --cov-reportxml仅 Ubuntu3.11 组合上传覆盖率到 Codecovintegration-tests矩阵smart-scraper / multi-graph / file-formats注入OPENAI_APIKEY、ANTHROPIC_APIKEY、GROQ_APIKEY三个 secret运行pytest tests/integration/ -m integration --integration -v无论成败都上传htmlcov/与benchmark_results/产物benchmark-tests单 Job注入OPENAI_APIKEY运行pytest tests/ -m benchmark --benchmark -v上传benchmark_results/PR 场景预留基线对比步骤code-quality单 Job依次执行ruff check scrapegraphai/ tests/、black --check、isort --check-only、mypy scrapegraphai/mypy 为continue-on-error不阻断流水线test-coverage-reportneeds: [unit-tests, integration-tests]下载各 Job 覆盖率产物PR 时通过python-coverage-comment-action在 PR 上评论覆盖率变化test-summaryneeds: [unit-tests, integration-tests, code-quality]汇总输出各 Job 的最终状态值得注意的工程细节fail-fast: false保证某个 OS/Python 组合失败不会取消其余组合集成测试对真实 LLM 提供商的覆盖依赖 GitHub Secrets 注入密钥本地无密钥时对应用例会被 conftest 自动跳过基准对比与覆盖率评论步骤在流水线中以预留占位方式存在实际执行时会输出对应提示信息。8.3 查看结果单元测试与集成测试产物以 artifact 形式上传可在 Actions 页面下载htmlcov/与benchmark_results/覆盖率 XML 通过 Codecov Action 上报基准 JSON 保留在benchmark_results/中用于后续对比。九、测试标记矩阵与灵活执行命令9.1 标记一览Marker语义典型用途pytest.mark.unit快速单元测试无外部依赖Mock LLM 驱动的节点/工具测试pytest.mark.integration需网络访问的集成测试真实 LLM Mock Server / 真实网站pytest.mark.slow耗时长的测试如/slow端点、真实网站抓取pytest.mark.benchmark性能基准测试记录执行时间并断言上限pytest.mark.requires_api_key需要 API 凭据无密钥时被自动跳过pytest.mark.llm_provider(name)指定 LLM 提供商按提供商精确过滤pytest.mark.e2e端到端测试完整抓取链路验证多标记可叠加例如 test_smart_scraper_integration.py 中真实网站测试同时挂了integration、slow、requires_api_key三个标记。9.2 常用执行命令# 全部测试自动附带覆盖率与最慢 10 项统计 pytest # 仅单元测试默认命令的等价写法 pytest -m unit or not integration # 集成测试显式开启开关否则会被自动跳过 pytest --integration # 性能基准 pytest --benchmark -m benchmark # 慢速测试 pytest --slow # 带 HTML 覆盖率报告 pytest --covscrapegraphai --cov-reporthtml # 运行指定文件 pytest tests/integration/test_smart_scraper_integration.py # 详细输出 pytest -v9.3 环境变量集成测试依赖以下环境变量对应 conftest 与工作流中的注入# LLM API 密钥 export OPENAI_APIKEYsk-... export ANTHROPIC_APIKEYsk-ant-... export GROQ_APIKEYgsk_... export GEMINI_APIKEY... # Azure OpenAI export AZURE_OPENAI_KEY... export AZURE_OPENAI_ENDPOINThttps://... # 测试目标与本地模型 export TEST_WEBSITE_URLhttps://scrapegrah-ai-website-for-tests.onrender.com export OLLAMA_BASE_URLhttp://localhost:11434十、编写新测试三类模板原文档提供了三类可直接套用的模板此处与仓库实际测试风格对齐后给出。10.1 单元测试模板import pytest from unittest.mock import Mock, patch class TestMyFeature: pytest.fixture def setup(self): Setup fixture for tests. return {data: value} def test_my_function(self, setup, mock_llm_model): Test description. # Arrange # Act # Assert10.2 集成测试模板import pytest from scrapegraphai.graphs import SmartScraperGraph pytest.mark.integration pytest.mark.requires_api_key class TestMyIntegration: def test_real_scraping(self, openai_config, mock_server): Test with real LLM provider. url mock_server.get_url(/test-page) scraper SmartScraperGraph( promptExtract data, sourceurl, configopenai_config, ) result scraper.run() assert result is not None assert isinstance(result, dict)10.3 基准测试模板import pytest import time from tests.fixtures.benchmarking import BenchmarkResult pytest.mark.benchmark class TestMyBenchmark: def test_performance(self, benchmark_tracker, openai_config): Benchmark test description. start time.perf_counter() # Run operation to benchmark end time.perf_counter() result BenchmarkResult( test_namemy_benchmark, execution_timeend - start, successTrue, ) benchmark_tracker.record(result)使用benchmark_trackerfixture 后测试结束会自动调用tracker.save_results()将结果写入benchmark_results/benchmark_results.json该目录由 BenchmarkTracker 自动创建。十一、常见问题排障测试超时全局超时在 pytest.ini 中为 300 秒单测可用pytest.mark.timeout(120)单独放大。API 限流优先改用 Mock Server 的/rate-limited端点需要程序化控制时使用RateLimitHelper(max_requests5, time_window60)。测试不稳定Flaky可借助 pytest-rerunfailures 的pytest.mark.flaky(reruns3, reruns_delay2)自动重试。无密钥导致跳过集成测试被跳过属预期行为配置第三节中的任一 API 密钥环境变量即可放行。十二、当前路线与后续演进原文档在 Next Steps 中给出了明确的演进方向这些同样可作为社区贡献入口为更多图类型如DepthSearchGraph、SpeechGraph、ScreenshotScraperGraph等补充集成测试扩展 Mock Server 以覆盖更真实的场景如表单提交、iframe、认证页引入基于截图对比的视觉回归测试通过 mutation testing 评估测试用例质量引入 Hypothesis 进行基于属性的测试建设性能趋势可视化看板针对并发抓取场景增加负载测试。十三、给贡献者的测试约定原文档对新增测试提出了明确规范汇总如下优先复用 tests/conftest.py 中的既有 fixtures避免重复造轮子为测试添加合适的标记pytest.mark.*确保过滤与自动跳过逻辑正确遵循现有测试目录结构tests/graphs/、tests/nodes/、tests/utils/、tests/integration/与命名约定test_*.py/*_test.py在文档中说明测试对 API 密钥、网络等外部条件的要求提交前确保本机pytest全绿CI 中的六类 Job 全部通过。完整的运行与编写指引还可参考 tests/README_TESTING.md它是这套基础设施配套的开发者手册其中包含目录结构图、fixtures 清单与排障说明。结语ScrapeGraphAI 的增强测试基础设施从 pytest.ini 的标记与覆盖率体系到 tests/conftest.py 的多提供商 fixtures 与自动跳过钩子再到 tests/fixtures/mock_server/server.py 的本地 HTTP 靶场与 benchmarking.py 的回归检测最后汇入 .github/workflows/test-suite.yml 的跨平台 CI 流水线构成了一条无密钥也能跑、有密钥更全面、性能有监控、回归有预警的完整质量保障链路。无论是为仓库补充新图类型的测试还是在本机快速验证抓取逻辑这套体系都能直接为你所用。赞分享网页爬虫人工智能AI 应用【免费下载链接】Scrapegraph-aiPython scraper based on AI项目地址https://gitcode.com/GitHub_Trending/sc/Scrapegraph-ai点击查看免费下载相关推荐ClickHouse v24.10.2.80-stable 版本更新全解析并行副本、查询优化与稳定性修复ClickHouse v24.10.2.80 stable 版本更新全解析并行副本、查询优化与稳定性修复 导读 本文围绕 ClickHouse® 实时分析数据网页爬虫人工智能AI 应用QEMU 测试基础设施完全指南从 make check 到容器化 CI 的测试体系详解QEMU 测试基础设施完全指南从 make check 到容器化 CI 的测试体系详解 导读 本文基于 QEMU 官方开发文档 docs/devel/tes虚拟化硬件仿真pytest-mock配置完全指南从基础到高级Mock测试优化pytest mock配置完全指南从基础到高级Mock测试优化 你是否在使用pytest mock时遇到过Mock版本冲突是否因断言错误信息模糊而浪费数小时开发工具上一篇zyfun播放器如何构建终极跨平台视频播放器的完整指南下一篇C Web开发终极指南使用cpp-httplib构建数据驱动应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表