pytest-2

使用fixture实现部分前后置

#读取数据
def read_yaml():
    return ["chenglong","zhenzidan","zhangsan"]
    
@pytest.fixture(scope="function",autouse=True,params=read_yaml(),ids=["c","z","s"],name="db")
#scope:作用域   scope="function"只作用于函数,在函数之前之后执行
#                     class,在类之前和之后执行,例子在第二个类中
#                     package/sessoin:在整个项目会话之前和之后执行
#       fixture通过return或yeild返回值的话,那么可以把这个值传递到测试用例中,值是通过固件名字传递的
#autouse:自动执行,默认是False
#ids:
#params:实现参数化   params=read_yaml()
#    通过在fixture函数的参数里面添加request来接收这个参数   def exe_database_sql(request),然后通过print("request.param")来取值
#ids:不能单独使用,必须和params一起使用,作用是对参数起别名
#name:作用是给fixture作用的函数起别名,那么函数名称失效,exe_database_sql变成name的值
def exe_database_sql():
    print("执行SQL语句")
 #   return success
#    yield ”success“
    print("关闭数据库")
class TestYutong:
    
    def test_ceshi1(self,exe_database_sql):
        print("测试1")
        print(exe_database_sql)  #success
  
    def test_ceshi2(self):
        print("测试2")
        
@pytest.mark.usefixtures("exe_database_sql")   #scope="class"时,手动调用的方式
class Testjiaoyu :
    def test_01():
       pass 
  1. scope:作用域 scope="function"只作用于函数,在函数之前之后执行 class,在类之前和之后执行,例子在第二个类中 package/sessoin:在整个项目会话之前和之后执行

       在根文件目录下建conftest.py针对全局有效(或在包下面创建,只针对包有效),再运行run.py

        conftest.py文件里面所有的方法在调用时,都不需要导包

    import pytest
    
    @pytest.fixture(scope="function",autouse=True,name="db")#在测试文件中方法中添加db
    def exe_database_sql():
        print("执行SQL语句")
        yield ”success“
        print("关闭数据库")
        
    @pytest.fixture(scope="function",autouse=True,name="db")#在测试文件中方法中添加db
    def user_manage():
        print("用户管理模块之前的准备")
        yield ”user_manager“
        print("用户管理模块之后的准备")

fixture通过return或yeild返回值的话,那么可以把这个值传递到测试用例中,值是通过固件名字传递的

  1. autouse:自动执行,默认是False

  2. params:实现参数化 params=read_yaml()

通过在fixture函数的参数里面添加request来接收这个参数 def exe_database_sql(request),然后通过 print("request.param")来取值,注意:这里的param没有s

  1. ids:不能单独使用,必须和params一起使用,作用是对参数起别名

  2. name:作用是给fixture作用的函数起别名,那么函数名称失效,exe_database_sql变成name的值

setup,teardown,setup_class,teardown_class,fixture,conftest优先级

  • fixture的session级别的优先级最高

  • fixture的class级别的优先级其次 setup_class

  • fixture的function级别的优先级最后 setup

总结:pytest执行过程

  1. 查询当前目录下的conftest.py文件

  2. 查询当前目录下的pytest.ini文件

  3. 查询用例目录下contest.py文件

  4. 查询py文件中是否有setup,teardown,setup_class,teardown_class

  5. 再根据pytest.ini文件的测试用例的规则去查找用例并执行

pytest的断言

class TestYutong:
    
    def test_ceshi1(self):
        print("测试1")
        assert 1==1
    def test_ceshi2(self):
         print("测试1")
         assert "a" in "abc"
         

pytest结合allure-pytest插件生成美观的测试报告

  1. 安装allure-pytest插件

  2. 下载allure ,下载之后解压,配置环境变量(把allure目录下的bin目录配置到系统变量的path路径)

  3. 验证allure是否安装成功 allure --version

  4. 生成报告

  • 生成测试报告

    pytest.ini文件中
    [pytest]
    addopts=-vs --alluredir  #通过main运行
    
  • 生成临时json报告

addopts==-vs --alluredir=./temps --clean-alluredir
--alluredir=./temps 生成临时报告
--clean-alluredir 清空临时报告

pytest之parametrize()实现数据驱动

  1. 方法:

@pytest.mark.parametrize(args_name,args_value)
  def test_01():
      pass
      
args_name:参数名称,用于将参数值传递给函数
args_value:参数值格式(列表和字典列表,元组和字典元组),有n个值用例就执行n次
@pytest.mark.parametrize("caseinfo",["张三","李四","百里"])
  def test_01(self,caseinfo):
      print("获取鉴权码"+caseinfo)         

@pytest.mark.parametrize("args1,args2",[["name":"百里"],["age":"18"]])
  def test_02(self,args1,args2):
      print("获取鉴权码"+"str(args1)+"+"str(args2)")

YAML格式测试用例读、写、封装

  1. yaml是一种数据格式,扩展名可以是yaml或yml,支持#注释,通过缩进表示层级,区分大小写。

  2. 用途:用于做配置文件(yaml,ini)

       用于编写自动化测试用例

  3. 数据组成:

    msjy:
        - name1: lisa
        - name2: 
            - age1: 18
            - age2: 19
        - name2: joy        
    1. 注:yaml文件读出来的数据类型是字典

    2. map对象,键值对,键:(空格)值

      name: lisa

    3. 数组(list),使用-来表示列表

创建get_token.yaml
创建yaml_util.py

import yaml
#获取项目根目录
def get_obj_path():
    os.path.dirname(__file__).split("")
#读取yaml,需要安装pip installl pyyaml
def read_yaml(yamlpath):
    with open("yaml文件的路径= get_obj_path()+yamlpath",mode="r",encoding="utf-8") as :
        yaml.load(stream=f,Loader=yaml.FullLoader) #加载所有内容
        return value
if __name__="__main__":
    read_yaml(yamlpath)

parametrize结合

get_token.yaml

#第一个用例
-
    name: 获取统一的鉴权码
    request:
        method:get
        url:
        data:
            grant_type:
            appid:
            secret:
    validate: None
#第二个用例
-
    name: 获取统一的鉴权码
    request:
        method:get
        url:
        data:
            grant_type:
            appid:
            secret:
    validate: None

统一接口请求封装

接口自动化测试框架的封装

  1. 接口关联的封装

  2. yaml文件如何实现动态参数的处理

  3. yaml文件如何实现文件上传

  4. yaml文件如何实现解决断言,特别是当有参数化的时候如何断言

  5. yaml文件数据量太大怎么办

  6. 接口自动化框架的扩展性:加密接口,签名接口,自定义功能接口

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值