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

 

 

posted @ 2020-11-18 10:12  一个名  阅读(721)  评论(0编辑  收藏  举报