1. 项目概述:为什么选择VS Code作为Python测试的起点?

如果你刚开始接触Python编程,或者已经写了一些脚本但从未系统地写过测试,那么“测试”这个词听起来可能既重要又有点吓人。你可能会想:“我的代码能跑通不就行了?为什么还要额外花时间写测试?” 或者,“测试听起来很复杂,是不是需要学习一个全新的框架和一堆命令?” 这正是我当初的困惑。直到我在一个项目里,因为修改了一个看似无关的函数,导致整个数据处理流程在半夜崩溃,我才真正意识到自动化测试不是“锦上添花”,而是“雪中送炭”的必需品。

那么,为什么选择Visual Studio Code(VS Code)作为我们学习Python测试的“主战场”呢?原因很简单:它把复杂的事情变简单了。对于新手而言,最大的障碍往往不是测试逻辑本身,而是繁琐的环境配置、命令行操作和结果查看。VS Code作为一个轻量级但功能强大的代码编辑器,通过其丰富的扩展和集成的终端,几乎消除了这些障碍。你不需要离开编辑器去运行测试命令,不需要手动记忆复杂的 pytest 参数,测试结果和代码覆盖率都能以非常直观的方式呈现在你面前。它就像一个贴心的助手,让你可以专注于“写测试”这件事本身,而不是被工具链分散精力。

本教程的目标,就是利用VS Code的图形化优势,为你提供一个“从零开始”的、完全图解式的学习路径。我们将从最基础的VS Code和Python环境搭建开始,一步步带你配置测试环境,编写你的第一个测试用例,并最终掌握如何高效地运行、调试和分析测试。无论你是完全的编程新手,还是有一定经验但从未接触测试的开发者,这篇教程都将通过截图和步骤,手把手带你入门,让你理解测试的价值,并拥有立刻付诸实践的能力。

2. 环境准备:搭建你的Python测试工作台

工欲善其事,必先利其器。一个稳定、便捷的开发环境是高效学习和工作的基础。这一部分,我们将完成三个核心任务:安装Python解释器、安装VS Code编辑器,以及配置VS Code的关键插件。请严格按照步骤操作,确保每一步都成功,这能避免后续90%的奇怪问题。

2.1 安装Python:选择正确的版本和安装方式

首先,你需要一个Python解释器。对于测试入门而言,我强烈推荐从Python官网直接下载安装。为什么不推荐某些系统自带的Python或者Anaconda呢?系统自带的Python版本可能较旧,且修改系统Python容易引发权限问题;而Anaconda虽然科学计算友好,但其庞大的环境和潜在的路径冲突对于纯Python开发和测试学习来说,有点“杀鸡用牛刀”,反而增加了复杂度。

操作步骤:

  1. 访问 python.org ,点击导航栏的“Downloads”。通常网站会自动推荐当前系统的最新稳定版(如Python 3.12.x)。对于新手,直接下载这个最新稳定版即可。
  2. 运行下载的安装程序。 这里有一个至关重要的步骤 :在安装向导的第一个页面,务必勾选底部的 “Add python.exe to PATH” 选项。这个操作会将Python和它的包管理工具 pip 添加到系统的环境变量中,让你可以在任何命令行窗口(包括VS Code的终端)中直接使用 python pip 命令。如果不勾选,后续会遇到“python不是内部或外部命令”的错误,需要手动配置,非常麻烦。
  3. 点击“Install Now”进行安装。安装完成后,打开你的命令行工具(Windows上是CMD或PowerShell,macOS/Linux上是Terminal),输入 python --version 并回车。如果正确显示了你安装的Python版本号(如 Python 3.12.3 ),恭喜你,第一步成功了。

注意 :在Windows上,如果你同时安装了多个Python版本(比如从微软商店也安装了一个),可能会导致命令冲突。最稳妥的方式是卸载其他版本,或者确保从官网安装的Python在环境变量中的优先级最高。在终端输入 where python (Windows)或 which python3 (macOS/Linux)可以查看当前生效的Python解释器路径。

2.2 安装与初步配置VS Code

