【软件测试】--接口自动化测试

avatar
作者
猴君
阅读量:0

1. 接口自动化

1.1 概念

接口测试:是对系统或组件之间的接口进行测试,主要是校验数据的交换、传递和控制管理过程,以及相互逻辑依赖关系
自动化测试:是把以人为驱动的测试行为转化为机器执行的一种过程

接口自动化测试:是让程序或者工具代替人工自动完成对接口进行测试的一种过程

1.2 流程

  1. 需求分析
  • 请求(请求url、请求方法、请求参数)
  • 响应 (响应数据、状态码)
  1. 挑选需要做自动化测试的接口

  2. 设计自动化测试用例

  3. 搭建自动化测试环境(如:python+pycharm)

  4. 设计自动化测试项目的架构(参数化、用例执行框架)

  5. 编写代码

  6. 执行测试用例(unitest、pytest)

  7. 生成测试报告(htmltestrunner\allure)并分析结果

2. Requests库

2.1 什么是Requests库

2.1.1 介绍

Requests库是用Python编写的,基于urllib,采用Apache2 Licensed 开源协议的HTTP库,相比urllib库,Requests库更加方便,可以节约我们大量的工作,完全满足HTTP测试需求

2.1.2 安装

pip3 install requests //python3.8 

输入pip3 show requests如下图即安装成功
如下图:

在这里插入图片描述

2.2 发送请求

常见的HTTP请求方式:GET、POST、PUT、DELETE、HEAD、OPTIONS

使用requests发送网络请求很简单,只需要调用HTTP请求类型所对应的方法即可

2.2.1 GET请求

import requests response = requests.get("http://www.baidu.com") 

请求方法的返回值response为Response对象,我们可以从这个对象中获取我们想要的响应信息
1、获取请求url:响应对象.url
2、获取响应状态码:响应对象.status_code
3、获取响应内容:响应对象.text

""" 目标:GET请求方法演练 案例:http://www.baidu.com 请求:     1、请求方法:GET 响应:     1、响应对象.url #获取请求url     2、响应对象.status_code #获取响应状态码     3、响应对象.text #以文本形式显示响应内容 """  # 1、导包 import requests  # 2、调用get url = "http://www.baidu.com" r = requests.get(url) # 3、获取请求url print("请求url:",r.url) # 4、获取响应状态码 print("状态码:",r.status_code) # 5、获取响应信息 print("响应内容",r.text) 

image-20240717095640289

请求带参(动态传参)

  • http://www.baidu.com?id=1001
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • http://www.baidu.com?id=1001,1002
    image-20240717100146488

  • http://www.baidu.com?id=1001&kw=北京

image-20240717095858671

2.2.2 POST请求

步骤:

  1. 导包 import requests
  2. 调用post方法 requests.post(url,json,headers,data)

data与json区别

  • data:字段对象
  • json:json字符串
  • 在python中字典对象和json字符串长得一样,但是后台格式是有区别的
    • 如何将字段对象转为json字符串?
      • 1、导入json
      • 2、json.dumps(字典对象)#转换json字符串

响应数据.text和.json区别

  • json方式返回类型为字典,可以通过键名来获取响应的值
  • text:返回的类型为字符串,无法通过键名来获取响应的值
  • 共同点:长得都像字典
import requests import time # 2、调用post  #请求url  # 设置cookies变量 cookies = {"PHPSESSID":"mcu190hl4685pjrru96t4t7g17"}  url = "http://106.54.9.13/index.php/admin/User/add_user" #请求headers headers = {"Content-Type":"application/json"} #请求json data = {     "nickname": "hello",     "password": "123456",     "mobile": "12345678910",     "sex": 0 }  time.sleep(4) r=requests.post(url,json=data,headers=headers,cookies=cookies)  # 3、获取响应对象 print(r.json) # 4、获取响应状态码 print("状态码:", r.status_code) # 5、获取响应数据 print("响应数据", r.text)  ''' :params url:请求的url :params data:(可选)要发送到请求体中的字典、元组、字节或文件对象 :params json:(可选)要发送到请求体中的JSON数据 :rtype:requests.Response ''' 

image-20240717105049598

2.2.3 PUT请求

