Pytest,测试框架的王者之选!

文摘   2024-11-13 14:40   河南  

写代码不写测试,迟早要还的。Python世界里测试框架多得数不清,但要说最好用的,那必须是Pytest!它就像是给代码把脉的神医,轻轻松松就能发现问题所在。


装它贼简单,一行命令搞定:


pip install pytest

写测试用例也超简单,创建一个test_开头的Python文件,里面写test_开头的函数就行:


def add(a, b):

    return a + b

def test_add():

    assert add(1, 2) == 3

    assert add(-1, 1) == 0

    assert add(0, 0) == 0

运行测试只需要在终端输入pytest,它就会自动找到所有测试文件并执行。


💡 温馨提示 :函数名一定要以test_开头,不然Pytest找不到这个测试用例哦!


跟其他测试框架比,Pytest的断言机制简直不要太爽!直接用Python内置的assert就完事了:


def test_string_operations():

    name = “python”

    assert name.startswith(“py”)

    assert len(name) == 6

    assert name.upper() == “PYTHON”

出错时它还给你详细的错误信息,比如值是多少,预期是多少,代码哪行出问题了,一目了然!


测试经常需要准备测试数据,清理测试环境。用fixture能优雅地解决这些问题:


import pytest

@pytest.fixture

def db_connection():

    # 连接数据库

    print(“连接数据库”)

    yield “database”

    # 测试结束后自动断开连接

    print(“断开连接”)

def test_database(db_connection):

    assert db_connection == “database”

fixture还能设置作用域,比如scope=“module”就是在整个模块开始前执行一次,结束后清理一次,超级方便。


测试不同的输入输出,总不能复制粘贴一堆代码吧?用参数化测试就对了:


import pytest

@pytest.mark.parametrize(“input,expected”, [

    (“hello”, 5),

    (“python”, 6),

    (“”, 0),

    (“测试”, 2)

])

def test_string_length(input, expected):

    assert len(input) == expected

一个测试函数搞定多组测试用例,代码更清爽了!


有时候某些测试用例可能暂时跑不了,或者就是期望它失败:


@pytest.mark.skip(reason=“功能还没实现”)

def test_future_feature():

    pass

@pytest.mark.xfail

def test_known_bug():

    assert 1 == 2 # 这个bug还没修,先标记为预期失败

💡 温馨提示 :经常用skip的测试用例要记得及时处理,不然容易忘记!


测试用例多了跑起来特别慢?装个pytest-xdist插件就能并行执行:


pip install pytest-xdist

pytest -n auto # auto表示自动识别CPU核心数

测试速度直接起飞!不过要注意测试用例之间别有依赖关系,不然可能会出问题。


测试代码说白了就是给自己的代码兜底,用Pytest写测试不仅简单,还能提高代码质量。


学会了这些基础用法,基本够用了。想要更高级的玩法,可以去看看官方文档,里面还有不少好东西等着你发掘呢!

财经时间眼
每天更新好看的视频
 最新文章