VS Code的安装过程非常 straightforward。从 code.visualstudio.com 下载对应系统的安装包,一路“下一步”即可。安装完成后,首次启动VS Code,你会看到一个欢迎页面。我们先进行几项基础但重要的设置,让编辑器更顺手。

  1. 设置中文界面(可选) :在欢迎页左侧活动栏点击“扩展”图标(或按 Ctrl+Shift+X ),搜索“Chinese (Simplified) Language Pack”,安装并重启VS Code,界面就会变为中文。这能降低初学者的认知负担。
  2. 设置默认终端 :VS Code的强大功能之一是其集成的终端。点击菜单栏“查看” -> “终端”(或按 Ctrl+` ),终端面板会在底部打开。为了获得最佳体验,我建议将默认终端设置为系统更强大的版本:在Windows上,点击终端下拉箭头,选择“选择默认配置文件”,然后选择“PowerShell”或“Windows PowerShell”;在macOS/Linux上,选择“bash”或“zsh”。这能保证后续的包安装和命令运行更加顺畅。
  3. 创建一个专属工作区文件夹 :在你的电脑上找一个合适的位置(例如 D:\Projects\python-test-learning ~/Projects/python-test-learning ),新建一个文件夹。然后打开VS Code,点击“文件” -> “打开文件夹”,选择这个新文件夹。这样,我们所有的练习代码和测试文件都将放在这个统一的目录下管理,避免文件散落各处。

2.3 安装核心扩展:武装你的VS Code

VS Code的精髓在于扩展。对于Python测试,我们只需要安装两个官方扩展,它们就足以覆盖我们所有的需求。

  1. Python扩展(ms-python.python) :这是VS Code进行Python开发的基石。在扩展商店搜索“Python”,由Microsoft发布的那个就是。安装后,它提供了代码智能提示(IntelliSense)、代码格式化、调试、测试、Jupyter笔记本支持等几乎所有功能。安装完成后,VS Code可能会在右下角提示你选择一个Python解释器,点击它,然后选择我们刚才安装的版本(路径类似 Python 3.12.3 (‘base’: conda) Python 3.12.3 64-bit )。这告诉VS Code在这个工作区中使用哪个Python环境。
  2. Pylance扩展(ms-python.vscode-pylance) :这通常是Python扩展的依赖或推荐扩展,会自动安装或提示你安装。Pylance是一个高性能的语言服务器,能提供更准确、更快速的代码补全、类型检查和信息提示。有了它,你的编码体验会提升一个档次。

至此,你的“数字工作台”已经搭建完毕。你拥有了一个纯净的Python环境、一个高度定制化的编辑器,以及最核心的Python开发支持。接下来,我们就可以在这个工作台上,开始创建我们的第一个项目并引入测试了。

3. 第一个Python项目与测试:从“计算器”开始理解单元测试

理论学习总是抽象的,最好的学习方式就是动手。我们将创建一个最简单的“计算器”模块,并为它编写测试。这个例子虽小,但涵盖了测试的核心概念:被测函数、测试用例、断言和测试运行器。

3.1 创建项目结构与核心模块

在我们的工作区文件夹下,按照以下结构创建文件和文件夹。你可以直接在VS Code的资源管理器(左侧第一个图标)中右键点击文件夹来新建。

python-test-learning/
├── calculator.py
└── tests/
    └── test_calculator.py

calculator.py 是我们的核心业务模块, tests 文件夹是存放所有测试文件的约定目录, test_calculator.py 是对应 calculator.py 的测试文件。这种分离的结构清晰且符合通用规范。

现在,打开 calculator.py ,编写一个简单的加法函数:

def add(a, b):
    """返回两个数字的和。"""
    return a + b

是的,就这么多。测试的对象可以非常简单。

3.2 安装测试框架:pytest

Python自带了 unittest 框架,但社区更流行、也更简洁强大的是 pytest 。我们选择 pytest 作为我们的测试运行器。在VS Code的集成终端中(确保当前路径是你的项目根目录 python-test-learning ),运行以下命令:

pip install pytest

这个命令会从Python包索引下载并安装 pytest 。安装成功后,你可以在终端输入 pytest --version 来验证。

实操心得 :强烈建议为每个项目创建独立的虚拟环境( venv ),以避免不同项目间的包版本冲突。你可以在项目根目录运行 python -m venv .venv 来创建,然后在VS Code中选择这个虚拟环境作为解释器(按 F1 ,输入“Python: Select Interpreter”选择 .venv 下的 python.exe )。这样, pytest 就只安装在这个项目里。本教程为求简化,暂不使用虚拟环境,但在实际项目中这是最佳实践。

3.3 编写并运行你的第一个测试

打开 tests/test_calculator.py ,开始编写测试。 pytest 的规则很简单:测试文件以 test_ 开头,测试函数也以 test_ 开头。

# 导入要测试的函数
from calculator import add

def test_add_positive_numbers():
    """测试两个正数相加。"""
    result = add(2, 3)
    # 断言:我们期望的结果是5
    assert result == 5

def test_add_negative_numbers():
    """测试两个负数相加。"""
    result = add(-1, -4)
    assert result == -5

def test_add_mixed_numbers():
    """测试正数与负数相加。"""
    result = add(5, -3)
    assert result == 2

每个 test_ 开头的函数都是一个独立的测试用例。 assert 语句是测试的核心,它判断一个条件是否为真。如果为真,测试通过;如果为假, pytest 会报告测试失败并给出详细信息。

如何运行测试? 有几种方式,VS Code让这一切变得极其简单:

  1. 使用VS Code测试侧边栏 :这是最直观的方式。点击左侧活动栏的“烧杯”图标(测试视图)。首次打开,它会提示你配置测试框架。点击“配置Python测试”,选择“pytest”,然后选择测试目录为 ./tests 。配置完成后,VS Code会自动发现所有 test_ 开头的测试用例,并在侧边栏以树状结构展示。你可以点击顶部的“运行测试”按钮(三角形)运行所有测试,也可以点击单个测试用例旁边的运行按钮单独运行它。通过和失败会用绿色对勾和红色叉号清晰标记。
  2. 使用终端命令 :在集成终端中,确保当前路径是项目根目录,直接输入命令 pytest pytest 会自动递归查找所有 test_*.py 文件并运行其中的测试。你会看到简洁的输出,显示通过了多少测试。
  3. 在测试文件中直接运行 :在 test_calculator.py 文件内,你会注意到每个测试函数上方都有一个“运行测试”的代码透镜(一小行可点击的文字)。点击它,可以直接运行这个单独的测试。

现在,尝试运行所有测试。你应该看到三个绿色的对勾或终端里显示“3 passed”。恭喜你,你已经成功完成了第一次测试驱动开发(TDD)的“绿”阶段!

3.4 理解测试失败与调试

测试的价值不仅在于验证正确,更在于捕捉错误。让我们故意写一个错误的测试来体验一下。在 test_calculator.py 中添加:

def test_add_fail_example():
    """这是一个会失败的测试示例。"""
    result = add(0, 0)
    assert result == 1  # 这显然是错的

再次运行测试。你会看到这个测试失败了。VS Code的测试视图会显示红色的叉号,并展开显示错误信息:“AssertionError: assert 0 == 1”。终端会输出更详细的回溯信息,告诉你哪个文件的哪一行断言失败了。

如何调试失败的测试? VS Code的调试功能与测试无缝集成。

  1. 在测试视图中,将鼠标悬停在失败的测试用例上,点击出现的“调试测试”按钮(虫子图标)。
  2. 或者,在测试文件里,点击失败测试函数上方的“调试测试”代码透镜。 VS Code会启动调试器,并在断言失败的那一行自动暂停。此时,你可以查看调用堆栈、检查变量(例如 result 的值),逐步执行代码,就像调试普通程序一样。这是定位测试失败原因的利器。

注意事项 :测试函数应该相互独立,不依赖执行顺序,也不依赖外部状态(如全局变量、文件、数据库)。每个测试都应当是一个独立的“宇宙”。这也是为什么我们把测试放在单独的 tests 目录下,并且每个测试文件只导入它需要的最小模块。

4. 深入测试核心:掌握更强大的断言与测试组织

通过了简单的加法测试,你可能觉得测试不过如此。但现实世界的函数要复杂得多:它们可能处理边界情况、抛出异常、返回复杂的数据结构。 pytest 提供了一整套强大的工具来应对这些场景。

4.1 使用pytest的高级断言与插件

pytest assert 语句之所以强大,是因为它能智能地比较各种数据类型,并在失败时输出清晰的差异对比。例如,比较两个列表:

# 在 test_calculator.py 中新增
def test_complex_data_structures():
    expected_list = [1, 2, 3]
    # 假设我们有一个函数 process_data 返回列表
    # result = process_data(...)
    # 这里我们模拟一个错误的结果
    result_list = [1, 2, 4]
    assert result_list == expected_list

运行这个测试, pytest 会输出类似这样的信息,清晰地指出第一个不匹配的元素位置:

E     assert [1, 2, 4] == [1, 2, 3]
E       At index 2 diff: 4 != 3
E       Use -v to see the full diff

安装并利用pytest插件 pytest 的生态系统有大量插件可以增强测试能力。一个必装的插件是 pytest-cov ,用于生成测试覆盖率报告。

pip install pytest-cov

安装后,你可以使用以下命令运行测试并生成覆盖率报告:

pytest --cov=calculator --cov-report=html

这个命令会计算 calculator 模块的代码被测试执行的比例,并生成一个漂亮的HTML报告(保存在 htmlcov 目录下)。用浏览器打开 htmlcov/index.html ,你可以看到哪些行被覆盖(绿色),哪些行没有被覆盖(红色)。覆盖率是衡量测试完整性的重要指标,但切记,高覆盖率不等于高质量测试,它只是一个参考。

4.2 测试异常与边界条件

一个健壮的函数必须能妥善处理错误输入。我们需要测试函数在接收到非法参数时,是否按预期抛出了异常。 pytest 提供了 pytest.raises 上下文管理器来测试异常。

假设我们给计算器增加一个除法函数,并规定除数不能为零:

# 在 calculator.py 中增加
def divide(a, b):
    """返回a除以b的结果。"""
    if b == 0:
        raise ValueError("除数不能为零")
    return a / b

对应的测试应该这样写:

# 在 test_calculator.py 中增加
import pytest
from calculator import divide

def test_divide_normal():
    assert divide(6, 2) == 3

def test_divide_by_zero():
    """测试除以零时是否抛出ValueError异常。"""
    with pytest.raises(ValueError) as exc_info:
        divide(10, 0)
    # 还可以进一步检查异常信息是否匹配
    assert str(exc_info.value) == "除数不能为零"

with pytest.raises(ValueError): 这行代码的意思是:接下来的代码块 应该 抛出一个 ValueError 异常。如果没抛出,或者抛出了其他类型的异常,测试就会失败。 exc_info 对象包含了捕获到的异常信息,我们可以用它来做更细致的断言。

边界条件测试 :这是测试中极其重要的一环。对于数值计算,要考虑最大值、最小值、零值;对于列表或字符串操作,要考虑空列表、单元素列表、超长字符串等。例如,测试加法时,可以考虑大数相加是否溢出(在Python中通常不会,但其他语言可能)、浮点数相加的精度问题等。养成思考“这个函数的输入有哪些极端情况?”的习惯,能极大提升代码的鲁棒性。

4.3 使用Fixture管理测试资源

很多时候,测试需要一些公共的 setup(准备)和 teardown(清理)工作,比如创建数据库连接、初始化一个复杂的对象、创建临时文件等。如果每个测试函数都重复这些代码,会非常冗余且难以维护。 pytest fixture 就是用来解决这个问题的。

fixture 是一个函数,你用 @pytest.fixture 装饰它。然后,其他测试函数可以通过将 fixture 函数名作为参数传入来使用它。

举个例子,假设我们的计算器升级了,需要一个复杂的“初始化”过程(这里用模拟):

# 在 test_calculator.py 文件顶部或新建一个 conftest.py 文件(推荐)
import pytest

@pytest.fixture
def initialized_calculator():
    """这是一个fixture,返回一个‘初始化后’的计算器对象(这里用字典模拟)。"""
    print("\n(Fixture执行:初始化计算器...)")
    calc = {"model": "Advanced", "precision": "high"}
    yield calc  # 将对象提供给测试函数
    print("(Fixture执行:清理计算器资源...)") # yield之后的代码是清理阶段

def test_with_fixture(initialized_calculator):
    """测试函数通过参数接收fixture返回的对象。"""
    assert initialized_calculator["model"] == "Advanced"
    # 可以在这里使用这个初始化好的‘计算器’进行测试

当你运行 test_with_fixture 时, pytest 会先自动调用 initialized_calculator fixture函数,执行 yield 之前的代码,然后将 yield 后面的值( calc 字典)传给测试函数。测试函数执行完毕后,再回来执行 yield 之后的清理代码。

实操心得 :对于跨多个测试文件共享的 fixture (比如数据库连接),最佳实践是将其定义在一个名为 conftest.py 的文件中,并放在项目根目录或 tests 目录下。 pytest 会自动发现这个文件中的 fixture ,使其对所有测试文件可用。这保持了测试代码的整洁和可维护性。

5. 集成测试与VS Code高级调试技巧

单元测试确保了每个“零件”的质量,但我们需要确保这些零件组装成“机器”后也能正常工作。这就是集成测试的范畴。同时,当测试失败时,高效的调试技巧能帮你快速定位问题根源。

5.1 从单元测试到集成测试

在我们的计算器例子中,集成测试可能意味着测试多个函数的组合操作,或者测试一个完整的业务流程。例如,假设我们增加一个“计算器历史”功能:

# calculator.py
class Calculator:
    def __init__(self):
        self.history = []

    def add_and_record(self, a, b):
        result = add(a, b)
        self.history.append(f"{a} + {b} = {result}")
        return result

    def get_history(self):
        return self.history

对应的集成测试会验证整个“计算并记录”的流程:

# test_calculator.py
from calculator import Calculator

def test_calculator_integration():
    calc = Calculator()
    result = calc.add_and_record(5, 3)
    assert result == 8
    history = calc.get_history()
    assert len(history) == 1
    assert history[0] == "5 + 3 = 8"

这个测试不再仅仅关注 add 函数的正确性,还关注 Calculator 类内部状态( history )的变化是否符合预期。在VS Code中运行此类测试与单元测试毫无二致,测试侧边栏和 pytest 命令同样适用。

如何组织测试文件? 当项目变大时, tests 文件夹下可以建立子目录来组织测试,例如 tests/unit/ (单元测试)、 tests/integration/ (集成测试)、 tests/e2e/ (端到端测试)。 pytest 都能自动发现它们。你可以在VS Code的测试配置中,通过修改 python.testing.pytestArgs 设置来指定特定的测试目录或模式。

5.2 利用VS Code进行高效的测试调试

调试是开发过程中不可或缺的一环,VS Code为测试调试提供了顶级支持。

  1. 设置断点与逐行调试 :在测试文件或被测源码文件的任意一行代码左侧单击,可以设置一个红色的断点。然后,如前所述,通过测试视图或代码透镜启动“调试测试”。程序执行到断点处会暂停,此时:

    • 变量面板 :可以看到当前作用域内所有变量的值。
    • 调用堆栈 :显示程序是如何一步步执行到当前位置的。
    • 调试控制台 :可以输入Python表达式,实时计算并查看结果。
    • 控制按钮 :你可以“单步跳过”(F10)逐行执行,“单步进入”(F11)进入函数内部,“单步跳出”(Shift+F11)跳出当前函数,或者“继续”(F5)运行到下一个断点或结束。
  2. 使用“调试控制台”进行探索性测试 :在调试暂停时,调试控制台是一个强大的工具。你可以直接导入模块、调用函数、修改变量值,来验证你的猜想。例如,在 test_add_positive_numbers 的断点处,你可以在控制台输入 add(100, 200) 来快速验证函数行为,而无需修改代码重新运行。

  3. 配置 launch.json 进行复杂调试 :对于更复杂的调试场景(例如需要特定环境变量、命令行参数),你可以配置VS Code的 launch.json 文件。按 F5 启动调试时,如果还没有配置,VS Code会提示你创建一个。你可以选择“Python Debugger” -> “Python File” 来调试单个文件,或者更高级的配置。对于测试,通常使用集成的测试调试功能就足够了,但知道有这个选项是好的。

常见问题排查 :如果调试器无法启动或断点不生效,请检查以下几点:

  • 确保VS Code底部状态栏选择的Python解释器是正确的(是你项目使用的那个)。
  • 确保你的代码没有语法错误,否则调试器可能无法正确附加。
  • 尝试重新加载VS Code窗口( Ctrl+Shift+P ,输入“Developer: Reload Window”)。
  • 复杂的项目结构或动态导入有时会影响调试,确保你的 __init__.py 文件(如果有)和导入路径是正确的。

6. 构建健壮的测试策略与持续集成入门

掌握了编写和运行单个测试的技能后,我们需要从更高的视角来思考:如何为整个项目构建一套健壮、可维护的测试体系?以及如何让测试自动化运行,成为开发流程的一部分?

6.1 测试金字塔与测试类型规划

测试金字塔是一个经典模型,它指导我们如何分配测试资源:

  • 底层(最多):单元测试 。就像我们为 add divide 函数写的测试。它们运行速度极快,隔离性好,是测试的基石。目标应该是高覆盖率。
  • 中层(较少):集成测试 。就像我们测试 Calculator 类,验证多个单元协同工作是否正常。它们比单元测试慢,但能发现接口间的集成问题。
  • 顶层(最少):端到端(E2E)测试 。模拟真实用户操作整个应用。例如,用 Selenium 测试一个Web应用从点击按钮到看到结果的全流程。它们运行最慢、最脆弱,但能验证整个系统。

对于刚起步的项目,我的建议是: 重点投入单元测试,适当编写关键路径的集成测试,暂不考虑E2E测试 。在VS Code中,你可以通过创建不同的测试目录(如 tests/unit , tests/integration )并使用 pytest 的标记(mark)功能来分类和管理它们。

使用pytest标记 :你可以给测试打上标签,然后选择性地运行。

# test_calculator.py
import pytest

@pytest.mark.slow
def test_very_slow_integration():
    # 这是一个运行很慢的测试
    ...

@pytest.mark.fast
def test_quick_unit():
    ...

然后在终端中,你可以运行 pytest -m fast 只运行标记为 fast 的测试,或者 pytest -m "not slow" 排除慢速测试。这在大型项目中非常有用。

6.2 将测试接入持续集成(CI)流水线

持续集成(CI)的核心是:每当有代码提交到仓库(如GitHub, GitLab)时,自动运行测试套件,确保新代码不会破坏现有功能。这对于团队协作和保证代码质量至关重要。

虽然完整的CI配置超出了本篇入门教程的范围,但了解其概念和最简单的实现非常有价值。以GitHub为例,你可以通过在其仓库中创建一个 .github/workflows/python-test.yml 文件来定义一个CI工作流。

一个极简的示例:

name: Python Tests

on: [push, pull_request] # 在代码推送或创建拉取请求时触发

jobs:
  test:
    runs-on: ubuntu-latest # 在一个干净的Ubuntu虚拟机中运行
    steps:
    - uses: actions/checkout@v2 # 检出你的代码
    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: '3.12' # 指定Python版本
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install pytest pytest-cov # 安装依赖
    - name: Run tests with pytest
      run: |
        pytest --cov=./ --cov-report=xml # 运行测试并生成覆盖率报告

当你提交这个文件后,GitHub Actions会在每次推送时自动启动一个虚拟机,安装Python和依赖,运行你的测试。你可以在仓库的“Actions”标签页查看运行结果和日志。绿色对勾表示所有测试通过,红色叉号则表示有测试失败,你需要及时修复。

在VS Code中模拟CI环境 :为了确保本地测试与CI环境一致,你可以在项目根目录创建一个 requirements.txt 文件,列出所有依赖:

pytest>=7.0.0
pytest-cov>=4.0.0

然后在终端运行 pip install -r requirements.txt 来安装。这样,无论是你本地开发,还是CI服务器,使用的都是相同版本的库,避免了“在我机器上是好的”这类问题。

6.3 测试心态与最佳实践养成

最后,分享一些从实践中得来的心得,这些比任何具体技术都重要:

  1. 测试即文档 :好的测试用例本身就是一份活生生的API使用说明书。一个新同事可以通过阅读测试来快速理解某个函数或模块应该如何被调用,以及它的边界情况是什么。
  2. 先写测试,再写代码(TDD) :尝试在实现一个功能前,先写下这个功能的测试用例。这会迫使你从使用者的角度思考接口设计,并且你实现代码的目标会非常明确:让测试变绿。虽然一开始不习惯,但长期坚持对代码质量提升巨大。
  3. 保持测试独立与快速 :每个测试不应该依赖其他测试的状态或执行顺序。使用 fixture scope 参数(如 @pytest.fixture(scope="module") )可以控制资源创建销毁的粒度,但务必小心使用,避免测试间产生隐蔽的依赖。测试套件整体应该运行得非常快(理想情况在几秒内),这样你才愿意频繁运行它。
  4. 测试行为,而非实现 :测试应该关注“这个函数做了什么”(它的行为),而不是“这个函数内部是怎么做的”(它的实现)。如果你测试了内部实现细节,那么一旦你重构代码(优化内部逻辑但不改变外部行为),测试就会失败,这反而成了负担。这被称为“脆弱的测试”。
  5. 拥抱测试失败 :测试失败不是坏事,它是早期预警系统。一个突然失败的测试可能意味着你引入了一个回归缺陷,或者某个依赖发生了变化。及时查看并修复失败的测试,是维持代码健康度的关键。

回到VS Code,养成每天打开项目先运行一遍测试的习惯。让测试侧边栏的绿色对勾成为你代码的“健康晴雨表”。随着项目增长,你会越来越感激今天花时间搭建的这套测试体系。它不仅是代码的保险网,更是你重构和迭代信心的来源。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