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

news2024/9/21 20:44:31

一、python+requests模块

(1)requests全局观

安装:pip install requests

1.发送请求

①requests.get() 发送get请求

②requests.post() 发送post请求

data和json的区别:取绝于你需要传递的参数的类型。
 files:文件上传
 -----------------------
form-data:表单和文件上传
x-www-form-urlencoded:纯表单
raw: json (参数为Json)
binary: 把文件转化成二进制传输

③requests.delete() 发送delete请求

④requests.put() 发送put请求

前面的四个方法底层其实都是调用下面这个方法

⑤requests.request 最核心的方法

上面这个方法调用的是下面这个方法(区别在于,这个方法能够自动化的关联有cookie关联的接口。)
session.request(method=method, url=url, **kwargs)
 method=method, 请求方式
url=url, 请求路径
 params=None, get请求传参
 data=None, post或者put请求传参
 json=None post请求传参
23 headers=None, 请求头
24 cookies=None, Cookie
25 files=None, 文件上传
26 -----------------------
27 auth=None, 鉴权
28 timeout=None, 超时处理
29 allow_redirects=True, 是否允许重定向
30 proxies=None, 设置代理
31 hooks=None, 钩子
32 stream=None, 文件下载
33 verify=None, 证书验证
34 cert=None, CA证书
35
 生成一个session对象
 requests.session()

2.接收响应:response对象

1 print ( res . text ) 返回的文本信息
2 print ( res . json ()) 返回的 json 格式
3 print ( res . content ) 返回的字节内容
4 print ( res . status_code ) 返回的状态码
5 print ( res . reason ) 返回的状态信息
6 print ( res . cookies ) 返回的 cookie
7 print ( res . encoding ) 返回编码格式
8 print ( res . headers ) 返回响应头
9 print ( res . request . 请求数据 ) 返回请求数据

(2)接口自动化实战以及正则和Jsonpath提取器的应用

五、代码实现接口自动化(黑马程序员)

视频网址:032_接口自动化测试基础介绍_哔哩哔哩_bilibili

(1)基础介绍

(2)接口自动化测试框架介绍

 

(3)requests入门

 

(4)接口对象封装--登录

 接口对象层

#接口封装时,重点是依据接口文档封装接口信息,需要使用的测试数据是从测试用例传递的、接口方法被调用时需要返回对应的响应结果

#导包
import requests

#创建接口类
class LoginAPI:
    def __init__(self):
        # 指定url基本信息
        self.url_verify="http://kdtx-test.itheima.net/api/captchaImage"
        self.url_login="http://kdtx-test.itheima.net/api/login"

    #验证码
    def get_verify_code(self):
        return requests.get(url=self.url_verify)
    #登录
    def login(self,test_data):
        return requests.post(url=self.url_login,json=test_data)

测试脚本层

#导包
from  api.login import LoginAPI
#创建测试类
class TestContractBusiness:
      #前置处理
      def setup(self):
          #实例化接口对象
          self.login_api=LoginAPI()
      #后置处理
      def teardown(self):
          pass
      #登录成功
      def test01_login_success(self):
          #获取验证码
          res_v=self.login_api.get_verify_code()
          print(res_v.status_code)
          print(res_v.json())
          #打印uuid数据
          print(res_v.json().get("uuid"))
          #登录
          login_data={
              "username":"admin",
              "password":"HM_2023_test",
              "code":"2",
              "uuid":res_v.json().get("uuid")
          }
          res_l=self.login_api.login(test_data=login_data)
          print(res_l.status_code)
          print(res_l.json())

(5)合同新增业务

课程添加--接口封装

#课程模块接口封装:核心在于依据接口文档实现接口信息封装,重点关注接口如何被调用

#导包
import requests
#创建接口类
class CourseAPI:
    #初始化
    def __init__(self):
        self.url_add_course="http://kdtx-test.itheima.net/api/clues/course"
    #课程添加
    def add_course(self,test_data,token):
        return requests.post(url=self.url_add_course,json=test_data,headers={"Authorization":token})
    

 课程添加--测试脚本

