跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Python Pytest 框架
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Python PyTest框架 = PyTest 是 Python 中最流行的测试框架之一,用于编写简单且可扩展的单元测试、功能测试和集成测试。它提供了丰富的功能,如自动测试发现、参数化测试、夹具(fixtures)管理以及详细的错误报告,使得测试代码更加高效和可维护。 == 简介 == PyTest 是一个第三方库,旨在简化 Python 测试流程。与 Python 内置的 `unittest` 框架相比,PyTest 的语法更简洁,并提供了更多高级功能。它支持多种测试类型,包括: * 单元测试(测试单个函数或方法) * 功能测试(测试整个模块或组件) * 集成测试(测试多个模块的交互) PyTest 的主要特点包括: * 自动发现测试文件和测试函数 * 支持断言语句(无需使用专门的断言方法) * 丰富的插件生态系统(如覆盖率报告、并行测试等) * 支持参数化测试和夹具(fixtures) == 安装 == 使用 pip 安装 PyTest: <syntaxhighlight lang="bash"> pip install pytest </syntaxhighlight> 验证安装: <syntaxhighlight lang="bash"> pytest --version </syntaxhighlight> == 基本用法 == PyTest 会自动发现名称以 `test_` 开头的文件或函数,并执行它们。 === 示例:简单测试函数 === 以下是一个简单的测试示例,验证一个加法函数是否正确: <syntaxhighlight lang="python"> # test_addition.py def add(a, b): return a + b def test_add(): assert add(2, 3) == 5 assert add(-1, 1) == 0 assert add(0, 0) == 0 </syntaxhighlight> 运行测试: <syntaxhighlight lang="bash"> pytest test_addition.py </syntaxhighlight> 输出: <syntaxhighlight lang="text"> ============================= test session starts ============================= platform linux -- Python 3.8.10, pytest-7.4.0, pluggy-1.2.0 rootdir: /path/to/tests collected 1 item test_addition.py . [100%] ============================== 1 passed in 0.01s ============================== </syntaxhighlight> === 断言失败示例 === 如果测试失败,PyTest 会提供详细的错误信息: <syntaxhighlight lang="python"> def test_add_fail(): assert add(2, 2) == 5 # 这将失败 </syntaxhighlight> 输出: <syntaxhighlight lang="text"> ============================= test session starts ============================= platform linux -- Python 3.8.10, pytest-7.4.0, pluggy-1.2.0 rootdir: /path/to/tests collected 1 item test_addition.py F [100%] ================================== FAILURES =================================== ________________________________ test_add_fail ________________________________ def test_add_fail(): > assert add(2, 2) == 5 # 这将失败 E assert 4 == 5 E + where 4 = add(2, 2) test_addition.py:8: AssertionError =========================== short test summary info ============================ FAILED test_addition.py::test_add_fail - assert 4 == 5 ============================== 1 failed in 0.01s ============================== </syntaxhighlight> == 高级功能 == === 参数化测试 === PyTest 允许使用 `@pytest.mark.parametrize` 装饰器运行多组输入测试: <syntaxhighlight lang="python"> import pytest @pytest.mark.parametrize("a, b, expected", [ (2, 3, 5), (-1, 1, 0), (0, 0, 0), ]) def test_add_parametrized(a, b, expected): assert add(a, b) == expected </syntaxhighlight> === 夹具(Fixtures) === 夹具用于提供测试所需的资源(如数据库连接、临时文件等): <syntaxhighlight lang="python"> import pytest @pytest.fixture def sample_data(): return [1, 2, 3, 4, 5] def test_sum(sample_data): assert sum(sample_data) == 15 </syntaxhighlight> === 测试异常 === 可以使用 `pytest.raises` 测试是否抛出预期异常: <syntaxhighlight lang="python"> import pytest def divide(a, b): if b == 0: raise ValueError("除数不能为零") return a / b def test_divide_by_zero(): with pytest.raises(ValueError, match="除数不能为零"): divide(10, 0) </syntaxhighlight> == 实际案例 == 假设我们有一个简单的用户管理系统,需要测试用户注册功能: <syntaxhighlight lang="python"> # user_manager.py class UserManager: def __init__(self): self.users = [] def register(self, username, password): if not username or not password: raise ValueError("用户名和密码不能为空") if username in [u["username"] for u in self.users]: raise ValueError("用户名已存在") self.users.append({"username": username, "password": password}) return True # test_user_manager.py import pytest @pytest.fixture def user_manager(): return UserManager() def test_register_success(user_manager): assert user_manager.register("alice", "secure123") is True assert len(user_manager.users) == 1 def test_register_empty_credentials(user_manager): with pytest.raises(ValueError, match="用户名和密码不能为空"): user_manager.register("", "") def test_register_duplicate(user_manager): user_manager.register("bob", "pass123") with pytest.raises(ValueError, match="用户名已存在"): user_manager.register("bob", "newpass") </syntaxhighlight> == 测试目录结构 == PyTest 推荐的标准测试目录结构如下: <mermaid> graph TD project/ ├── src/ │ └── my_module.py └── tests/ ├── __init__.py ├── test_module.py └── fixtures/ └── conftest.py </mermaid> 其中: * `src/` 存放源代码 * `tests/` 存放测试代码 * `conftest.py` 可定义全局夹具 == 数学公式支持 == PyTest 也可以用于测试涉及数学计算的函数,例如: <math> f(x) = x^2 + 2x + 1 </math> 测试代码: <syntaxhighlight lang="python"> def test_quadratic_function(): def f(x): return x**2 + 2*x + 1 assert f(0) == 1 assert f(1) == 4 assert f(-1) == 0 </syntaxhighlight> == 总结 == PyTest 是一个功能强大且灵活的测试框架,适用于各种规模的 Python 项目。通过其简洁的语法和丰富的功能,开发者可以轻松编写和维护高质量的测试代码。无论是初学者还是高级用户,PyTest 都能提供高效的测试解决方案。 [[Category:编程语言]] [[Category:Python]] [[Category:Python 测试与调试]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)