作用:更新资源
应用:

  1. 导包 import requests
  2. 调用put方法 r = requests.put(url,json,heders) 返回对象为response对象

2.2.4 DELETE请求

作用:删除资源
应用:

  1. 导包 import requests
  2. 调用put方法 requests.delete(url)

响应:

  • 响应状态码:204

2.3 响应内容

请求方法的返回值response为Response对象,我们可以从这个对象中获取所有我们想要的响应内容

response.satus_code  状态码: 查询 200 新增 201 删除 204 更新 201/200 response.url response.encoding 查看默认请求编码格式,设置响应编码格式 response.headers response.cookies response.text 以文本形式解析响应内容 response.content 以字节码形式解析响应内容 response.json 以json字符串形式解析响应内容 

2.4 案例

需求

使用requests库调用TPshop登陆功能的相关接口,完成登陆操作,登陆成功后获取“我的订单”页面的数据

相关数据

1、获取验证码:http://106.54.9.13/index.php?m=Home&c=User&a=verify
2、登陆接口:http://106.54.9.13/index.php?m=Home&c=User&a=do_login
3、订单: http://106.54.9.13/index.php/Home/Order/order_list.html
4、登陆数据
data = {“username”:" 18184761327",
“password”: “123456”,
“verify_code”: 8888}

操作步骤

1、请求登陆url+登陆数据

image-20240711103015177

a295c5012a378e9f479820c0c29854d

cookie

来源:由服务器生成

作用:区分同一请求客户端

获取:响应对象.cookies

设置:cookies={key:value}z

image-20240711105939538

直接使用获取验证码成功返回的cookies也可以成功登陆

image-20240711110054050

# 1、导包 import requests  # 请求验证码 url_verify_code = "http://106.54.9.13/index.php?m=Home&c=User&a=verify" r = requests.get(url_verify_code)  # 获取cookies r_cookies = r.cookies print("浏览器生成的cookies:", r_cookies) # 设置cookies变量 cookies = {"PHPSESSID": r_cookies["PHPSESSID"]} print("我们生成的cookies", cookies) # 2、调用post + 添加cookies url_login = "http://106.54.9.13/index.php?m=Home&c=User&a=do_login" data = {"username": " 18184761327",         "password": "123456",         "verify_code": 8888} r = requests.post(url=url_login, data=data, cookies=r_cookies)  # 3.验证是否登陆成功 print(r.json()) # 4. 查询我的订单  url_order = "http://106.54.9.13/index.php/Home/Order/order_list.html" r = requests.get(url=url_order, cookies=r_cookies) print(r.text)  

2.5 Session

在requests中,session对象是一个非常常用的对象,这个对象代表一次用户会话:从客户端浏览服务器连接服务器开始,到客户端浏览器与服务器断开

会话能让我们在跨请求时候保持某些参数,比如在同一个session实例发出的所有请求之间保持cookies

创建session对象

session = requests.session() 

得到session对象后,就可以调用该对象中的方法来发送请求

session案例

需求

使用requests库调用TPshop登陆功能的相关接口,完成登陆操作,登陆成功后获取“我的订单”页面的数据

相关数据

1、获取验证码:http://106.54.9.13/index.php?m=Home&c=User&a=verify
2、登陆接口:http://106.54.9.13/index.php?m=Home&c=User&a=do_login
3、订单: http://106.54.9.13/index.php/Home/Order/order_list.html
4、登陆数据
data = {“username”:" 18184761327",
“password”: “123456”,
“verify_code”: 8888}

# 1、导包 import requests # 2、获取session对象 session = requests.session() # 3、请求验证码,让session对象记录cookies信息 url_verify_code = "http://106.54.9.13/index.php?m=Home&c=User&a=verify" session.get(url_verify_code)  # 4、请求登陆 url_login = "http://106.54.9.13/index.php?m=Home&c=User&a=do_login" data = {"username": " 18184761327",         "password": "123456",         "verify_code": 8888} r = session.post(url=url_login,data=data) # 5.验证是否登陆成功 print(r.json()) # 6. 查询我的订单  url_order = "http://106.54.9.13/index.php/Home/Order/order_list.html" r = session.get(url=url_order) print(r.text)  

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3. 集成UnitTest