#导包
from  api.login import LoginAPI
from  api.course import CourseAPI
#创建测试类
class TestContractBusiness:
      #初始化
      token=None
      #前置处理
      def setup(self):
          #实例化接口对象
          self.login_api=LoginAPI()
          self.course_api=CourseAPI()
      #后置处理
      def teardown(self):
          pass
      #登录成功
      def test01_login_success(self):
          #获取验证码
          res_v=self.login_api.get_verify_code()
          print(res_v.status_code)
          print(res_v.json())
          #打印uuid数据
          print(res_v.json().get("uuid"))
          #登录
          login_data={
              "username":"admin",
              "password":"HM_2023_test",
              "code":"2",
              "uuid":res_v.json().get("uuid")
          }
          res_l=self.login_api.login(test_data=login_data)
          print(res_l.status_code)
          print(res_l.json())
          #提取登录成功之后的token数据并保存在类的属性中
          TestContractBusiness.token=res_l.json().get("token")
          print(TestContractBusiness.token)
      #2.课程新增成功
      def test02_add_course(self):
          add_data={"name":"测试开发提升课01","subject":"6","price":899,"applicablePerson":"2","info":"测试开发提升课01"}
          response=self.course_api.add_course(test_data=add_data,token=TestContractBusiness.token)
          print(response.json())

 合同上传--封装与调用

封装

#导包
import requests

#创建接口类
class ContractAPI:
    #初始化
    def __init__(self):
        self.url_upload="http://kdtx-test.itheima.net/api/common/upload"
    #合同上传接口
    def upload_contract(self,test_data,token):
        return requests.post(url=self.url_upload,files={"file":test_data},headers={"Authorization":token})

调用

#导包
from  api.login import LoginAPI
from  api.course import CourseAPI
from api.contract import ContractAPI
#创建测试类
class TestContractBusiness:
      #初始化
      token=None
      #前置处理
      def setup(self):
          #实例化接口对象
          self.login_api=LoginAPI()
          self.course_api=CourseAPI()
          self.contract_api=ContractAPI()
      #后置处理
      def teardown(self):
          pass
      #登录成功
      def test01_login_success(self):
          #获取验证码
          res_v=self.login_api.get_verify_code()
          print(res_v.status_code)
          print(res_v.json())
          #打印uuid数据
          print(res_v.json().get("uuid"))
          #登录
          login_data={
              "username":"admin",
              "password":"HM_2023_test",
              "code":"2",
              "uuid":res_v.json().get("uuid")
          }
          res_l=self.login_api.login(test_data=login_data)
          print(res_l.status_code)
          print(res_l.json())
          #提取登录成功之后的token数据并保存在类的属性中
          TestContractBusiness.token=res_l.json().get("token")
          print(TestContractBusiness.token)
      #2.课程新增成功
      def test02_add_course(self):
          add_data={"name":"测试开发提升课01","subject":"6","price":899,"applicablePerson":"2","info":"测试开发提升课01"}
          response=self.course_api.add_course(test_data=add_data,token=TestContractBusiness.token)
          print(response.json())
      #3.上传合同成功
      def test03_upload_contract(self):
          #读取pdf文件数据
          f=open("../data/test.pdf","rb")
          response=self.contract_api.upload_contract(test_data=f,token=TestContractBusiness.token)
          print(response.json())

合同新增--封装与调用

 

封装

#导包
import requests

#创建接口类
class ContractAPI:
    #初始化
    def __init__(self):
        self.url_upload="http://kdtx-test.itheima.net/api/common/upload"
        self.url_contract="http://kdtx-test.itheima.net/api/contract"
    #合同上传接口
    def upload_contract(self,test_data,token):
        return requests.post(url=self.url_upload,files={"file":test_data},headers={"Authorization":token})
    #合同新增
    def add_contract(self,test_data,token):
        return requests.post(url=self.add_contract,json=test_data,headers={"Authorization":token})
    

调用

