• pytest


    requests只是针对脚本(随便写,随便放的feel),即怎么用python去做接口请求

    1、pytest

    简介:python的第三方包,他的作用主要是用来做自动化测试框架的,测试框架的作用就是组织测试用例,生成测试报告(最终会以一个网页的形式展现出来)

    环境搭建:以管理员身份运行cmd,输入命令:pip3 install pytest -i https://pypi.tuna.tsinghua.edu.cn/simple

    2、pytest搭建接口自动化框架

    2.1、建立根目录

    新建一个文件夹,直接到之前的项目同级下新建一个文件夹,取名pytesta(注意:和requests一样,这个名字一定不能叫pytest

    右键--->在文件资源管理器中显示--->新建一个文件夹

    2.2、打开这个文件夹

    这文件夹就放入接口自动化的全部东西

    2.3、搭建pytest框架

    搭建框架,肯定就绕不开一个观念:分层——按照用途的不同,把代码按文件夹区分开来

    常见的分层:

    case层:存放测试用例

    utils层:工具代码层,存放工具的,比如说存放pymsql

    report层:测试报告层

    conf层:配置文件层

    data层:数据层

    了解了分层的概念之后,就需要建立分层了,在VScode中新建文件夹(注意点外边)

    2.4、编写测试用例

    接下来就开始了第一个测试用例的编写了(即接口自动化测试用例的编写)

    接口测试用例的编写以py文件为模块,管理单个模块的所有case,他的py文件的命名规则是:test_数字_项目模块名.py(其中test是固定开头,数字是代表运行顺序)

    例如:test_01_index.py,表示首页下边的所有接口,都放到这个文件里边

    选中case,新建文件:

    3、测谈网首页为例:一个测试case的编写离不开以下几个步骤:

    3.1、首页的第一个case

    ①  抓包:

    打开测谈网开发者工具,刷新首页,抓取接口

    ②  查找接口文档

    然后查找接口文档,发现是首页获取轮播图的接口:

    ③  按照接口文档中的数据在VScode中编写case:

    #用方法来表示每个测试用例,这里需要注意方法名的命名,还是以test开头_数字_方法名
    #例如获取首页轮播图的测试用例
    def test_01_lbt():
        u = "http://118.24.105.78:2333/get_title_img?num=3"    #注意这个地址是抓包获取的,这块要参考接口文档,但是不能全看接口文档
        h = {"Content-Type":"application/json"}
        res = requests.get(url=u,headers=h)
        #2、判断结果
        assert res.status_code == 200
        assert res.json()["status"] == 200
        #第三步本来是应该判断数据库,但是这块不用判断,一般只有增加、修改、查询类的接口才需要判断
        #写完之后,不能向之前那样运行,必须点上边导航栏终端——新终端,这样新建一个终端来运行,在终端下边输入pytest命令即可

    用方法来表示每个测试用例,方法名的书写规则:test_数字_方法名,例如test_01_lbt():

    方法里需要写对应的requests代码,所以需要在开头导入requests包:import requests,当然pytest也是需要导入的:import pytest

    注意运行的时候,记得先保存

    三个注意事项:文件的命名,方法的命名,文件记得保存,只有这些东西写对了,才能找到测试用例,怎样才能判断是否找到呢,运行界面上会有一个collected 数字 items

     如果测试用例执行失败,会标记为红色的F,如下图所示:

    如果结果报错,断言失败了,应该怎样去找原因呢?在该断言前面去打印:print(res.text),在运行时,有的时候打印店结果不会显示完全,那就在终端输入命令:pytest -s

    3.2、首页第二个case:

    也是这样分为三个步骤

    ①  抓取接口

    ②  在接口文档中查出是获取教程的接口:

    ③  按照接口文档,在VScode中编写case(即将之前学的脚本整理到一个方法中去)

    注意注意,这里一定要小心,和性能测试一样,我们通过抓包获取到的接口有的可能有传参数,这个时候一定要抓包的为准,而不是接口文档上的数据

    #获取推荐教程的测试用例
    def test_02_getcourse():
        u = "http://118.24.105.78:2333/getcoures"
        h = {"Content-Type":"application/json"}
        res = requests.get(url=u,headers=h)
        assert res.status_code == 200
        assert res.json()["status"] == 200

    3.3、首页第三个case:

    ①  首先还是抓取接口:

    ②  在接口文档上找到对应的接口:

    ③  在VScode里编写case:

    #获取热门讨论的测试用例
    def test_03_getquestions():
        u = "http://118.24.105.78:2333/getquestions?num=3"
        h = {"Content-Type":"application/json"}
        res = requests.get(url=u,headers=h)
        assert res.status_code == 200
        assert res.json()["status"] == 200

    3.4、登录模块:

    前面的抓包和查询接口文档这里就省略了,直接写测试用例:

    由于登录会涉及到数据库查询的问题,所以会涉及到运用之前封装好的查询数据库的方法,即这里还会涉及到一个导包的问题:

    如果是在同一级文件目录下:

                     

    如果要导入的包和自己处于平级的情况:

                     

    如果要导入的包和自己所在的包处于平级:

    万精油方法:将整个根目录添加到环境变量里边去:

    import os,sys
    sys.path.append(os.getcwd())

    然后在以from 包名.文件名 import 方法/变量

                  

    注意:以后可以在每个test下边都添加一次,因为指不定哪一次就要用到它

    3.4.1、关联:

    有了登录之后,就会涉及到关联的问题

    由于这里用到了管理测试用例的方法,不能像之前学requests的时候直接获取token值,因为会有作用域的问题,如果想要跨方法,跨文件引用,做好的方法就是把这个变量公共化,即将这个变量保存起来,可以保存到excel,也可以保存为txt文件,这里保存在文本文档中

    3.4.1.1、封装Python读取文件的方法

    接下来就涉及到了python的文件读写内容:在utils里封装一个文件:

    #此处的file_path变量表示保存到哪个文件中,content为内容
    def save_file(file_path='./conf/user_token.txt', content=''):
        """
            保存字符串到文件
        """
        #打开一个文件(刚才保存的那个目录),以w形式打开:文件写入,如果该目录下没有东西,就自动写入,有东西就替换掉
        with open(file_path, 'w') as f:
            f.writelines(content)
    
    
    def read_file(file_path='./conf/user_token.txt'):
        """
            读取txt文件
        """
        #r:只读模式
        with open(file_path, "r") as f:
            content = f.read()
    
        return content

    3.4.1.2、导入封装好的读取文件的方法

    这个只能使用万精油方法

    使用:一定要在系统变量后边添加

    3.4.1.3、获取登录后的token

    在登录下边保存token值并运行,就会在conf中自动生成在filetools写的目录:

    #保存token
        save_file(content=res.json()["data"]["token"])

    3.4.1.4、使用获取到的token

    以新增文章为例(会用到token值),直接在头文件里使用read_file()方法就可以读取出获取到的token值了

    #新增文章case
    def test_01_new_article():
        u = "http://118.24.105.78:2333/article/new"
        h = {"Content-Type":"application/json","token":read_file()}
        d = {"title":"接口自动化基础","content":"这就是接口自动化的小基础","tags":"这是测试哟","brief":"这篇文章不需要简介","ximg":"dsfsdf.jpg"}
        res = requests.post(url=u,headers=h,json=d)
        # print(read_file())
        assert res.status_code == 200
        assert res.json()["status"] == 200
        # #3、数据库查询
        # print(res.text)    #不知道数据库该如何查询就可以先把结果打印出来,然后再判断
        aid = res.json()["data"]["articleid"]
        sql = "select * from t_article where id = {}".format(aid)
        assert len(query(sql)) != 0

     

  • 相关阅读:
    小结Fragment与FragmentPagerAdapter的生命周期及其关系
    Android的Touch事件分发机制简单探析
    个人项目开源之c++基于epoll实现高并发游戏盒子(服务端+客户端)源代码
    个人项目开源之Django文件中转站源代码
    个人项目开源之Django图书借阅系统源代码
    个人项目开源之实现矩形树图代码统计工具源代码
    颜色渐变算法
    echarts玩转图表之矩形树图
    解决MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk.问题
    引号有几种
  • 原文地址:https://www.cnblogs.com/bzbz/p/13992042.html
Copyright © 2020-2023  润新知