pytest框架

一、pytest框架约束

1.1、 python的命名规则
    1)py文件全部小写,多个英文用_隔开
    2)class名首字母大写,驼峰:TestADD_*
    3)函数和方法名小写,多个英文用_隔开:test_add
    4)全局变量,前面要加global
    5)常量字母必须全大写,如:AGE_OF_NICK

1.2、 pytest的命名规则
    1)模块名(py文件)必须是以test_开头或者_test结尾
    2)测试类(class)必须以Test开头,并且不能带init方法,类里的方法必须以test_开头
    3)测试用例(函数)必须以test_开头

二、pytest的运行方式

2.1、主函数运行

import pytest

if __name__ == '__main__':
    pytest.main()
    #指定文件
    pytest.main(["./testcase/product/test_add_product.py"])
    #指定目录
    pytest.main(["./testcase/product"])
    #运行指定py的测试类用例
    pytest.main(["./testcase/product/test_add_product.py::TestProduct"])
    #运行指定py的测试类中的用例
    pytest.main(["./testcase/product/test_add_product.py::TestProduct::test_add_01"])
    #匹配包含关键词的用例(匹配目录名、模块名、类名、用例名),-k pan表示匹配包含pan的用例;可以使用and,or
    pytest.main(['-k','pan'])
    #-v显示详细信息,输出调试信息
    pytest.main(['-v', 'testcase/test_one.py', 'testcase/test_two.py'])
    #-s 输出更详细的信息,如:文件名、用例名
    pytest.main(['-vs','testcase/test_one.py', 'testcase/test_two.py'])
    #-x 只要有一个用例执行失败,就停止执行测试
    pytest.main(['-vsx', 'testcase/test_one.py'])
    #– maxfail -出现N个测试用例失败,就停止测试
    pytest.main(['-vs', '--maxfail=3','testcase/test_one.py'])
    #–html=report.html 生成html格式的报告
    pytest.main(['-vsx','--html=./report/report.html', 'testcase/test_one.py'])

三、pytest中conftest.py文件

3.1、conftest.py的特点

    pytest 会默认读取 conftest.py里面的所有 fixture
    conftest.py 文件名称是固定的,不能改动
    conftest.py 越近越优先,先从同目录的package 找,没有再往上一级找
    不同目录可以有自己的 conftest.py,一个项目中可以有多个 conftest.py
    测试用例文件中不需要手动 import conftest.py,pytest 会自动查找

    可以跨 package导入,类、函数、参数,避免维护多个conftest

3.2、conftest.py的示例目录

最顶层的 conftest,一般写全局的 fixture

 四、Pytest fixture

fixture是在测试函数运行前后,由pytest执行的外壳函数。fixture中的代码可以定制,满足多变的测试需求,包括定义传入测试中的数据集、配置测试前系统的初始状态、为批量测试提供数据源等等。fixture是pytest的精髓所在,类似unittest中setup/teardown,但是比它们要强大、灵活很多,它的优势是可以跨文件共享

4.1.pytest fixture几个关键特性

    有独立的命名,并通过声明它们从测试函数、模块、类或整个项目中的使用来激活
    按模块化的方式实现,每个fixture都可以互相调用
    fixture可以实现unittest不能实现的功能,比如unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是fixture却可以解决这个问题
    fixture的范围从简单的单元扩展到复杂的功能测试,允许根据配置和组件选项对fixture和测试用例进行参数化

4.2.Pytest fixture定义

    定义fixture跟定义普通函数差不多,唯一区别就是在函数上加个装饰器@pytest.fixture(),fixture命名不要用test_开头,跟用例区分开。用例才是test_开头的命名;
    fixture装饰器里的scope有四个级别的参数:function(不写默认这个)、class、module、session;
    fixture可以有返回值,如果没有return,默认会是None;用例调用fixture的返回值,就是直接把fixture的函数名称作为参数传入;
    fixture可以返回一个元组、列表或字典;
    测试用例可传单个、多个fixture参数;
    fixture与fixture间可相互调用;