#导包
from  api.login import LoginAPI
from  api.course import CourseAPI
from api.contract import ContractAPI
#创建测试类
class TestContractBusiness:
      #初始化
      token=None
      #前置处理
      def setup(self):
          #实例化接口对象
          self.login_api=LoginAPI()
          self.course_api=CourseAPI()
          self.contract_api=ContractAPI()
      #后置处理
      def teardown(self):
          pass
      #登录成功
      def test01_login_success(self):
          #获取验证码
          res_v=self.login_api.get_verify_code()
          print(res_v.status_code)
          print(res_v.json())
          #打印uuid数据
          print(res_v.json().get("uuid"))
          #登录
          login_data={
              "username":"admin",
              "password":"HM_2023_test",
              "code":"2",
              "uuid":res_v.json().get("uuid")
          }
          res_l=self.login_api.login(test_data=login_data)
          print(res_l.status_code)
          print(res_l.json())
          #提取登录成功之后的token数据并保存在类的属性中
          TestContractBusiness.token=res_l.json().get("token")
          print(TestContractBusiness.token)
      #2.课程新增成功
      def test02_add_course(self):
          add_data={"name":"测试开发提升课01","subject":"6","price":899,"applicablePerson":"2","info":"测试开发提升课01"}
          response=self.course_api.add_course(test_data=add_data,token=TestContractBusiness.token)
          print(response.json())
      #3.上传合同成功
      def test03_upload_contract(self):
          #读取pdf文件数据
          f=open("../data/test.pdf","rb")
          response=self.contract_api.upload_contract(test_data=f,token=TestContractBusiness.token)
          print(response.json())

      #4.合同新增成功
      def test04_add_contract(self):
          #contractNo:数据唯一
          add_data={"name":"测试888","phone":"13870630671",
                    "contractNo":"HT2112603","subject":"6","courseId":"99",
                    "channel":"0","activityId":77,"fileName":"文件"
                    }
          response=self.contract_api.add_contract(test_data=add_data,token=TestContractBusiness.token)
          print(response.json())

(6)登录单接口测试

#导包
from api.login import LoginAPI

#创建测试类
class TestLoginAPI:
    #初始化
    uuid=None
    #前置处理
    def setup(self):
        #实例化接口类
        self.login_api=LoginAPI()
        #获取验证码
        response=self.login_api.get_verify_code()
        print(response.json())
        #提取验证码接口返回的uuid参数值
        TestLoginAPI.uuid=response.json().get("uuid")
        print(TestLoginAPI.uuid)
    #后置处理
    def teardown(self):
        pass
    #登录成功
    def test01_success(self):
        login_data={
            "username":"admin",
            "password":"HM_2023_test",
            "code":"2",
            "uuid":TestLoginAPI.uuid
        }
        response=self.login_api.login(test_data=login_data)
        #断言响应状态码为200
        assert 200 == response.status_code
        #断言响应数据包含‘成功’
        assert '成功' in response.text
        #断言响应json数据中code值
        assert 200 == response.json().get("code")
    #登录失败(用户名为空)
    def test01_success(self):
        login_data={
            "username":"",
            "password":"HM_2023_test",
            "code":"2",
            "uuid":TestLoginAPI.uuid
        }
        response=self.login_api.login(test_data=login_data)
        #断言响应状态码为200
        assert 200 == response.status_code
        #断言响应数据包含‘错误’
        assert '错误' in response.text
        #断言响应json数据中code值
        assert 500 == response.json().get("code")
    #登录失败(未注册用户)
    def test01_success(self):
        login_data = {
            "username": "jack666",
            "password": "HM_2023_test",
            "code": "2",
            "uuid": TestLoginAPI.uuid
        }
        response = self.login_api.login(test_data=login_data)
        # 断言响应状态码为200
        assert 200 == response.status_code
        # 断言响应数据包含‘错误’
        assert '错误' in response.text
        # 断言响应json数据中code值
        assert 500 == response.json().get("code")

数据驱动实现 

#导包
from api.login import LoginAPI
import pytest

#测试数据
test_data=[
    ("admin","HM_2023_test",200,'成功',200),
    ("","HM_2023_test",200,"错误",500),
    ("jack666","HM_2023_test",200,"错误",500),
]
#创建测试类
class TestLoginAPI:
    #初始化
    uuid=None
    #前置处理
    def setup(self):
        #实例化接口类
        self.login_api=LoginAPI()
        #获取验证码
        response=self.login_api.get_verify_code()
        print(response.json())
        #提取验证码接口返回的uuid参数值
        TestLoginAPI.uuid=response.json().get("uuid")
        print(TestLoginAPI.uuid)
    #后置处理
    def teardown(self):
        pass
    #登录成功
    @pytest.mark.parametrize("username,password,status,message,code",test_data)
    def test01_success(self,username,password,status,message,code):
        login_data={
            "username":username,
            "password":password,
            "code":"2",
            "uuid":TestLoginAPI.uuid
        }
        response=self.login_api.login(test_data=login_data)
        #断言响应状态码为200
        assert status == response.status_code
        #断言响应数据包含‘成功’
        assert message in response.text
        #断言响应json数据中code值
        assert code == response.json().get("code")

json文件实现数据驱动 

修改代码

完整代码

#导包
from api.login import LoginAPI
import pytest
import json

