自学--接口自动化测试

1、Requests库

pip intstall requests

pycharm查验

设置http请求方法

resp = requests.请求方法(url = 'URL地址',params={k:v},headers={k:v},data={k:v},json={k,v},cookies='cookie数据'(如令牌)

请求方法:POST、GET、PUT、DELETE

url:要访问的地址     --string类型

params:查询参数    ---字典

headers:请求头    ---字典

data:表单格式请求体数据      ---字典

json:json格式请求体数据     ---字典

cookies:用来传递cookies

ex:使用Requests访问百度

# 导包
import requests
#发送http请求,访问百度,得到响应结果
resp = requests.get(url="http://www.baidu.com")
#打印响应结果
print(resp.text)

ex:使用Requests访问tpshop,并搜索iphone

#导包
import requests
#发送get请求,访问tpshop搜索接口,得到响应结果
#resp = requests.get(url="https://demo6.tp-shop.cn/Home/Goods/search.html?q=iphone")
resp = requests.get(url="https://demo6.tp-shop.cn/Home/Goods/search.html",
                    params={"q":"iphone"})#打印响应结果
print(resp.text)

ex:用Requests完成tpshop登录接口,返回验证码错误即可

#导包
import requests
#post请求,登录,得到响应结果
resp = requests.post(url="https://hmshop-test.itheima.net/index.php?m=Admin&c=Admin&a=login&t=0.6870043796261687",
                     headers={"Content-Type": "application/x-www-form-urlencoded"},
                     data={"username": "admin","password": "HM_2023_test","vertify": "8888"})
#打印文本响应结果
print(resp.text)
#打印转化为json格式的响应结果
print(resp.json())

ex:用Requests完成人力资源管理系统登录接口

#导包
import requests
#发送post请求,登录ihrm,得到响应结果
resp = requests.post(url="https://ihrm2-test.itheima.net/api/sys/login",
                     headers={"Content-Type":"application/json"},
                     json={"mobile":"13800000002","password":"888itcast.CN764%..."})
#打印响应结果,转为json格式
print(resp.json())

ex:用Requests完成人力资源管理系统修改员工、删除员工请求

#导包
import requests
#发送put请求,修改员工,得到响应结果
resp = requests.put(url="https://ihrm2-test.itheima.net/api/sys/user/1075383135459430400",
                     headers={"Content-Type":"application/json","Authorization":"43179ba8-9105-49c4-9c2f-2ea0ccef64fc"},
                     json={"username":"充电宝"})
#打印响应结果,转为json格式
print(resp.json())

-------------------------------------------------------------------------------------------#导包
import requests
#发送delete请求,修改员工,得到响应结果
resp = requests.delete(url="https://ihrm2-test.itheima.net/api/sys/user/1075383135459430400",
                     headers={"Authorization":"43179ba8-9105-49c4-9c2f-2ea0ccef64fc"})
#打印响应结果,转为json格式
print(resp.json())

Cookie

  • cookie是针对HTTP无状态这一特征而设计的
  • cookie将数据保存在浏览器端,默认存储空间大小为4k
  • cookie的数据类型受浏览器影响
  • cookie中的数据用户可以随意获取,没有安全性可言,所以大多存放不敏感信息,如用户名、登陆状态

Cookie+Session认证方式

校验用户身份的方法

  •         令牌校验
  •         cookie+session

Session

也叫会话,从客户端登录服务器开始,知道客户端退出登录,所产生的所有通信数据,保存到session中

  • session将数据存储在服务器
  • session使用服务器的存储空间,没有大小限制
  • session所支持的数据类型受服务器主机影响,几乎支持所有数据类型
  • session中的数据,大都采用加密、转码存储,因此安全性较高

session自动管理cookie

原因:因为cookie中的数据,都是由session提供的

ex:借助session实现tpshop登录,查看“我的订单”

步骤:

1、创建session实例    my_session = requests.Session()

2、使用session实例,调用get方法,发送获取验证码的请求(不需要提取Cookie)  my_session.get()

3、使用同一个session实例,调用post方法,发送登录请求(不需要携带Cookie)my_session.post()

4、使用同一个session实例,调用get方法,查看“我的订单”------my_session.get()

面试题cookie和session区别

1、数据存储位置...........

2、安全性..........

3、数据类型.........

4、大小

从响应结果resp中获取指定响应数据

  • 获取URL: resp.url
  • 获取响应状态码:resp.status_code
  • 获取cookie:resp.cookies
  • 获取响应头:resp.headers
  • 获取响应体:
    • 文本格式:resp.text
    • json格式:resp.json()【如果出现JSONDecodeError错误,说明响应结果无法转换为json格式】

2、pyTest框架

pyTest是开发人员用来实现“单元测试”的框架,测试人员可以在自动化“测试执行”时使用

使用pyTest的好处:

1、方便管理,维护测试用例

2、简单的断言方法

3、生成测试报告

安装pyTest:pip install pytest

定义测试类、测试方法

# 测试类名,建议以Test开头

class TestXxx(object):

        #测试方法名,必须以test开头

        def test_xxx(self):

                pass

执行测试方法

单文件执行

        方法1:终端命令:pytest -s xxx.py

        方法2:方法定义后,右键->运行此方法;类定义后,右键->运行 所有方法

        方法3:导包 import pytest

                if__name__=='__main__';

                        pytest.main{['-s','xxx.py']}

多文件执行

        1、直接在项目目录下,创建文件 pytest.ini

        2、编写pytest.ini文件

                [pytest]        固定内容

                addopts = -s        添加命令行参数  add options

                testpaths = ./xxx        .py测试用例文件,相当于pytest.ini位置

                python_files = xxx*.py        .py文件名,可用通配符

                python_classes= Test*        测试类名, 可用通配符

                python_functions = test*        测试方法名,可用通配符

        3、终端执行命令 pytest

 Fixture

#1、方法级别方法

        def setup(self):        在每个普通测试方法执行之前被自动调用一次

        def teardown(self):        在每个普通测试方法执行之后被自动调用一次

setup和teardown在pytest8.0版本以后被废弃了。我的pytest版本是:pytest8.3.2

解决方法:setup和teardown在类中可以使用setup_method和teardown_method来代替。

转载:http://t.csdnimg.cn/t44mP

#2、类级别方法

        def setup_class(self):        在 类中所有 测试方法 执行之前被自动调用一次

        def teardown_class(self):        在 类中所有 测试方法 执行之后被自动调用一次

断言

#方法1、

        assert 预期结果 == 实际结果        ---断言相等

        assert 预期结果 in 实际结果        ----断言包含

测试报告

1、安装插件 pip install pytest-html

2、修改pytest.ini文件的addopts的值

        addopts = -s --html=report/测试报告名.html --self-contained-html【report表示把测试报告放入到名为report的目录中】

3、使用命令 pytest 生成测试报告

[pytest]
addopts = -s --html=./report/一篇测试报告.html --self-contained-html
testpaths = ./
python_files = pytest*.py
python_classes = Test*
python_functions = test*                                pytest.ini

------------------------------------------------------------------------------------------------

#定义测试类
class TestAdd(object):
    def setup_method(self):
        print("---setup--被调用!")
    def teardown_method(self):
        print("---teardown--被调用!")
    def setup_class(self):
        print("---setup_class--被调用!")
    def teardown_class(self):
        print("---teardown_class--被调用!")
    #测试方法
    def test01_add(self):
        print("第一个测试方法:")
        assert 10 == 2 + 8
    def test02_add(self):
        print("第二个测试方法:")
        assert "hello" in "helloworld"

3、pymysql操作数据库

数据库应用场景

校验测试数据:

        http请求发送后,明确会修改表中的数据,但响应结果中没有体现数据值

                如删除员工(is_delete字段)

构造测试数据

        测试数据,使用一次就失效,不能重复使用

                如添加员工

        测试数据,再展开测试前,无法确定是否存在

                查询、修改、删除(使用的员工id)

pycharm连接数据库

conn = pymysql.connect(host="",port=3306,user="",password="",database="",charset="")

#导包
import pymysql
from select import select

#创建连接
conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="123456",database="lab_manage",charset="utf8")
#创建游标
my_cursor = conn.cursor()
#执行sql语句
my_cursor.execute("select version();")
#提取结果
res = my_cursor.fetchone()
print("查询结果为:",res)
#关闭游标
my_cursor.close()
#关闭连接
conn.close()

