Python 测试、调试与工程化
一、断言(assert)
pythondef divide(a, b): assert b != 0, "除数不能为零" return a / b # assert 仅用于开发调试,生产环境可用 -O 禁用
二、单元测试(pytest)
安装
bashpip install pytest
基本测试
python# test_math.pydef add(a, b): return a + b def test_add(): assert add(2, 3) == 5 assert add(-1, 1) == 0 assert add(0, 0) == 0 def test_add_raises(): import pytest with pytest.raises(TypeError): add("2", 3)
运行:pytest test_math.py -v
fixture(测试夹具)
pythonimport pytest @pytest.fixturedef sample_data(): return {"name": "Alice", "scores": [90, 85, 95]} def test_average(sample_data): avg = sum(sample_data["scores"]) / len(sample_data["scores"]) assert avg == 90.0 @pytest.fixture(scope="module")def db_connection(): conn = create_test_db() # setup yield conn # 测试使用 conn.close() # teardown
参数化测试
python@pytest.mark.parametrize("a,b,expected", [ (2, 3, 5), (-1, 1, 0), (0, 0, 0), (100, 200, 300),])def test_add(a, b, expected): assert add(a, b) == expected
setup/teardown
pythonclass TestUserService: def setup_method(self): self.db = connect_test_db() def teardown_method(self): self.db.close() def test_create(self): assert self.db is not None
三、调试
print() 调试
pythonprint(f"DEBUG: x={x}, type={type(x)}") # f-string 快速查看print(f"{x=}") # 3.8+ 调试语法,输出 x=42
pdb 断点调试
pythonimport pdb def buggy_func(a, b): result = a / b pdb.set_trace() # 程序在此暂停,进入交互模式 return result # pdb 常用命令:# n (next) 执行下一行# s (step) 进入函数内部# c (continue) 继续执行# l (list) 显示代码# p 变量 打印变量值# q (quit) 退出
3.7+ 可用内置 breakpoint() 替代 pdb.set_trace()。
IDE 调试器
VS Code / PyCharm 中:
- 行号左侧点击设置断点(红点)
- F5 启动调试
- F10 逐行执行
- F11 进入函数
- 左侧面板查看变量值
四、虚拟环境
venv(内置)
bash# 创建python -m venv myenv # 激活# Windows:myenv\Scripts\activate# macOS/Linux:source myenv/bin/activate # 退出deactivate
conda
bashconda create -n myenv python=3.11conda activate myenvconda deactivate
五、依赖管理
pip + requirements.txt
bash# 安装pip install requestspip install -r requirements.txt # 导出pip freeze > requirements.txt
pyproject.toml(现代方式)
toml[project]name = "myapp"version = "0.1.0"requires-python = ">=3.9"dependencies = [ "requests>=2.28", "click>=8.0",] [project.optional-dependencies]dev = ["pytest", "black", "ruff"]
bashpip install -e . # 可编辑模式安装pip install -e ".[dev]" # 包含开发依赖
六、代码规范
PEP 8 要点
- 缩进用 4 个空格(不用 Tab)
- 每行最多 79 字符
- 函数/类之间空两行
- 函数名用小写加下划线
calculate_total() - 类名用驼峰
MyClass - 常量用全大写
MAX_SIZE - import 放在文件顶部,按标准库→第三方→本地分组
自动格式化(black)
bashpip install blackblack myfile.py # 格式化单个文件black src/ # 格式化目录black . --check # 仅检查不改动
静态检查(ruff / flake8)
bashpip install ruffruff check . # 检查代码问题ruff check --fix . # 自动修复 # flake8(传统)pip install flake8flake8 src/
类型检查(mypy)
bashpip install mypymypy src/
pythondef greet(name: str) -> str: # 参数和返回值类型 return f"Hello, {name}" from typing import Optional, List, Dict, Union def find_user(id: int) -> Optional[dict]: pass def process(items: List[str]) -> Dict[str, int]: pass def parse(value: Union[int, str]) -> str: pass
七、Git 基础
常用命令
bash# 初始化git initgit clone https://github.com/user/repo.git # 工作流git add file.py # 暂存文件git add . # 暂存所有git commit -m "提交信息"git push origin main # 查看状态git status # 工作区状态git diff # 查看改动git log --oneline -10 # 最近 10 条提交 # 分支git branch # 列出分支git branch feature-x # 创建分支git checkout feature-x # 切换分支git checkout -b feature-x # 创建并切换git merge feature-x # 合并到当前分支git branch -d feature-x # 删除分支 # 回退git reset --soft HEAD~1 # 撤销 commit,保留改动git checkout -- file.py # 撤销工作区改动
.gitignore
__pycache__/*.pyc.envvenv/.venv/.vscode/*.logdist/build/
常见工作流
bashgit checkout -b feature/new-api# ... 编写代码 ...git add .git commit -m "feat: 添加用户 API"git push origin feature/new-api# 在 GitHub 上创建 Pull Request → 合并到 main
八、推荐工具链
| 工具 | 用途 |
|---|---|
| pip | 包管理 |
| venv / conda | 虚拟环境 |
| black | 代码格式化 |
| ruff | 代码检查 |
| mypy | 类型检查 |
| pytest | 单元测试 |
| pre-commit | Git 提交前自动检查 |
| poetry | 依赖管理(替代 pip+requirements.txt) |
pre-commit 配置示例(.pre-commit-config.yaml):
yamlrepos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.1.0 hooks: - id: ruff - id: ruff-format - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.5.0 hooks: - id: mypy

