当前位置: 首页 > news >正文

Pytest跳过测试:@pytest.mark.skip与skipif的深度解析与实践指南

1. 项目概述:为什么我们需要“跳过”测试?

在自动化测试的世界里,尤其是当你使用像 Pytest 这样强大而灵活的框架时,你可能会遇到一个看似矛盾的需求:如何让一个测试用例“不执行”?乍一听,这有点反直觉,测试不就是为了执行吗?但实际工作中,这种需求几乎每天都会出现。

想象一下这个场景:你正在开发一个新功能,对应的测试用例也写好了。但突然,依赖的第三方服务接口挂了,或者你发现了一个已知但暂时无法修复的缺陷,又或者某个测试用例只适用于特定的操作系统环境。如果让这些测试强行执行,结果必然是失败。这不仅会污染你的测试报告,让你无法快速识别出真正的新问题,还会浪费宝贵的 CI/CD 流水线时间。更糟糕的是,它可能让团队对测试结果失去信心,觉得“反正总是有失败的,无所谓了”。

这就是@pytest.mark.skip()装饰器存在的意义。它不是测试框架的“漏洞”,而是一个精密的流程控制工具。它的核心价值在于:让你能够以一种受控的、可追溯的、团队协作友好的方式,暂时将某些测试用例排除在常规执行流程之外。这就像是在一个复杂的装配线上,为某个暂时需要维护的工位贴上“暂停使用,待检修”的标签,而不是让它生产出残次品,或者干脆把整条线停掉。

Pytest 提供的跳过机制,远比简单的“注释掉代码”要强大和优雅得多。注释掉的代码会从版本控制中“消失”,团队其他成员不知道你为什么注释,未来也可能忘记恢复。而@pytest.mark.skip()则是一种声明式的、带原因的、可被测试框架识别和报告的“暂停”指令。它告诉框架和所有阅读代码的人:“这个测试我知道有问题,我跳过了,原因是XXX,等条件Y满足后我会恢复它。”

在接下来的内容里,我会结合我多年在大型项目中使用 Pytest 进行单元测试、接口自动化和 UI 自动化的经验,为你彻底拆解@pytest.mark.skip()。我们不仅会看它的基本用法,更要深入理解其应用场景、背后的原理、如何与条件跳过结合,以及那些只有踩过坑才知道的“最佳实践”和“常见陷阱”。

2.@pytest.mark.skip基础:你的第一个“暂停”按钮

让我们从最基础的开始。@pytest.mark.skip是 Pytest 标记(Mark)体系中的一个内置标记。标记是 Pytest 的一个核心概念,它允许你为测试函数或类添加元数据,从而改变测试运行的行为。

2.1 基本语法与快速上手

使用它非常简单,直接在你想跳过的测试函数上方添加这个装饰器即可。

import pytest def test_normal_case(): assert 1 + 1 == 2 @pytest.mark.skip def test_to_be_skipped(): # 这个函数根本不会被执行 assert 1 == 2 # 即使是一个显然会失败的断言,也不会触发 def test_another_normal_case(): assert 3 * 3 == 9

当你运行pytest命令时,输出会清晰地显示test_to_be_skipped被跳过了:

collected 3 items test_example.py::test_normal_case PASSED test_example.py::test_to_be_skipped SKIPPED test_example.py::test_another_normal_case PASSED

注意状态是SKIPPED,而不是FAILEDPASSED。在 Pytest 的总结报告里,跳过的测试会被单独归类,让你一目了然有多少测试被主动跳过。

2.2 添加跳过原因:让协作更清晰

只跳过而不说明原因,是一种糟糕的实践。几天后,你自己可能都会忘记为什么跳过它。Pytest 允许你通过reason参数来提供一个字符串说明。

@pytest.mark.skip(reason="依赖的支付网关API正在维护,预计明天恢复") def test_payment_gateway_integration(): # 测试支付接口的代码 pass

这个reason会在测试报告和控制台输出中显示,对于团队协作和问题追踪至关重要。它回答了三个关键问题:(通过代码提交记录)、何时为什么跳过了这个测试。

2.3 跳过整个测试类

跳过标记不仅可以应用于函数,也可以应用于类。类上的标记会作用于其内部的每一个测试方法。

import pytest @pytest.mark.skip(reason="整个旧版API模块已废弃,相关测试暂停") class TestLegacyAPI: def test_old_endpoint_a(self): pass def test_old_endpoint_b(self): pass # 这个类下的所有测试都会被跳过

