随笔 - 29  文章 - 0  评论 - 0  阅读 - 11206

2 Pytest测试框架升华篇

pytest框架实现一些前后置(固件、夹具)的处理,常用三种

一、setup/teardown, setup_class/teardown_class全部

class TestClass:

    # 这个在所有的用例之前只执行一次    def setup_class(self):
        print("在每个类执行前初始化的工作,如:创建日志对象,创建数据库的连接等")
    
    # 在每个用例之前执行一次    def setup(self):
        print("在执行测试用例之前初始化的代码,如:打开浏览器,加载网页等")
        
    def test_01(self):
        print("测试用例1")

    def test_02(self):
        print("测试用例2")
        
    def test_03(self):
        print("测试用例3")
    
    def teardown(self):
        print("在执行测试用例之后的扫尾代码,如:关闭浏览器")
    
    def teardown_class(self):
        print("在每个类执行后的扫尾工作,如销毁日志对象,销毁类等")

缺陷:每一个用例必须执行,如果只想部分执行,就需要另外的方法

二、使用fixture装饰器来实现部分用例前后置置(固件、夹具)的处理

装饰器:@pytest.fixture(scope="", params="", autouse="", ids="", name="")

  • scope表示的是被@pytest.fixture标记的方法的作用域。function(默认)、class、module、package/session

  • params:参数化(支持列表[],元组(),字典列表[{},{},{}],字典元组({},{},{})

import pytest
@pytest.fixture(scope='function', params=['zhangsan', 'lisi'])
def my_fixture(request):
    print("这是前置的方法")
    yield request.param  # return和yield都表示返回都意思,但是return后面不能有代码,yield返回后可接代码    
    print("这是后置的方法")


class TestClass:
    def test_01(self):
        print("测试用例1")

    def test_02(self, my_fixture):
        print("测试用例2")
        print("--------" + str(my_fixture))
  • autouse=True,自动使用,默认False

  • ids:当使用params参数化时,给每一个值设置一个变量名。意义不大

  • name:给表示的是被@pytest.fixture标记的方法取一个别名(当取了别名后原来的名称就不能用了)

三、通过conftest.py和@pytest.fixture结合使用实现全局的前置应用(比如:项目的全局登录,模块的全局处理)

  • conftest.py文件是单独存放的一个夹具配置文件,名称是不能更改的

  • 用处:可以在不同的.py文件中使用同一个fixture函数

  • 原则上conftest.py需要和运行的用例放到同一层,不需要做任何import导入的操作(不同层也可以,作用域问题)

四、断言

assert 

asser A==B

五、pytest结合allure-pytest插件生成allure测试报告

  • allure安装

windows:下载,解压,并配置环境变量:https://github.com/allure-framework/allure2/releases
mac:brew install allure
  • 安装Python依赖

windows:pip install allure-pytest
mac:pip3 install allure-pytest
  • 加入命令生成json格式的临时报告

--alluredir ./temp

  • 生成allure报告

os.system('allure generate ./temp -o ./report --clean')
allure generate  固定指令
./temp   临时的json格式报告的路径
-o 输出output
./report 生成的allure报告的路径
--clean 情况./report路径原来的报告

六、@pytest.mark.parametrize()基本用法

@pytest.mark.parametrize(args_name, args_value)

args_name: 参数名

args_value: 参数值(列表、元组、字典列表、字典元组),有多个值用例就会执行多次

第一种方式

import pytest

class TestApi:

    @pytest.mark.parametrize('args', ['zhangsan', 'lisi'])
    def test_01_zhansan(self, args):
        print(args)

# 执行结果# xxx.py::TestApi::test_01_zhansan[zhangsan] PASSED [ 50%]zhangsan# xxx.py::TestApi::test_01_zhansan[lisi] PASSED [100%]lisi

第二种方式(同unittest的ddt里面的@unpack解包一样)

import pytest


class TestApi:

    @pytest.mark.parametrize('name, age', [['zhangsan', '20'], ['lisi', '18']])
    def test_01_zhansan(self, name, age):
        print(name, age)

# 执行结果# xxx.py::TestApi::test_01_zhansan[zhangsan-20] PASSED [ 50%]zhangsan 20# xxx.py::TestApi::test_01_zhansan[lisi-18] PASSED [100%]lisi 18

七、YAML文件详解——实现接口自动化

  • 用于全局的配置文件 ini/yaml

  • 用于写测试用例(接口测试用例)

语法规则:

  • 区分大小写

  • 使用缩进表示层级,支持注释、换行、多行字符串、裸字符串(整型、字符串)

  • 缩进没有数量要求,只要前面对其就行

  • 注释用#

数据组成:

  • Map对象,键值对 键:(空格)值

  • 多行写法:

msxy: 
  name: zhangsan
  age: 18
  • 一行的写法:msxy:{name: zhangsan, age: 18}

数组(list),用一组横线开头:

  • 多行写法:

-
  msxy: 
  name: zhangsan
  age: 18
-
  msxy: 
  name: lisi
  age: 20
  • 一行的写法:

-
  msxy: [{name: 百里}, {age: 18}]

 

 

  

 

posted on   叮叮当~  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示