Pytest实战

本文深入介绍了Pytest测试框架的使用,包括其参数化的概念和应用,以及如何将测试数据分离到不同数据格式的文件中,如JSON、Yaml、CSV和Excel。文中通过具体的测试案例展示了如何在API测试中利用Pytest进行功能验证,并探讨了Fixture和conftest.py在测试初始化和清理中的作用。此外,还提到了面试题和测试资料的获取途径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

Pytest测试框架是动态语言Python专用的测试框架,使用起来非常的简单,这主要得易于它的设计,Pytest测试框架具备强大的功能,丰富的第三方插件,以及可扩展性好,可以很好的和unittest测试框架能够结合起来在项目中使用。本文章主要介绍Pytest测试框架中参数化的详细信息。

参数化的本质是对列表中的对象进行循环,然后把循环的对象进行一一的赋值,它的应用场景主要是基于相同的业务场景,但是需要不同的测试数据来测试从而达到最大化的覆盖更多的业务场景和测试的覆盖率。理解了这样的一个思想之后,我们就以两个数想加作为案例,来演示Pytest测试框架的参数化实际应用,另外一点需要特别说的是在Pytest测试框架中参数化使用的方式是通过装饰器的方式来进行。刚才也说到它的本质是对列表中的对象进行循环和赋值,那么这个对象可以是列表,也可以是元祖以及和字典数据类型,见如下的实战案例,把测试的数据分离到不同的对象中(列表,元组,字典),源码如下:

#!/usr/bin/env python
#!coding:utf-8
import  pytest


def add(a,b):
   return a+b


@pytest.mark.parametrize('a,b,expect',[
   [1,1,2],
   [2,2,4],
   [3,3,6],
   [4,4,8],
   [5,5,10]
])
def test_add_list(a,b,expect):
   assert add(a,b)==expect

@pytest.mark.parametrize('a,b,expect',[
   (1,1,2),
   (2,2,4),
   (3,3,6),
   (4,4,8),
   (5,5,10)
])
def test_add_tuple(a,b,expect):
   assert add(a,b)==expect


@pytest.mark.parametrize('data',[
   {
   'a':1,'b':1,'expect':2},
   {
   'a':5,'b':5,'expect':10}
])
def test_add_dict(data):
   assert add(data['a'],data['b'])==data['expect']

if __name__ == '__main__':
   pytest.main(["-s","-v","test_one.py"])

执行后的结果信息如下:

图片

在如上的结果信息中,可以看到真正实现测试用例的代码是很少的,而且把参数化使用到的数据分离到不同的数据类型中。

下面结合API的测试场景来考虑,被测试的API的代码如下:

#!/usr/bin/env python
#!coding:utf-8
from flask import  Flask,jsonify
from flask_restful import  Api,Resource,reqparse


app=Flask(__name__)
api=Api(app)


class LoginView(Resource):
   def get(self):
      return {
   'status':0,'msg':'ok','data':'this is a login page'}

   def post(self):
      parser=reqparse.RequestParser()
      parser.add_argument('username', type=str, required=True, help='用户名不能为空')
      parser.add_argument('password',type=str,required=True,help='账户密码不能为空')
      parser.add_argument('age',type=int,help='年龄必须为正正数')
      parser.add_argument('sex',type=str,help='性别只能是男或者女',choices=['女','男'])
      args=parser.parse_args()
      return jsonify(args)

api.add_resource(LoginView,'/login',endpoint='login')

if __name__ == '__main__':
   app.run(debug=True)

在基于API测试维度的思想,针对该接口测试我们不考虑接口的安全性,高并发以及它的稳定性方面,单纯的只是从功能层面来考虑进行测试,那么需要针对每个参数是否缺少都得需要进行验证,就会涉及到五个测试用例的设计,我们把数据分别分离到主流的文件中,文件的格式主要为JSON,Yaml,Excel和CSV的文件,先来看分离到JSON的文件内容:

{
   
  "item":
  [
    {
   
      "request":
      {
   
        "url": "http://localhost:5000/login",
        "body":
        {
   
          "password":"admin",
          "sex":"男",
          "age":18
        }
      },
      "response":
      [
        {
   
          "message":
          {
   
            "username": "用户名不能为空"
          }
        }
      ]
    },
    {
   
      "request":
      {
   
        "url": "http://localhost:5000/login",
        "body":
        {
   
          "username":"wuya",
          "sex":"男",
          "age":18
        }
      },
      "response":
      [
        {
   
        "message":
        {
   
          "password": "账户密码不能为空"
        }
      }
      ]
    },
    {
   
      "request":
      {
   
        "url": "http://localhost:5000/login",
        "body":
        {
   
          "username":"wuya",
          "password":"admin",
          "sex":"asdf",
          "age":18
        }
      },
      "response":
      [
        {
   
          "message":
          {
   
            "sex": "性别只能是男或者女"
          }
        }
      ]
    },
    {
   
      "request":
      {
   
        "url": "http://localhost:5000/login",
        "body":
        {
   
          "username":"wuya",
          "password":"admin",
          "sex":"男"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值