4.3.Pytest fixture用法

1)用法一:作为参数使用

fixture的名字直接作为测试用例的参数,用例调用fixture的返回值,直接将fixture的函数名称当做变量名称;如果用例需要用到多个fixture的返回数据,fixture也可以返回一个元祖,list或字典,然后从里面取出对应数据。

2)用法二:提供灵活的类似setup和teardown功能

Pytest的fixture另一个强大的功能就是在函数执行前后增加操作,类似setup和teardown操作,但是比setup和teardown的操作更加灵活;具体使用方式是同样定义一个函数,然后用装饰器标记为fixture,然后在此函数中使用一个yield语句,yield语句之前的就会在测试用例之前使用,yield之后的语句就会在测试用例执行完成之后再执行。@pytest.fixture可以用在selenium中测试用例执行前后打开、关闭浏览器的操作

3)用法三:利用pytest.mark.usefixtures叠加调用多个fixture

如果一个方法或者一个class用例想要同时调用多个fixture,可以使用@pytest.mark.usefixtures()进行叠加。注意叠加顺序,① 与直接传入fixture不同的是,@pytest.mark.usefixtures无法获取到被fixture装饰的函数的返回值;

② @pytest.mark.usefixtures的使用场景是:被测试函数需要多个fixture做前后置工作时使用;

4)用法四:fixture自动使用autouse=True

5)用法四:搭配yield

4.5Pytest fixture参数用法

fixture(scope='function',params=None,autouse=False,ids=None,name=None)

常用参数

  1. scope: 被@pytest.fixture标记为方法的的作用域,默认是function, 还可以是class、module、package、session等,(简而言之 就是在需要前置后置后置的函数)    function:每一个函数或方法都会调用、 class:每一个类调用一次,一个类中可以有多个方、module:每一个.py文件调用一次,该文件内又有多个function和class、session:多个文件调用一次,可以跨.py文件调用(通常这个级别会结合conftest.py文件使用)
  2. params: 用于给fixture传参,可实现数据基于fixture的数据驱动,接收一个可以迭代的对象, 比如:列表[], 元组[], 字典列表{[],[],[]}、字典元组{(),(),()},提供参数数据供调用fixture的用例使用; 传进去的参数,可以用request.param调用,根据参数值遍历次数,有3个值则遍历3次
  3. ids: 用例标识id,每一个ids 和 params 一一对应,如果没有id,将从params自动产生;就像字典序号和值
1)params、ids入参参数化,根据数据遍历次数

2).autouse: 是否自动运行,是一个bool值,默认为false; 当为True时, 作用域内的测试用例都会自动调用该fixture,不输入函数

3).name: 给被@pytest.fixture标记的方法取一个别名,这个参数的作用是为 fixture 显式命名,使得在测试报告中能够更清晰地识别和显示这个 fixture 的名称。而原本的fixture的名字会失效

五.Pytest mark用法

Mark 是 pytest 提供的一种标记功能,用于对测试用例进行标记和分组。通过使用 mark,我们可以对测试用例进行分类和组织,以便更好地管理和运行测试。Mark 可以用于单个测试用例或一组测试用例。

  • usefixtures - 为测试函数或者测试类知名使用那些fixture

  • filterwarnings - 为一个测试函数过滤一个指定的告警

  • skip - 跳过一个测试函数

  • skipif - 如果满足条件就跳过测试函数

  • xfail - 标记用例失败

  • parametrize - 参数化

@pytest.mark.parametrize("param1,param2",[("1","11"),("2","22")])

def test_run_9(param1,param2):
    print(param1,param2)

六.Pytest pytest-html简易报告

安装:pip install pytest-html

pytest.ini中配置 addopts = --html=report.html

运行后生成文件report.html,使用浏览器打开

七.Pytest Allure绚丽报告

安装 pip install allure-pytest

pytest.ini中配置addopts =--alluredir=./report/