cursor游标

  • 游标,负责提取结果集的数据
  • 新创建的游标,指向结果集第0条记录
  • 游标提取数据的方式,提取游标当前指向位置的下一条数据。如cursor(0)提取第一条记录
  • 每提取一条记录,游标会自动向下移动

常用提取方法

fetchone():从结果集中,提取一条记录

fetchany(size):从结果集中,提取size条记录

fetchall:提取所有数据

属性rownumber:可以设置游标的位置,常用于归零,cursor.rownumber = 0

#导包
import pymysql
from select import select

#创建连接
conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="173581",database="lab_manage",charset="utf8")
#创建游标
my_cursor = conn.cursor()
#执行sql语句
my_cursor.execute("select * from user;")
#提取一条结果
res = my_cursor.fetchone()
print("查询结果为:",res)
#提取全部
my_cursor.rownumber = 0;
res = my_cursor.fetchall()
print("查询结果为:",res)
#提取第3、4条
my_cursor.rownumber = 2;
res = my_cursor.fetchmany(2)
print("查询结果为:",res)
my_cursor.close()
#关闭连接
conn.close()

异常捕获

# 语法

try:

        尝试执行的代码

except Exception as err:

        出现了异常后执行的代码

finally:

        无论有没有异常,都会执行的代码

------------------------------------------------------------------------------------

