pytest作用,pytest.ini,前后置夹具

一、pytest用例管理框架的作用:

发现测试用例:从多个py文件中通过默认规则去找测试用例

执行测试用例:顺序和条件

判断测试结果:断言

生成测试报告:html,allure

二、pytest全局观:

1.他可以和所有的自动化测试工具selenium,requests,appium集合实现web自动化,接口自动化以及app自动化

2.跳过用例以及失败用例重跑

3.结合allure生成测试报告 

4.和jenkins持续集成

5.有很多强大的插件:pytest,pytest-html(生成html测试报告),pytest-xdist(多线程运行),pytest_ordering(改变测试用例执行顺序),pytest-rerunfailures(失败用例重跑),allure-pytest (生成appure测试报告)

三、如何安装插件

1.在根目录下新建一个txt文件并将插件名称全部写进去

pytest
pytest-html
pytest-xdist
pytest_ordering
pytest-rerunfailures
allure-pytest

2.在终端输入pip install -r 文件名 来安装框架,一般在实际开发中都是使用requrements.txt文件来保存插件名称。

四、运行方式

1.主函数方式(命令行方式)

-v:更加详细的运行信息

-s: 输入调试信息

-n: 多线程运行

    pytest.main(['-vs','-n=2'])//-n代表使用几个线程运行

--reruns 数字: 失败用例重新运行

    pytest.main(['-vs','--reruns=2'])//--reruns=2代表用例失败后重新跑两次

 --html=报告路径:生成报告

    pytest.main(['-vs','--html=./report.html'])//--html=./report.html在当前路径下生成html报告

2.一般在实战中使用pytest.ini的配置文件来配置运行。

1. 首先在根目录下创建一个pytest.ini文件

2.在ini文件中书写规则

[pytest]#声明为pytest文件,主方法运行的时候会自动来这里查询
addopts = -vs #配置命令的,相当于pytest.main(['-vs'])里面的-vs
testpaths=./testcases #配置用例的,也就是用例的路径
python_files = text_*.py#配置文件默认的规则,比方说若是文件名需要test_开头即可按照示例配置
python_classes = Test* #可改变类的配置也就是说,如果类需要以Test*开头即可按照示例中写的
python_functions = test_* #可修改方法名的开头,也就是说如果方法名需要以test_开头可以这样写

 3.用例分组,比方说我们只做冒烟测试:一些用例不需要执行一些用例需要执行。在ini文件中写上

markers =
    smoke:maoyan #代表新建了一个分组,可在代码中标记方法是否为该分组之后,按照分组进行执行

之后在需要测试的方法上面加上

    @pytest.mark.smoke #代表该用例(方法)属于smoke分组 manyan属于注解

最后在pytest.ini配置文件中将配置命令修改

addopts = -vs -m "smoke" #代表只执行该分组的用例

4.常用的一些方法,这两个方法代表在每个用例前执行一次和在每个用例后执行一次

    def setup(self):
        print("在每个之前")
    def teardown(self):
        print("在每个之后")

五、前后置、夹具 

setup/teardiwn 在每个用例之前和之后执行一次

setup_class/teardown_class 在每个类之前和之后执行一次

如何实现部分的前置?

我想其中一个用例做数据库验证,那么怎么办?

部分前置:

@pytest.fixtrue(scope="作用域",params="数据驱动",autouse="自动执行",
ids="自定义参数"。name="重命名")
#作用域:function,class,module,package/session

 作用域实现:

#这个是部分前置的驱动,作用域表明为function
@pytest.fixture(scope="function") 
def database():
    print("连接数据库")
    yield #可以通过yield唤醒类似teardown功能
    print("关闭数据库")
#在方法中直接将部分前置的方法名直接写入即可实现
class Test:
    def test_frist(self,database):
        print("打印")


yield简单理解就是返回,yield和return都是代表返回的意思,但是yield 返回多次以及多个数据return只能返回一次,return后面不能接代码

一般情况下:

 @pytest.fixtrue()一般会和conftest.py文件一起使用

conftest.py名称是固定的,功能很强大。

1.conftest.py文件是单独存放的@pytest.fixtrue()的方法。用处是可以在多个py文件之间共享前置配置

2.conftest.py里面的方法在调用的时候不需要导入,可以直接使用。

3.conftest.py可以有多个,也可以有多个不同层级。

注意:一般运行文件我们会在根目录下创建一个all.py文件

import pytest

if __name__ == '__main__':
    pytest.main()

运行上述代码进行执行

conftest.py文件的使用

1.在根目录下创建conftest.py文件后再文件中写入前置逻辑

import pytest


@pytest.fixture(scope="function")
def database():
    print("连接数据库")
    yield
    print("关闭数据库")

2.在方法参数中直接将conftest.py文件中的方法名写入即可

六、接口自动化测试框架封装(接口关联的封装)

一般情况下我们是通过一个关联的yaml文件来实现的。yuml文件用于获取和写入一些参数以便在项目中进行调用

1.首先先创建一个yuml文件,用于存储信息

2.创建一个.py文件来进行读和写,并导入yaml包