这在重构或废弃某个大模块时非常有用,你可以一次性禁用所有相关测试,而不是逐个函数去添加装饰器。

实操心得一:reason的书写规范在我经历的项目中,我们强制要求reason必须清晰且可操作。好的reason像是一个工单链接或一个明确的修复条件。例如:

  • “JIRA-1234: 用户服务返回数据格式变更,待适配”
  • “跳过条件:当环境变量 ENV=‘prod’ 时,此测试不运行”
  • “已知缺陷:在Chrome v115版本下元素无法定位,待浏览器升级”避免使用模糊的原因如“有问题”“暂时跳过”。清晰的reason是技术债的“借条”,提醒团队记得“偿还”。

3. 进阶利器:@pytest.mark.skipif条件跳过

如果@pytest.mark.skip是手动开关,那么@pytest.mark.skipif就是智能感应开关。它允许测试在满足特定条件时才跳过,否则照常执行。这是处理环境差异、版本依赖等问题的终极武器。

3.1 理解skipif的工作机制

@pytest.mark.skipif接受两个主要参数:

  1. condition: 一个布尔表达式。如果求值为True,则跳过测试;如果为False,则执行测试。
  2. reason: 跳过原因(同样重要)。

它的基本语法如下:

@pytest.mark.skipif(condition, reason="解释为什么在这个条件下跳过") def test_something(): pass

3.2 经典应用场景与示例

场景一:操作系统特定测试你的某个功能或测试只适用于 Windows,在 Linux 上无法运行或没有意义。

import sys import pytest @pytest.mark.skipif(not sys.platform.startswith("win"), reason="此测试仅适用于Windows平台") def test_windows_specific_feature(): # 调用Windows API或检查Windows注册表的代码 assert sys.platform.startswith("win")

场景二:Python 版本限制你的代码库需要支持多个 Python 版本,但某个新测试使用了只有高版本才支持的语法或库。

import sys import pytest PYTHON_VERSION = sys.version_info @pytest.mark.skipif(PYTHON_VERSION < (3, 8), reason="使用了Python 3.8才引入的walrus运算符(:=)") def test_using_walrus_operator(): # 这个测试在Python 3.8以下版本会被跳过 data = [1, 2, 3] if (n := len(data)) > 2: # 海象运算符 assert n == 3

场景三:依赖项检查测试依赖于某个外部服务或特定版本的库,如果不存在则跳过。

import pytest import importlib # 尝试导入一个可选的依赖包 opencv_spec = importlib.util.find_spec("cv2") has_opencv = opencv_spec is not None @pytest.mark.skipif(not has_opencv, reason="需要OpenCV库来运行图像处理测试") def test_image_processing(): import cv2 # ... 图像处理测试代码

场景四:环境变量控制这是一个非常强大的模式,常用于区分本地开发、测试环境和生产环境。

import os import pytest IN_CI_ENVIRONMENT = os.getenv("CI") == "true" @pytest.mark.skipif(IN_CI_ENVIRONMENT, reason="在CI环境中跳过耗时长的性能测试") def test_long_performance_benchmark(): # 这个测试可能需要运行几分钟,不适合在每次提交都运行的CI流水线中执行 import time time.sleep(60) # 模拟长时间运行 assert True

3.3 将条件定义为共享变量

当多个测试共享相同的跳过条件时,为了避免重复代码,可以将条件定义为模块级或conftest.py中的变量。

# 在 conftest.py 或测试模块顶部定义 import sys ON_MACOS = sys.platform == "darwin" PYTHON_3_10_OR_ABOVE = sys.version_info >= (3, 10) # 在测试中使用 @pytest.mark.skipif(ON_MACOS, reason="MacOS上存在已知的字体渲染问题,导致截图比对失败") def test_ui_screenshot_match(): pass @pytest.mark.skipif(not PYTHON_3_10_OR_ABOVE, reason="此模式匹配语法需要Python 3.10+") def test_pattern_matching(): pass

实操心得二:条件表达式的复杂性与可读性skipif的条件表达式可以很复杂,但切记可读性优先。一个复杂的布尔表达式会大大增加代码的维护成本。

反面教材

@pytest.mark.skipif( (sys.platform == "linux" and os.getenv("DISPLAY") is None) or (sys.version_info < (3, 7) and importlib.util.find_spec("asyncpg") is None), reason="复杂且难以理解的条件" )

推荐做法:将复杂条件分解,赋予有意义的变量名。