#导包
import pymysql
from select import select

conn = None
my_cursor = None
try:
    #创建连接
    conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="173581",database="lab_manage",charset="utf8")
    #创建游标
    my_cursor = conn.cursor()
    #执行sql语句
    my_cursor.execute("select * from user;")
    #提取一条结果
    res = my_cursor.fetchone()
    print("查询结果为:",res)
    #提取全部
    my_cursor.rownumber = 0;
    res = my_cursor.fetchall()
    print("查询结果为:",res)
    #提取第3、4条
    my_cursor.rownumber = 2;
    res = my_cursor.fetchmany(2)
    print("查询结果为:",res)
except Exception as err:
    print("查询失败:",str(err))
finally:
    my_cursor.close()
    #关闭连接
    conn.close()

增删改

#导包
import pymysql
from select import select

conn = None
my_cursor = None
try:
    #创建连接
    conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="173581",database="lab_manage",charset="utf8")
    #创建游标
    my_cursor = conn.cursor()
    #执行sql语句
    my_cursor.execute("insert into user(username,password,name) values('keke','123456','可可');")
    my_cursor.execute("update user set password = '111111' where id = 43;")
    my_cursor.execute("delete from user where id = 43;")

    print("Affect rows:",conn.affected_rows())
    conn.commit()
except Exception as err:
    print("插入数据失败:",str(err))
    conn.rollback()
finally:
    my_cursor.close()
    #关闭连接
    conn.close()

数据库工具类封装

封装目的:

将数据库常用的操作,封装成类中的方法,将来在使用时,只需提供要执行的sql语句给这个方法即可。(不需要关心建立连接、建立游标、关闭游标、关闭连接.....)

#导包
import pymysql

#定义数据库的工具类
class DBTools(object):
    #创建连接---类方法,可以直接使用类名调用
    @classmethod
    def __create_conn(cls):
        conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", password="173581", database="lab_manage",
                               charset="utf8")
        return conn
    @classmethod
    #查一条记录
    def query_one(cls,sql):
        my_cursor = None
        conn = None
        res = None
        try:
            # 创建连接,借助类名调用类方法
            conn = DBTools.__create_conn()
            # 创建游标
            my_cursor = conn.cursor()
            # 执行sql
            my_cursor.execute(sql)
            # 提取一条记录
            res = my_cursor.fetchone()
        except Exception as err:
            print("查询失败:", str(err))
        finally:
            # 关闭游标
            my_cursor.close()
            # 关闭连接
            conn.close()
            return res
    # 增删改
    @classmethod
    def db_uid(cls,sql):
        my_cursor = None
        conn = None
        res = None
        try:
            # 创建连接,借助类名调用类方法
            conn = DBTools.__create_conn()
            # 创建游标
            my_cursor = conn.cursor()
            # 执行sql
            my_cursor.execute(sql)
            # 提取一条记录
            print("Affect rows:",conn.affected_rows())
            conn.commit()
        except Exception as err:
            print("操作失败:", str(err))
            conn.rollback()
        finally:

            # 关闭游标
            my_cursor.close()
            # 关闭连接
            conn.close()
            return res

if __name__ == '__main__':
    result = DBTools.query_one("select * from user;")
    print("查询结果:",result)
    DBTools.db_uid("insert into user(username,password,name) values('keke','123456','可可');")
    DBTools.db_uid("update user set password = '111111' where id = 43;")
    DBTools.db_uid("delete from user where id = 43;")

删除员工接口数据库操作

思路分析

构造测试数据:

        删除员工所需的员工id,在测试删除员工之前通过insert语句,插入一个员工id到数据库

        直接使用该id进行删除员工操作

校验测试数据:

        发送删除员工接口成功后,通过select查询is_delete字段的值,如果为1,说明删除成功

4、持续集成

团队成员将自己的工作成果集成到一个公共平台上,成员可以每天集成一次,也可以多次

相关工具:git、gitee、Jenkins

Jenkins的准备:

Jenkins 的安装(详细教程)_jenkins安装-CSDN博客

Jenkins---jenkins配置邮箱 - 测试-安静 - 博客园 (cnblogs.com)

postman准备

使用Jenkins管理-Postman-手动构建

使用Jenkins管理-Postman-自动构建

可以看到13:56时构建成功

使用Jenkins管理-代码-手动构建

先将代码上传到gitee:在pycharm中使用Git上传代码到Gitee/GitHub(适合新手小白的超级详细步骤讲解)_pycharm上传gitee-CSDN博客

new item->jenkins02->configuration

使用Jenkins管理-代码-自动构建

同postman自动构建相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值