# #测试数据
# test_data=[
#     ("admin","HM_2023_test",200,'成功',200),
#     ("","HM_2023_test",200,"错误",500),
#     ("jack666","HM_2023_test",200,"错误",500),
# ]


#读取json文件
def build_data(json_file):
    #定义空列表
    test_data=[]
    #打开json文件
    with open(json_file, 'r', encoding='utf-8') as f:
        #加载json文件数据
        json_data=json.load(f)
        #循环遍历测试数据
        for case_data in json_data:
            #转换数据格式[{},{}]==>[(),()]
            username=case_data.get("username")
            password=case_data.get("password")
            status=case_data.get("status")
            message=case_data.get("message")
            code=case_data.get("code")
            test_data.append((username,password,status,message,code))
        #返回处理之后的测试数据
        return test_data


#创建测试类
class TestLoginAPI:
    #初始化
    uuid=None
    #前置处理
    def setup(self):
        #实例化接口类
        self.login_api=LoginAPI()
        #获取验证码
        response=self.login_api.get_verify_code()
        print(response.json())
        #提取验证码接口返回的uuid参数值
        TestLoginAPI.uuid=response.json().get("uuid")
        print(TestLoginAPI.uuid)
    #后置处理
    def teardown(self):
        pass
    #登录成功
    @pytest.mark.parametrize("username,password,status,message,code",build_data(json_file="../data/login.json"))
    def test01_success(self,username,password,status,message,code):
        login_data={
            "username":username,
            "password":password,
            "code":"2",
            "uuid":TestLoginAPI.uuid
        }
        response=self.login_api.login(test_data=login_data)
        #断言响应状态码为200
        assert status == response.status_code
        #断言响应数据包含‘成功’
        assert message in response.text
        #断言响应json数据中code值
        assert code == response.json().get("code")

(7)课程管理

 ①课程添加接口自动化测试

②课程查询列表单接口自动化测试

③课程修改单接口自动化测试

④课程删除单接口自动化测试

(8)项目配置文件

(9)Allure测试报告

报错及其解决

(1)pip install requests出错

原因:版本不够高,SSL缺失

解决方法:安装最新版本python后解决

解决方法:

更新 pip: 使用 Python 解释器自带的 pip 版本更新命令来确保 pip 是最新的:

python -m pip install --upgrade pip
修复 pip 安装: 可以尝试修复 pip 的安装,有时候重新安装 pip 可能会解决问题:

python -m pip install --force-reinstall pip

(2)PyCharm添加python解释器时出现[unsupported]

原因:Pycharm版本与python3.12.4不兼容

解决方法:下载更高版本的Pycharm,比如Pycharm2023.1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051608.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大学成长之路:如何从烧锅炉的逆袭成为FPGA大厂高管

如何从烧锅炉的逆袭成为FPGA大厂Sales Director 在即将到来的开学季,很多学子从高中生成为一个大学生,走入新的征程。大学生涯是人生的一个非常重要的阶段,如何度过大学4年的时光,并学有所成,是很多大学新生和家长思考…

Spring IoCDI(下)—DI的尾声

我们之前学习了控制反转IoC,接下来就开始学习依赖注入DI的细节。 依赖注入是一个过程,是指IoC容器在创建Bean时,去提供运行时所依赖的资源,而资源指的就是对象。我们使用 Autowired 注解,完成依赖注入的操作。简单来说…

AMBA-CHI协议详解(六)