IS_HEADLESS_LINUX = sys.platform == "linux" and os.getenv("DISPLAY") is None IS_OLD_PYTHON_WITHOUT_ASYNC_PG = sys.version_info < (3, 7) and not has_asyncpg @pytest.mark.skipif( IS_HEADLESS_LINUX or IS_OLD_PYTHON_WITHOUT_ASYNC_PG, reason="在无显示器的Linux服务器或旧Python无asyncpg环境下跳过" )

4. 底层原理与执行流程剖析

理解skipskipif在 Pytest 内部是如何工作的,能帮助你在遇到复杂情况时进行调试,并更好地利用它们。

4.1 Pytest 的收集与执行阶段

Pytest 的执行大致分为两个阶段:

  1. 收集阶段:Pytest 发现所有符合条件的测试项(函数、类)。
  2. 执行阶段:逐个执行收集到的测试项。

skipskipif的决策点主要发生在收集阶段末尾执行阶段初期。当 Pytest 收集到一个带有skipskipif标记的测试项时,它并不会立即决定跳过,而是将信息存储起来。

4.2skipskipif的决策时机

  • 对于@pytest.mark.skip:这个决定是绝对的。在收集阶段,Pytest 就知道这个测试必须跳过。因此,在执行阶段,该测试函数根本不会被调用,直接报告为SKIPPED
  • 对于@pytest.mark.skipif:情况更有趣。条件 (condition) 的求值发生在每个测试项的执行阶段开始时。这意味着:
    • 条件表达式可以引用在测试设置(例如fixture)中定义的变量。
    • 如果条件表达式本身执行了某些操作(如读取文件、调用网络),这些操作会在每次测试尝试执行时发生。
    • 这也解释了为什么skipif的条件可以非常动态。

4.3 从钩子函数看跳过机制

Pytest 的插件系统允许你通过钩子函数介入其生命周期。与跳过相关的关键钩子是pytest_runtest_setup(在测试执行前调用)和pytest_runtest_makereport。实际上,skip标记的内部实现会抛出一个特殊的pytest.skip.Exception。当 Pytest 捕获到这个异常时,它就明白应该将这个测试结果标记为“跳过”,而不是“失败”。

你可以(虽然很少需要)手动模拟这个过程:

def test_manual_skip(): import os if not os.path.exists("/tmp/required_file.txt"): pytest.skip("必要的文件不存在,跳过测试") # ... 正常的测试逻辑

pytest.skip()函数在底层就是抛出了上述异常。这在某些动态跳过的场景中很有用,比如你的跳过条件需要在测试fixture执行后才能确定。

注意事项:skipxfail的区别初学者常混淆skip@pytest.mark.xfail(预期失败)。它们的核心区别在于期望值

  • skip不执行测试。我不知道它通过还是失败,因为当前条件不满足执行要求。用于环境问题、依赖缺失、已知不适用场景。
  • xfail执行测试,但我预期它会失败。如果它失败了,测试报告显示XFAIL(符合预期);如果它意外通过了,报告显示XPASS(这通常是个惊喜,可能需要你去掉xfail标记)。用于测试已知的、计划修复的缺陷。

简单记:skip是“不做”,xfail是“做,但预计会搞砸”。

5. 实战中的高级模式与组合用法

掌握了基础之后,我们来看看如何在实际项目中组合使用这些标记,解决更复杂的问题。

5.1 跳过标记与 Fixture 的协作

Fixture 是 Pytest 的另一个核心特性。跳过标记可以和 Fixture 很好地结合。

模式一:在 Fixture 中根据条件跳过测试有时,跳过与否取决于 Fixture 的初始化结果。

import pytest @pytest.fixture def database_connection(): """尝试建立数据库连接,如果失败则跳过所有依赖此连接的测试""" try: conn = create_db_connection() # 假设的函数 yield conn conn.close() except ConnectionError: pytest.skip("无法建立数据库连接,跳过所有相关测试") def test_query_users(database_connection): # 如果 database_connection fixture 跳过了,这个测试根本不会执行到这里 result = database_connection.execute("SELECT * FROM users") assert len(result) > 0

在这个例子中,如果create_db_connection()失败,pytest.skip()会在 Fixture 中直接被调用,导致所有依赖database_connection的测试在开始执行前就被跳过。

模式二:为 Fixture 本身添加跳过标记Pytest 允许你给 Fixture 加标记,但这通常是通过间接方式影响测试。

import pytest import sys @pytest.fixture @ pytest.mark.skipif(sys.platform == "win32", reason="Windows上不支持此驱动") def special_hardware_driver(): # 初始化特定硬件驱动 driver = LinuxOnlyDriver() yield driver driver.cleanup()