3.1 集成UnitTest

将接口测试脚本集成到UnitTest单元测试框架中,利用UnitTest的功能来运行接口测试用例

3.1.1 需求

使用TPShop项目完成对登陆功能的接口测试

3.3.2 用例设计

用例编号模块用例名称接口名称请求URL请求方法请求参数类型请求参数预期结果测试结果备注
tpshop_login_001登陆登陆成功获取验证码
登陆
http://106.54.9.13/index.php?m=Home&c=User&a=verify
http://106.54.9.13/index.php?m=Home&c=User&a=do_login
GET
POST

form
data = {
“username”: " 18184761327", “password”: “123456”, “verify_code”: 8888
}
获取到验证码图片
登陆成功
tpshop_login_002登陆账号不存在获取验证码
登陆
http://106.54.9.13/index.php?m=Home&c=User&a=verify
http://106.54.9.13/index.php?m=Home&c=User&a=do_login
GET
POST

form
data = {
“username”: " 18184761327", “password”: “123456”, “verify_code”: 8888
}
获取到验证码图片
账号不存在
tpshop_login_003登陆密码错误获取验证码
登陆
http://106.54.9.13/index.php?m=Home&c=User&a=verify
http://106.54.9.13/index.php?m=Home&c=User&a=do_login
GET
POST

form
data = {
“username”: " 18184761327", “password”: “123456”, “verify_code”: 8888
}
获取到验证码图片
密码错误

结构:

  • setUp
    • 作用:test开始执行方法之前,首先被执行
    • 应用:
      • 获取session对象
      • 登陆URL
      • 验证码URL
  • tearDown
    • 作用:test开始执行方法之后,会被执行
    • 应用:
      • 关闭session对象
  • test_login_success
    • 作用:登陆成功用例
    • 应用
      • 请求验证码–>让session对象获取并记录cookies信息
      • 请求登陆
      • 断言验证测试结果
  • test_username_not_exist:
    • 作用:登陆失败,用户名不存在
    • 应用
      • 请求验证码–>让session对象获取并记录cookies信息
      • 请求登陆
      • 断言验证测试结果
  • test_password_error
    • 作用:登陆失败,密码错误
    • 应用
      • 请求验证码–>让session对象获取并记录cookies信息
      • 请求登陆
      • 断言验证测试结果
# 1、导包 import requests import unittest   # 2、新建测试类 class TPShopLogin(unittest.TestCase):     # 3、setUp     def setUp(self):         # 获取session对象         self.session = requests.session()         # 登陆URL         self.url_login = "http://106.54.9.13/index.php?m=Home&c=User&a=do_login"         # 验证码URL         self.url_verify_code = "http://106.54.9.13/index.php?m=Home&c=User&a=verify"         # url_order = "http://106.54.9.13/index.php/Home/Order/order_list.html"      # 4、tearDown     def tearDown(self):         # 关闭session         self.session.close()      # 5.登陆成功     def test_login_success(self):         # 请求验证码--获取cookies         self.session.get(self.url_verify_code)         # 请求登陆         data = {"username": " 18184761327",                 "password": "123456",                 "verify_code": 8888}         r = self.session.post(self.url_login, data=data)         # 断言         try:             self.assertEqual("登陆成功", r.json()['msg'])         except AssertionError as e:             print(e)      # 6. 登陆失败,用户名不存在     def test_username_not_exist(self):         # 请求验证码--获取cookies         self.session.get(self.url_verify_code)         # 请求登陆         data = {"username": " 18111111111",                 "password": "123456",                 "verify_code": 8888}         r = self.session.post(self.url_login, data=data)         # 断言         try:             self.assertEqual("账号不存在!", r.json()['msg'])         except AssertionError as e:             print(e)      # 7. 登陆失败,密码错误     def test_password_error(self):         # 请求验证码--获取cookies         self.session.get(self.url_verify_code)         # 请求登陆         data = {"username": " 18184761327",                 "password": "111111",                 "verify_code": 8888}         r = self.session.post(self.url_login, data=data)         # 断言         try:             self.assertEqual("密码错误", r.json()['msg'])         except AssertionError as e:             print(e)   if __name__ == '__main__':     unittest.main()  

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!