AMBA-CHI协议详解(一) AMBA-CHI协议详解(二) AMBA-CHI协议详解(三) AMBA-CHI协议详解(四) AMBA-CHI协议详解(五) AMBA-CHI协议详解(六&#xff09…

JavaSocket编程+JDBC实战技术

一、JavaSocket编程 1.1HTTP协议 后端原理 2. 特点 同步:就是两个任务执行的过程中,其中一个任务要等另一个任务完成某各阶段性工作才能继续执行,如厨师A炒番茄,将葱花放入锅中,然后需要放入番茄,但是厨…

【自动驾驶】控制算法(二)三大坐标系与车辆运动学模型

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

Dubbo服务自动Web化之路

本文字数:6047字 预计阅读时间:40分钟 01 故障出现 事情起源于一次故障,2023年12月14日14点26分,大量Dubbo服务报出异常,无法链接zookeeper集群: Session 0x0 for server dubboZk.xxx.com/10.x.x.x:2181, C…

【高校科研前沿】南方科技大学冯炼教授等人在遥感顶刊RSE发文:全球人类改造的基塘系统制图

1.文章简介 论文名称:Global mapping of human-transformed dike-pond systems(全球人类改造的基塘系统制图) 第一作者及单位:Yang Xu(南方科技大学环境学院) 第一通讯作者及单位:冯炼&#x…

机器学习:线性回归算法(一元和多元回归代码)

1、线性回归 1、数据准备: 描述如何获取和准备数据。 2、图像预处理: 包括图像读取。 3、将数据划分为训练集和测试集。 4、计算数据的相关系数矩阵。 5、模型训练: 详细说明如何使用线性回归算法训练模型&…

京东2025届秋招 算法开发工程师 第2批笔试

目录 1. 第一题2. 第二题3. 第三题 ⏰ 时间:2024/08/17 🔄 输入输出:ACM格式 ⏳ 时长:2h 本试卷还有选择题部分,但这部分比较简单就不再展示。 1. 第一题 村子里有一些桩子,从左到右高度依次为 1 , 1 2…

达梦数据库的系统视图v$reserved_words

达梦数据库的系统视图v$reserved_words 达梦数据库(DM Database)提供了一系列系统视图以帮助管理员和开发人员了解数据库的状态和配置。V$RESERVED_WORDS 是其中一个系统视图,它显示了数据库系统中已保留的关键字。这些关键字在SQL语句中具有…

SpringBoot自动配置--原理探究

什么是自动配置? SpringBoot自动配置是指在SpringBoot应用启动时,可以把一些配置类自动注入到Spring的IOC容器中,项目运行时可以直接使用这些配置类的属性。简单来说就是用注解来对一些常规的配置做默认配置,简化xml配置内容&…

【三维目标检测】H3DNet(三)

【版权声明】本文为博主原创文章,未经博主允许严禁转载,我们会定期进行侵权检索。 参考书籍:《人工智能点云处理及深度学习算法》 H3DNet数据和源码配置调试过程以及主干网络介绍请参考上一篇博文:【三维目标检测】H3DNet&am…

[Java]面向对象-内部类

类的五大成员:属性、方法、构造方法、代码块、内部类 内部类 在一个类里边再定义一个类。可以在外部其他类中创建内部类对象并调用它的方法 public class Outer {//外部类public class inner{//内部类} } 内部类使用时机: 内部类表示的事物是外部类…

打造高可用集群的基石:深度解析Keepalived实践与优化

高可用集群 集群类型 集群类型主要分为负载均衡集群(LB)、高可用集群(HA)和高性能计算集群(HPC)三大类。每种集群类型都有其特定的应用场景和优势。 1. 负载均衡集群(LB) 负载均衡集…

drawio的问题

drawio的问题 先给出drawio的链接https://app.diagrams.net/ 我在用overleaf写论文的过程中,发现了一个问题,就是使用drawio画好图之后,只能保存以下几个选项: 但是不管是什么类型,在overleaf上面图片都不显示。如果…

SpringBoot如何做自动配置

目录 一、什么是springboot的自动配置? 二、Enable注解 三、springboot自动配置流程 ComponentScan SpringBootConfiguration EnableAutoConfiguration注解 condition的几个注解: 四、自定义启动类 需求: 参考: 实现步…

使用JQUERY请求数据出现500报错

我在写项目的时候遇到了一个问题,就是在存商品id的时候我将它使用了JSON.stringify的格式转换了!!!于是便爆出了500这个错误!!! 我将JSON.stringify的格式去除之后,它就正常显示了&a…

【数学建模】趣味数模问题——四人追逐问题

问题描述: 如图所示,在正方形ABCD的四个顶点各有一个人。在初始时刻 t0 时,四人同时出发,以匀速 v 沿顺时针方向朝下一个人移动。如果他们始终对准下一个人为目标行进,最终结果会如何?需要作出各自的运动轨…

路径规划 | 灰狼算法+B样条曲线优化无人机三维路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 灰狼算法B样条曲线优化无人机三维路径规划(Matlab) 群智能路径规划算法。三维灰狼算法(GWO)加B样条曲线优化的matlab代码。无人机(UAV)路径规划…

QT:安装软件

QT 介绍 QT是一个跨平台的C应用程序开发框架,具有广泛的应用领域和强大的功能。 定义:QT是一个跨平台的C图形用户界面应用程序框架,为开发者提供了建立艺术级图形界面所需的所有功能。 特点:QT具有短平快的优秀特质,即…