给 Fixture 加skipif的效果是:任何使用了special_hardware_driverfixture 的测试,在 Windows 平台上都会被跳过,因为 Fixture 本身无法被成功初始化。

5.2 类级别标记与方法级别标记的优先级

当一个测试方法同时继承了类上的跳过标记,又有自己的跳过标记时,Pytest 的处理逻辑是:任何一个跳过条件被触发,测试就会被跳过。并且,执行顺序是从外到内(类->方法),但只要有skip发生,就会终止。

import pytest import sys @pytest.mark.skipif(sys.version_info < (3, 9), reason="整个类需要Python 3.9+") class TestNewFeatureSuite: @pytest.mark.skip(reason="这个特定方法还在开发中") def test_feature_a(self): pass def test_feature_b(self): # 这个方法只受类级别 skipif 影响 pass @pytest.mark.skipif(sys.platform == "darwin", reason="MacOS上有兼容性问题") def test_feature_c(self): # 这个方法可能因为两个原因被跳过: # 1. Python版本 < 3.9 (类级别) # 2. 平台是MacOS (方法级别) pass

5.3 使用pytest.skip()进行动态跳过

如前所述,pytest.skip(reason)函数可以在测试函数或 Fixture 的任何地方被调用,以实现动态跳过。这在跳过条件需要复杂计算或依赖运行时状态时非常有用。

def test_complex_environment_check(): # 执行一些前置检查 disk_space = get_free_disk_space() memory_available = get_available_memory() # 动态判断是否需要跳过 if disk_space < 1024 * 1024 * 1024: # 小于1GB pytest.skip(f"磁盘空间不足(仅剩{disk_space}字节),跳过此耗磁盘测试") if memory_available < 512 * 1024 * 1024: # 小于512MB pytest.skip(f"内存不足(仅剩{memory_available}字节),跳过此耗内存测试") # ... 执行实际的、资源密集型的测试

6. 常见问题、陷阱与排查技巧

即使是一个简单的装饰器,在实际使用中也会遇到各种意想不到的问题。下面是我总结的一些常见坑点和解决思路。

6.1 问题一:标记不生效,测试依然被执行

可能原因及排查:

  1. 拼写错误:检查是@pytest.mark.skip而不是@pytest.mark.skipp@pytest.skip
  2. Pytest 版本过低:确保你使用的 Pytest 版本支持这些标记。通常现代版本都支持。
  3. 标记未注册(自定义标记混淆)skipskipif是内置标记,无需注册。但如果你错误地定义了同名的自定义标记,可能会覆盖内置行为。检查pytest.inipyproject.toml中的markers配置。
  4. 条件表达式永远为 False:对于skipif,仔细检查你的condition。使用print或调试器在测试开始时输出条件值,确认其是否为预期的True
  5. 作用域问题:如果你将装饰器应用在类上,但测试方法是以unittest.TestCase风格编写的(即方法名以test_开头,但类继承自unittest.TestCase),Pytest 的标记可能无法正常工作。建议统一使用 Pytest 的原生风格。

6.2 问题二:跳过导致测试依赖链断裂

场景:测试A被跳过,而测试B依赖于测试A产生的某个状态或数据(例如通过@pytest.mark.dependency标记或隐式依赖)。

解决方案: Pytest 的跳过是独立的。如果测试B依赖于测试A的结果,而A被跳过,B很可能会因为缺少前置状态而失败。你需要重新设计测试逻辑:

  • 使用 Fixture 来提供状态,而不是依赖测试执行顺序。
  • 如果必须依赖,考虑将A和B合并成一个更大的测试,或者使用pytest.depends插件并处理跳过状态。
  • 在测试B的开始处,显式检查所需的前置条件是否满足,如果不满足则也跳过。
import pytest @pytest.mark.skip(reason="数据准备服务宕机") def test_a_prepare_data(): data = prepare() return data def test_b_process_data(): # 糟糕的设计:隐式依赖 test_a_prepare_data 先运行并成功 # 更好的设计:使用一个 fixture 来准备数据 prepared_data = get_prepared_data() # 这个函数需要能处理数据缺失的情况 if prepared_data is None: pytest.skip("前置数据未准备,跳过处理测试") result = process(prepared_data) assert result is not None

6.3 问题三:条件表达式中有副作用

陷阱:在skipifcondition中执行了修改全局状态、读写文件等操作。