import os
import yaml
class YamlUtil:
    #读取extract.yml文件
    def read_extract_yaml(self,key):
        with open(os.getcwd()+"/extract.yml",mode="r",encoding="utf-8") as f:
            value = yaml.load(stram=f,Loader=yaml.FullLoader)
            return value[key];
    #写入extract.yml文件
    def write_extract_yaml(self,data):
        with open(os.getcwd()+"/extract.yml",mode="w",encoding="utf-8") as f:
            value = yaml.dump(data=data,stream=f,allow_unicode=True)
  1. with open(os.getcwd()+"/extract.yml",mode="w",encoding="utf-8") as f:

    • open()函数用于打开文件,这里我们打开一个名为 extract.yml 的文件。
    • os.getcwd()函数用于获取当前工作目录的路径。
    • mode="w"表示以写入模式打开文件,如果文件不存在则创建新文件,如果文件已存在则覆盖原有内容。
    • encoding="utf-8"表示以UTF-8编码打开文件,以支持处理中文字符。
  2. value = yaml.dump(data=data,stream=f,allow_unicode=True)

    • yaml.dump()函数用于将数据转换为YAML格式并写入文件中。
    • data=data表示要写入的数据,这里的data是一个变量,你需要将要写入的数据赋值给它。
    • stream=f表示将数据写入到文件对象f中。
    • allow_unicode=True表示允许写入Unicode字符,以支持处理非ASCII字符。

y是指传入方法的时候传入一个key,返回的时候返回一个key 

 3.进行写入的时候可直接调用方法,但是存储数据的时候是需要以键值对的形式存储的,例:

Yaml.Util().write_extract_yaml({'token':"123456"})

4.进行读的时候可直接调用方法

Yaml.Util().read_extract_yaml('token')

注意:注意使用使用上诉的方法会出现如果新写入了一条数据,那么之前的数据会被替换的情况,我们可以修改读写文件,在写入的方法中将W更换为A这样就可以进行追加

import os
import yaml
class YamlUtil:
    #读取extract.yml文件
    def read_extract_yaml(self,key):
        with open(os.getcwd()+"/extract.yml",mode="r",encoding="utf-8") as f:
            value = yaml.load(stram=f,Loader=yaml.FullLoader)
            return value[key];
    #写入extract.yml文件
    def write_extract_yaml(self,data):
        with open(os.getcwd()+"/extract.yml",mode="a",encoding="utf-8") as f:
            value = yaml.dump(data=data,stream=f,allow_unicode=True)

这样操作的话是会一直追加数据的,所有我们需要对数据进行清除:

import os
import yaml
class YamlUtil:
    #读取extract.yml文件
    def read_extract_yaml(self,key):
        with open(os.getcwd()+"/extract.yml",mode="r",encoding="utf-8") as f:
            value = yaml.load(stram=f,Loader=yaml.FullLoader)
            return value[key];
    #写入extract.yml文件
    def write_extract_yaml(self,data):
        with open(os.getcwd()+"/extract.yml",mode="a",encoding="utf-8") as f:
            value = yaml.dump(data=data,stream=f,allow_unicode=True)
    #清除extract.yml文件
    def clear_extract_yaml(self,data):
        with open(os.getcwd()+"/extract.yml",mode="w",encoding="utf-8") as f:
            f.truncate()

  • open()函数用于打开文件,这里我们打开一个名为 extract.yml 的文件。
  • os.getcwd()函数用于获取当前工作目录的路径。
  • mode="w"表示以写入模式打开文件,如果文件不存在则创建新文件,如果文件已存在则覆盖原有内容。
  • encoding="utf-8"表示以UTF-8编码打开文件,以支持处理中文字符。
  • yaml.dump()函数用于将数据转换为YAML格式并写入文件中。
  • data=data表示要写入的数据,这里的data是一个变量,你需要将要写入的数据赋值给它。
  • stream=f表示将数据写入到文件对象f中。
  • allow_unicode=True表示允许写入Unicode字符,以支持处理非ASCII字符。

在 conftest.py文件中调用清除方法

import pytest

from yaml_util import YamlUtil


@pytest.fixture(scope="function")
def database():
    print("连接数据库")
    yield
    print("关闭数据库")

@pytest.fixture(scope="session",autouse=True) #autouse代表自动执行不需要手动触发,
另外scope="session"需要作用于会话,他的所有请求都算一个会话
def ckear_yaml():
    YamlUtil.clear_extract_yaml()

 值得注意的是,的他作用域需要为会话,同时他的执行方式为自动执行

七、@pytest.fixture()参数详解

1.scope="session"  作用域可以为方法或者是会话,类等

2.autouse=True  是否自动执行

@pytest.fixture(scope="session",autouse=False,params=[["user","无敌"],["password","123456"]])
def exe_sql(request):
    print("连接数据库")
    yield request.param
    print("断开数据库")

#参数化中,方法传参必须是request,固定写法,同时yiele后面也必须是request.param 固定写法
def test_select_pat(self, info1,exe_sql): 
想使用这个前置直接在方法中将前置的方法名传入就可以使用了
注意:若是参数列表有两个元素,那么该方法会被执行两次

分层级前后置:

在使用@pytest.fixture()自动执行的时候会分层级执行,先外层后内层

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值