运行py后在report生成报告文件,执行allure serve report 自动打开网页

7.1、定制化后的效果展示

7.2、allure的特性, @allure.epic()、@allure.feature()、@allure.story() 、@allure.step()、allure.attach的详细使用,的详细使用

  • @allure.epic:表示一个大型的主题或目标,通常是一个项目或一个较大的功能,往下是 feature;

  • @allure.feature:表示某个具体的功能点或模块,通常是史诗中的一个子功能,理解成模块往下是 story

  • @allure.story:表示一个具体的用户故事,通常是用户在使用某个子功能,例如:注册,往下是 title

@allure.step 

  • allure报告最重要的一点是,它允许对每个测试用例进行非常详细的步骤说明
  • 通过 @allure.step() 装饰器,可以让测试用例在allure报告中显示更详细的测试过程
  • allure.attach

  • 作用:allure报告还支持显示许多不同类型的附件,可以补充测试结果

<think>好的,我需要回答用户关于pytest框架的入门教程的问题。首先,我要确保回答结构清晰,符合用户的要求,使用中文,并且正确应用LaTeX格式。用户还希望生成相关问题,并在引用处添加标识。 首先,我应该从pytest的基础开始介绍,比如安装方法,然后简单示例,再逐步深入常用功能。要确保代码示例正确,并且解释清楚每个部分的作用。同时,需要引用提供的参考资料《API Testing with Python》TechWorld with Nana,可能的话在合适的地方加入引用标记。 接下来,生成相关问题时要考虑用户可能的后续疑问,比如与其他测试框架的比较、高级功能、测试策略等。确保问题相关且有帮助。 检查LaTeX是否正确应用,比如行内公式用$...$,独立公式用$$...$$,虽然测试代码中可能用不到太多数学公式,但如果有变量或表达式的话需要注意。例如,如果有断言的条件,可以写成$x == 5$这样的形式。 最后,确保回答符合系统级指令的所有要求,包括引用标识的位置和格式,以及问题的生成部分的结构。</think>### Pytest框架入门教程 Pytest是Python最流行的测试框架之一,具有简洁语法和强大功能,适合初学者快速上手[^1]。 #### 1. 安装与基本使用 安装命令: ```bash pip install pytest ``` 创建测试文件(如`test_sample.py`): ```python def add(a, b): return a + b def test_add(): assert add(2, 3) == 5 # 断言测试结果 ``` 运行测试: ```bash pytest test_sample.py ``` #### 2. 常用功能 - **断言自动推导**:无需记忆多种断言方法,直接使用`assert`表达式。 ```python assert "hello" in "hello world" ``` - **参数化测试**:通过`@pytest.mark.parametrize`覆盖多组输入。 ```python import pytest @pytest.mark.parametrize("a, b, expected", [(1, 2, 3), (0, 0, 0)]) def test_add_cases(a, b, expected): assert add(a, b) == expected ``` - **Fixtures(夹具)**:复用初始化逻辑(如数据库连接)。 ```python import pytest @pytest.fixture def database_connection(): conn = create_connection() # 假设的初始化函数 yield conn conn.close() def test_query(database_connection): result = database_connection.execute("SELECT 1") assert result == 1 ``` #### 3. 进阶功能 - **插件扩展**:如`pytest-cov`(覆盖率报告)、`pytest-xdist`(并行测试)。 - **标记测试**:通过`@pytest.mark`分类测试用例(如`@pytest.mark.slow`)。 #### 4. 最佳实践 - 测试函数命名以`test_`开头。 - 测试文件命名以`test_`或`_test`结尾。 - 使用`pytest.raises`捕获预期异常: ```python def test_divide_by_zero(): with pytest.raises(ZeroDivisionError): 1 / 0 ``` #### 推荐学习资源 - **TechWorld with Nana的《API Testing with Python》**:涵盖Pytest实战场景[^1]。 - 官方文档:[https://docs.pytest.org](https://docs.pytest.org)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值