counter = 0 def get_skip_condition(): global counter counter += 1 # 副作用:修改了全局变量! return counter > 1 @pytest.mark.skipif(get_skip_condition(), reason="这个条件有副作用") def test_something(): pass

每次评估条件时counter都会增加,导致测试行为不可预测。务必保证condition是纯函数(无副作用),只进行检查和返回布尔值。

6.4 问题四:跳过大量测试影响测试覆盖率

问题:如果你跳过了大量测试,你的代码覆盖率报告会大幅下降,这可能会影响项目质量门禁。

应对策略

  1. 区分“跳过”与“排除”:对于永久不适用于当前环境的测试(如Windows-only测试在Linux CI上),考虑使用pytest-k选项或自定义标记来主动选择要运行的测试,而不是被动跳过。例如,给Windows测试打上windows标记,在Linux CI上运行pytest -m "not windows"
  2. 使用覆盖率配置忽略:在.coveragerc配置文件中,可以使用omitexclude_lines选项来忽略那些因环境问题而被跳过的测试文件或代码行,使覆盖率计算更合理。
  3. 定期审查跳过的测试:将跳过的测试视为技术债。在团队站会或迭代回顾中,定期检查SKIPPED测试列表,推动修复或移除那些长期被跳过的测试。

6.5 问题排查速查表

现象可能原因排查步骤
测试未跳过,正常执行1. 装饰器拼写错误
2.skipif条件为False
3. 标记作用域错误(如用在类方法但未用在类上)
1. 检查装饰器名称
2. 在测试开头打印条件值
3. 运行pytest -v -m skip查看是否被收集为skip标记测试
测试被跳过,但报告原因不对reason参数未正确传递或格式错误检查reason=是否被正确书写,确保是字符串
在CI中跳过,本地却执行环境变量差异导致skipif条件评估不同对比CI和本地的环境变量(如CI,PYTHON_VERSION,PATH
跳过导致后续测试失败测试间存在隐式依赖重构测试,使用fixture提供共享状态,消除执行顺序依赖
pytest.skip()调用后代码仍执行pytest.skip()必须在测试函数或fixture中调用确保它是在测试执行路径中,而不是在模块顶层

7. 工程化实践:管理项目中的跳过测试

在个人小项目中,随意使用skip可能问题不大。但在大型协作项目中,无序的跳过会成为维护的噩梦。下面是一些工程化实践建议。

7.1 建立团队规范

  1. 强制要求reason:在代码审查中,拒绝任何没有提供清晰、具体reasonskipskipif
  2. 关联问题追踪:鼓励在reason中包含问题追踪系统的ID(如JIRA-XXX,GitHub Issue #YYY)。
  3. 设定跳过时限:对于因缺陷而跳过的测试,在reason中注明预期的修复版本或日期,并定期检查过期未修复的跳过项。
  4. 区分“跳过”与“排除”:明确哪些测试是永远不应该在某些环境运行的(用-m选择排除),哪些是暂时不能运行的(用skip)。

7.2 利用pytest配置进行集中管理

你可以在conftest.pypytest.ini中定义一些公共跳过条件,供整个项目使用。

conftest.py中定义共享条件:

# conftest.py import sys import pytest def pytest_configure(config): """Pytest初始化钩子,用于定义全局变量(虽然不推荐直接放这,但可做其他配置)""" pass # 定义在模块中,供其他测试模块导入 IS_WINDOWS = sys.platform == "win32" IS_LINUX = sys.platform == "linux" IS_MAC = sys.platform == "darwin" PYTHON_3_10_PLUS = sys.version_info >= (3, 10)

pytest.ini中注册自定义标记(用于选择而非跳过):

[pytest] markers = slow: marks tests as slow (deselect with '-m \"not slow\"') windows: marks tests as windows-only integration: marks tests as integration tests (require external services)

7.3 编写一个“跳过测试”的巡检脚本

可以编写一个简单的脚本,在CI流程中或定期运行,扫描代码库中所有被跳过的测试,并生成报告,督促团队处理。

# scripts/check_skipped_tests.py import ast import pathlib import re def find_skipped_tests(root_dir): skip_pattern = re.compile(r'@pytest\.mark\.(skip|skipif)') reason_pattern = re.compile(r'reason=[\"\'](.+?)[\"\']') skipped = [] for py_file in pathlib.Path(root_dir).rglob('test_*.py'): content = py_file.read_text(encoding='utf-8') tree = ast.parse(content) for node in ast.walk(tree): if isinstance(node, ast.FunctionDef) and node.name.startswith('test'): for decorator in node.decorator_list: # 简化处理:通过字符串匹配查找,更严谨应用ast解析 decorator_source = ast.get_source_segment(content, decorator) if decorator_source and skip_pattern.search(decorator_source): reason_match = reason_pattern.search(decorator_source) reason = reason_match.group(1) if reason_match else "NO_REASON" skipped.append({ 'file': str(py_file), 'test': node.name, 'reason': reason, 'line': decorator.lineno }) return skipped if __name__ == '__main__': skipped_tests = find_skipped_tests('.') if skipped_tests: print(f"发现 {len(skipped_tests)} 个被跳过的测试:") for st in skipped_tests: print(f" - {st['file']}::{st['test']} (行{st['line']}): {st['reason']}") # 可以在这里设置非零退出码,让CI失败 # sys.exit(1) else: print("未发现被跳过的测试。")

这个脚本虽然简单,但可以作为一个起点,集成到你的开发工作流中,帮助团队保持对“技术债”的可见性。

@pytest.mark.skip()@pytest.mark.skipif()绝不是“懒惰”的工具,而是负责任工程师的精密仪器。它们用于在复杂的软件开发和测试环境中,保持测试套件的健康、高效和可信。关键在于,你要像管理代码一样管理这些“跳过”指令:给予清晰的理由,关联到具体的问题,并定期回顾和清理。当你把跳过的测试数量控制在一个很少且合理的范围内,并且每一个都有据可查时,你的测试套件才能真正成为快速交付高质量软件的坚实基石,而不是一个充满噪音和不可靠警报的负担。

http://www.jsqmd.com/news/1032520/

相关文章:

  • 计算机毕业设计之社区垃圾分类管理平台
  • AI编程:Claude Code + VSCode + CC-Switch
  • 2026无锡3家GEO优化公司对比:本土与技术导向差异|企业选型干货 - wxxwlm
  • 复杂视觉场景的理解与即时反馈测试
  • 2026年南昌K金回收推荐:5家透明报价值得信赖的回收机构 - 本地品牌推荐
  • 静音工业吸尘器Top3推荐:2026年6月哪个品牌好? - 工业清洁测评社
  • 设备准备与收回:RPA协同IT资产管理 —— 2026企业级端到端自动化落地实证
  • 2026年职场视频总结趋势掌握3个实用技巧,让汇报效率翻倍
  • 如何为BitTorrent下载加速:5个技巧使用公共追踪器列表
  • 5分钟上手Blender流体模拟:FLIP Fluids插件全攻略
  • 微服务架构下的后端开发:挑战与解决方案
  • 改造WiFi智能灯泡搭建禁书图书馆:突破存储限制的探索之旅
  • Penpot国际化架构深度解析:多语言设计系统的技术实现与性能优化
  • LegacyUpdate终极指南:简单三步修复Windows Update错误80072EFE
  • 2026昆明美术艺考机构深度适配指南:罗丹艺术培训学校推荐及2家专业机构解析 - 云南美术头条
  • 高校智慧校园四大核心场景建设指南:智圣新创可落地实践参考
  • SM2与SM4国密算法实战指南:从原理到代码实现与问题排查
  • 一文吃透 SMOKE 模型:本地清单构建、EDGAR/MEIC 全球全国排放数据处理 + 模式调试实操
  • 2026年北大青鸟学费一览表 - 北大青鸟总部
  • 浏览器缓存之【基础键值存储】:Local storage 和 Session storage
  • 2026年赣州搭电救援推荐 赣州极速24小时道路救援专业透明值得信赖 - 本地品牌推荐
  • 2026年电滑环机构选购指南:如何甄选高可靠性旋转传输中枢? - 品牌报告
  • 2026年常州茶礼盒实体店推荐榜单:企业定制/商务送礼/节日伴手礼/高端茶礼/明前茶礼盒一店搞定 - 品牌发掘
  • 从规则引擎到AI Agent:费控审核系统演进路径
  • OEM贴牌GEO系统影响获客效果吗
  • 从实验到实战:[SEED-Lab] SQL注入攻防演练 | 漏洞利用与安全加固全解析
  • 2026年 上海装修公司推荐排行榜:办公楼/店铺/酒店/厂房/会所装修,匠心设计与品质施工之选 - 品牌发掘
  • Skill Hub 中国
  • 3分钟快速获取微信数据库密钥:Sharp-dumpkey完整指南
  • 内容创作者为什么适合使用库拉 ssooai.cn 这类多模型平台