接口测试(3)

接口自动化

# 获取图片验证码import requestsresponse = requests.get(url="http://kdtx-test.itheima.net/api/captchaImage")print(response.status_code)
print(response.text)
import requestsurl = "http://kdtx-test.itheima.net/api/login"
header_data = {"Content-Type":"application/json"
}
login_data = {"username":"admin","password":"HM_2023_test","code":2,"uuid":"247dec0137944faeaf539d4d644ee92a"
}
response = requests.post(url=url,headers=header_data,json=login_data)print(response.status_code)
print(response.json())

# login api
import requestsclass LoginAPI:def __init__(self):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):# 不用headers 因为json 默认 content-Type : application/jsonreturn requests.post(url=self.url_login, json=test_data)
from api.login import LoginAPI
import unittest
# 调用
class TestContractBusiness(unittest.TestCase):def setUp(self):self.login_api = LoginAPI()def tearDown(self):passdef test01_login_success(self):res_v = self.login_api.get_verify_code()print(res_v.status_code)print(res_v.json())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())
import requestsclass CourseAPI:def __init__(self):self.url_add_course = "http://kdtx-test.itheima.net/api/clues/course"self.url_select_course = "http://kdtx-test.itheima.net/api/clues/course/list"def add_course(self, test_data, token):return requests.post(url=self.url_add_course, json=test_data, headers={"Authorization": token})
return requests.post(url=self.url_add_course, json=test_data, headers={"Authorization": token})json headers自动设置Content-Type = application/json
from api.login import LoginAPI
from api.course import CourseAPI
import unittestclass TestContractBusiness(unittest.TestCase):token = Nonedef setUp(self):self.login_api = LoginAPI()self.course_api = CourseAPI()def tearDown(self):passdef test01_login_success(self):# 获取验证码res_v = self.login_api.get_verify_code()# print(res_v.status_code)print(res_v.json())# 打印uuidprint(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())TestContractBusiness.token = res_l.json().get("token")print(TestContractBusiness.token)# 课程新增成功def test02_add_course(self):add_data = {"name": "测试开发提升课", "subject": "6", "price": 899, "applicablePerson": "2", "info": "测试开发提升课"}response = self.course_api.add_course(test_data=add_data, token=self.token)print(response.json())

上传文件

import requestsclass ContractAPI:def __init__(self):self.url_upload = "http://kdtx-test.itheima.net/api/common/upload"self.url_add_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})
from api.login import LoginAPI
from api.course import CourseAPI
from api.contract import ContractAPI
import unittestclass TestContractBusiness(unittest.TestCase):token = Nonedef setUp(self):self.login_api = LoginAPI()self.course_api = CourseAPI()self.contract = ContractAPI()def tearDown(self):passdef test01_login_success(self):# 获取验证码res_v = self.login_api.get_verify_code()# print(res_v.status_code)print(res_v.json())# 打印uuidprint(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())TestContractBusiness.token = res_l.json().get("token")print(TestContractBusiness.token)# 课程新增成功def test02_add_course(self):add_data = {"name": "测试开发提升课", "subject": "6", "price": 899, "applicablePerson": "2", "info": "测试开发提升课"}response = self.course_api.add_course(test_data=add_data, token=self.token)print(response.json())# 上传合同成功def test03_upload_contract(self):f = open("../data/test.pdf", "rb")response = self.contract.upload_contract(test_data=f, token=TestContractBusiness.token)print(response.json())
import requestsclass ContractAPI:def __init__(self):self.url_upload = "http://kdtx-test.itheima.net/api/common/upload"self.url_add_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.url_add_contract, json=test_data, headers={"Authorization": token})
from api.login import LoginAPI
from api.course import CourseAPI
from api.contract import ContractAPI
import unittestclass TestContractBusiness(unittest.TestCase):token = Nonedef setUp(self):self.login_api = LoginAPI()self.course_api = CourseAPI()self.contract = ContractAPI()def tearDown(self):passdef test01_login_success(self):# 获取验证码res_v = self.login_api.get_verify_code()# print(res_v.status_code)print(res_v.json())# 打印uuidprint(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())TestContractBusiness.token = res_l.json().get("token")print(TestContractBusiness.token)# 课程新增成功def test02_add_course(self):add_data = {"name": "测试开发提升课", "subject": "6", "price": 899, "applicablePerson": "2", "info": "测试开发提升课"}response = self.course_api.add_course(test_data=add_data, token=self.token)print(response.json())# 上传合同成功def test03_upload_contract(self):f = open("../data/test.pdf", "rb")response = self.contract.upload_contract(test_data=f, token=TestContractBusiness.token)print(response.json())def test04_add_contract(self):# contractNo 数据唯一add_data = {"name": "测试888","phone": "13612345678","contractNo": "HT2024070806","subject": "6","courseId": "99","channel": "0","activityId": 77,"fileName": "xxx"}response = self.contract.add_contract(test_data=add_data, token=TestContractBusiness.token)print(response.json())

    断言

from api.login import LoginAPI
import unittestclass TestLoginAPI(unittest.TestCase):uuid = Nonedef setUp(self):self.login_api = LoginAPI()response = self.login_api.get_verify_code()TestLoginAPI.uuid = response.json().get("uuid")def tearDown(self):passdef test01_sucess(self):login_data = {"username": "admin","password": "HM_2023_test","code": 2,"uuid": TestLoginAPI.uuid}response = self.login_api.login(test_data=login_data)# 预期 实际assert 200 == response.status_codeassert '成功' in response.textassert 200 == response.json().get("code")def test02_without_username(self):login_data = {"username": "","password": "HM_2023_test","code": 2,"uuid": TestLoginAPI.uuid}response = self.login_api.login(test_data=login_data)print(response.json())# 预期 实际assert 200 == response.status_codeassert '错误' in response.textassert 500 == response.json().get("code")def test03_username_not_exist(self):login_data = {"username": "jack666","password": "HM_2023_test","code": 2,"uuid": TestLoginAPI.uuid}response = self.login_api.login(test_data=login_data)print(response.json())# 预期 实际assert 200 == response.status_codeassert '错误' in response.textassert 500 == response.json().get("code")

参数化

数据准备:

{"login_001":{"username": "admin", "password": "HM_2023_test", "status": 200,"message": "成功","code": 200},"login_002":{"username": "", "password": "HM_2023_test", "status": 200,"message": "错误","code": 500},"login_003":{"username": "jack666", "password": "HM_2023_test", "status": 200,"message": "错误","code": 500}
}

读入数据代码 

import jsondef read_json(filename):filepath = "../data/" + filenamewith open(filepath, "r", encoding="utf-8") as f:return json.load(f)

scripts:

from api.login import LoginAPI
import unittest
from parameterized import parameterized
from common.read_json import read_jsondef get_data():data = read_json("login_data.json")list1 = []for i in data.values():list1.append((i.get("username"),i.get("password"),i.get("status"),i.get("message"),i.get("code")))return list1class TestLoginAPI(unittest.TestCase):uuid = Nonedef setUp(self):self.login_api = LoginAPI()response = self.login_api.get_verify_code()TestLoginAPI.uuid = response.json().get("uuid")def tearDown(self):pass@parameterized.expand(get_data())def test_login(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)# 预期 实际assert status == response.status_codeassert message in response.textassert code == response.json().get("code")

如何测试未登录

import unittest
from api.login import LoginAPI
from api.course import CourseAPIclass TestAddCourseAPI(unittest.TestCase):token = Nonedef setUp(self):self.login = LoginAPI()self.course = CourseAPI()res_v = self.login.get_verify_code()uuid = res_v.json().get("uuid")login_data = {"username": "admin","password": "HM_2023_test","code": 2,"uuid": uuid}res_l = self.login.login(login_data)TestAddCourseAPI.token = res_l.json().get("token")def tearDown(self):passdef test01_success(self):add_data = {"name": "测试开发提升课", "subject": "6", "price": 899, "applicablePerson": "2", "info": "测试开发提升课"}response = self.course.add_course(test_data=add_data, token=TestAddCourseAPI.token)assert 200 == response.status_codeassert "成功" in response.textassert 200 == response.json().get("code")# 如何测试未登录def test02_fail(self):add_data = {"name": "测试开发提升课", "subject": "6", "price": 899, "applicablePerson": "2", "info": "测试开发提升课"}response = self.course.add_course(test_data=add_data, token="xxx")assert 200 == response.status_codeassert "认证失败" in response.textassert 401 == response.json().get("code")
import requestsclass CourseAPI:def __init__(self):self.url_add_course = "http://kdtx-test.itheima.net/api/clues/course"self.url_select_course = "http://kdtx-test.itheima.net/api/clues/course/list"def add_course(self, test_data, token):return requests.post(url=self.url_add_course, json=test_data, headers={"Authorization": token})def select_course(self, test_data, token):return requests.get(url=self.url_select_course + "/{}".format(test_data), headers={"Authorization": token})
import unittest
from api.login import LoginAPI
from api.course import CourseAPIclass TestSelectCourseAPI(unittest.TestCase):token = Nonedef setUp(self):self.login = LoginAPI()self.course = CourseAPI()res_v = self.login.get_verify_code()uuid = res_v.json().get("uuid")login_data = {"username": "admin","password": "HM_2023_test","code": 2,"uuid": uuid}res_l = self.login.login(login_data)TestSelectCourseAPI.token = res_l.json().get("token")def tearDown(self):passdef test01_select_success(self):response = self.course.select_course(test_data="?name=测试开发提升课01",token=TestSelectCourseAPI.token)print(response.json())assert 200 == response.status_codeassert "成功" in response.textassert 200 == response.json().get("code")def test02_select_fail(self):response = self.course.select_course(test_data="?name=测试开发提升课01", token="xxx")print(response.json())assert 200 == response.status_codeassert "认证失败" in response.textassert 401 == response.json().get("code")
import requestsclass CourseAPI:def __init__(self):self.url_add_course = "http://kdtx-test.itheima.net/api/clues/course"self.url_select_course = "http://kdtx-test.itheima.net/api/clues/course/list"def add_course(self, test_data, token):return requests.post(url=self.url_add_course, json=test_data, headers={"Authorization": token})def select_course(self, test_data, token):return requests.get(url=self.url_select_course + "/{}".format(test_data), headers={"Authorization": token})def update_course(self,test_data,token):return requests.put(url=self.url_add_course, json=test_data, headers={"Authorization": token})
import unittest
from api.login import LoginAPI
from api.course import CourseAPIclass TestUpdateCourseAPI(unittest.TestCase):token = Nonedef setUp(self):self.login = LoginAPI()self.course = CourseAPI()res_v = self.login.get_verify_code()uuid = res_v.json().get("uuid")login_data = {"username": "admin","password": "HM_2023_test","code": 2,"uuid": uuid}res_l = self.login.login(login_data)TestUpdateCourseAPI.token = res_l.json().get("token")def tearDown(self):passdef test01_update_success(self):update_data = {"id": "23056458704355861", "name": "测试开发提升课", "subject": "6", "price": 899,"applicablePerson": "2", "info": "测试开发提升课"}response = self.course.update_course(test_data=update_data,token=TestUpdateCourseAPI.token)assert 200 == response.status_codeassert "成功" in response.textassert 200 == response.json().get("code")def test02_update_fail(self):update_data = {"id": "23056458704355861", "name": "测试开发提升课", "subject": "6", "price": 899,"applicablePerson": "2", "info": "测试开发提升课"}response = self.course.update_course(test_data=update_data,token="xxxx")assert 200 == response.status_codeassert "认证失败" in response.textassert 401 == response.json().get("code")

路径参数时

import requestsclass CourseAPI:def __init__(self):self.url_add_course = "http://kdtx-test.itheima.net/api/clues/course"self.url_select_course = "http://kdtx-test.itheima.net/api/clues/course/list"def add_course(self, test_data, token):return requests.post(url=self.url_add_course, json=test_data, headers={"Authorization": token})def select_course(self, test_data, token):return requests.get(url=self.url_select_course + "/{}".format(test_data), headers={"Authorization": token})def update_course(self,test_data,token):return requests.put(url=self.url_add_course, json=test_data, headers={"Authorization": token})def delete_course(self,course_id, token):return requests.delete(url=self.url_add_course + "/{}".format(course_id), headers={"Authorization": token})
import unittest
from api.login import LoginAPI
from api.course import CourseAPIclass TestDeleteCourseAPI(unittest.TestCase):token = Nonedef setUp(self):self.login = LoginAPI()self.course = CourseAPI()res_v = self.login.get_verify_code()uuid = res_v.json().get("uuid")login_data = {"username": "admin","password": "HM_2023_test","code": 2,"uuid": uuid}res_l = self.login.login(login_data)TestDeleteCourseAPI.token = res_l.json().get("token")def tearDown(self):passdef test01_delete_success(self):response = self.course.delete_course(course_id=23056458704355867,token=TestDeleteCourseAPI.token)print(response.json())assert 200 == response.status_codeassert "成功" in response.textassert 200 == response.json().get("code")def test02_delete_id_not_exist(self):response = self.course.delete_course(course_id=987654321,token=TestDeleteCourseAPI.token)print(response.json())assert 200 == response.status_codeassert "失败" in response.textassert 500 == response.json().get("code")def test03_delete_fail(self):response = self.course.delete_course(course_id=23056458704355868,token="xxxx")print(response.json())assert 200 == response.status_codeassert "认证失败" in response.textassert 401 == response.json().get("code")

config:

# 存放被测项目基本信息 如URL地址等
import os
BASE_URL = "http://kdtx-test.itheima.net"BASE_PATH = os.path.dirname(__file__)
print(BASE_PATH)

测试报告

from common.HTMLTestRunner import HTMLTestRunner
import unittest
import time
import config
suite = unittest.defaultTestLoader.discover(config.BASE_PATH + "/script/","test*.py")with open(config.BASE_PATH + "/report/{}.html".format(time.strftime("%Y_%m_%d %H_%M_%S")),"wb") as f:HTMLTestRunner(stream=f).run(suite)

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

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

相关文章

爱情和友情触动人心

在这个纷繁复杂的娱乐圈里,爱情与友情的故事总是能触动人心,而“于适前女友包场于适新电影”的新闻,无疑为这个充满故事的舞台又添上了一抹温暖的色彩。这不仅仅是一场电影的包场,更是一段超越常规情感的展现,不禁感叹…

网络安全——防御实验

防御实验一 拓扑结构展示: 一、 根据题目,先为办公区做安全策略主要策略有以下几点: 1、书写名称和描述,名称和描述要明确,让除本人以外的人也能理解 2、确定源地址为办公区,目标地址为DMZ区 3、确定时间…

Xilinx zc706 USB电路解析

作者 QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118 参考 USB OTG检测原理 USB3320 USB_ID为低电平时候,为host模式,USB_ID为悬空(高…

锅总反驳李彦宏说的“不要卷模型,要卷应用”

李彦宏的观点是大家不要卷模型,要卷应用,但我认为这种看法是荒谬的。以下是24条反驳李彦宏观点的论点和论据: 模型的准确性直接决定应用的质量和用户体验: 论据:在自然语言处理、计算机视觉等领域,模型的准…

哦华为仓颉语言

本来我不太想说的,奈何有不少粉丝提问提到了这语言,目前的情况我不透露太多,看过这课程C实现一门计算机编程语言到手撸虚拟机实战的懂的自然懂。 在互联网领域几乎大部分应用软件运行在X86 LINUX上居多,如果你有问题可以先学习这…

C++入门基础(2)

目录 一、引用: 1、定义: 2、特性: 3、引用的使用: 4、const引用:控制权限 const引用定义: const引用可以接收3种对象: 1、正常对象: 2、临时对象: 3、const对象: 总结&…

怎么转播别人的直播

转播别人的直播,特别是实现无缝的实时转播,可以通过一些平台的功能来实现,比如快手和抖音。下面是一个基本的步骤说明,但请注意,具体操作可能会因平台更新或政策变化而有所不同: 找到想要转播的直播间&…

新品茶叶如何一炮而红?营销高手的实战指南!

茶叶,作为中国传统的饮品,已经深入到了我们的日常生活。 随着生活水平的提升,人们对茶叶的需求也在水涨船高。 面对市场上琳琅满目的新品茶叶,如何让自家品牌脱颖而出,确实是现在头疼的问题。下面给大家分享一些目前…

PLC通信网关有什么功能特点?PLC通信网关工作原理-天拓四方

在工业自动化日益发展的今天,PLC已成为工业控制领域的核心设备。工业自动化与信息化深度融合,PLC的应用日益广泛。PLC通信网关,作为工业物联网的重要组成部分,扮演着连接PLC与云平台的桥梁角色,实现设备间的数据交换与…

Linux多进程和多线程(八)多线程

多线程 线程定义线程与进程线程资源 线程相关命令 pidstat 命令 top 命令ps 命令常见的并发方案 1. 多进程模式2. 多线程模式 创建线程 1. pthread_create() 示例:创建一个线程 2. pthread_exit() 退出线程3. pthread_join() 等待线程结束 示例: 线程分离 创建多个线程 示例 1:…

第二章节:JavaScript 基础

参考:https://blog.csdn.net/2303_78006750/article/details/138022514 **说明:**本章节所介绍的 JavaScript 并不深入,因为在 Web 安全领域不需要对 JavaScript 掌握非常深入,我们只需要能够利用本章节提及到的一些语句对网站进行测试就足够了。 1)JavaScript 简介 01-J…

选择排序(C语言版)

选择排序是一种简单直观的排序算法 算法实现 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 重复第二步&…

MySQL GROUP_CONCAT 函数详解与实战应用

提示:在需要将多个值组合成一个列表时,GROUP_CONCAT() 函数为 MySQL 提供了一种强大的方式来处理数据 文章目录 前言什么是 GROUP_CONCAT()基本语法 示例使用 GROUP_CONCAT()去除重复值排序结果 前言 提示:这里可以添加本文要记录的大概内容…

Jmeter在信息头中设置Bearer与 token 的拼接值

思路:先获取token,将token设置成全局变量,再与Bearer拼接。 第一步:使用提取器将token值提取出来,使用setProperty函数将提取的token值设置成全局变量,在登录请求后面添加BeanShell取样器 或者 BeanShell后…

【work】AI八股-神经网络相关

Deep-Learning-Interview-Book/docs/深度学习.md at master amusi/Deep-Learning-Interview-Book GitHub 网上相关总结: 小菜鸡写一写基础深度学习的问题(复制大佬的,自己复习用) - 知乎 (zhihu.com) CV面试问题准备持续更新贴 …

昇思25天学习打卡营第21天|LSTM+CRF序列标注

1. 学习内容复盘 概述 序列标注指给定输入序列,给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取,包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。以命名…

Linux|背景 环境搭建

目录 一、简述Linux发展史 1.1计算机的诞生 1.2操作系统的诞生 1.3Linux操作系统开源 1.4Linux发行版本 二、搭建Linux环境 三、使用shell远程登入到Linux 一、简述Linux发展史 可能大家未听说过Linux,或者只知道它是一个搭配在计算机上的操作系统&#xff0…

【刷题汇总 -- 求最小公倍数、数组中的最长连续子序列、字母收集】

C日常刷题积累 今日刷题汇总 - day0081、求最小公倍数1.1、题目1.2、思路1.3、程序实现 -- 穷举法1.2、程序实现 -- 辗转相除法 2、数组中的最长连续子序列2.1、题目2.2、思路2.3、程序实现 3、字母收集3.1、题目3.2、思路3.3、程序实现 4、题目链接 今日刷题汇总 - day008 1、…

02day-C++学习(const 指针与引用的关系 inline nullptr)

02day-C学习 1. 使用const注意事项 注意事项 • 可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为对象的访 问权限在引⽤过程中可以缩⼩,但是不能放⼤。 • 不需要注意的是类似 int& rb a3; double d 1…

Mybatis Plus 3.X版本的insert填充自增id的IdType.ID_WORKER策略源码分析

总结/朱季谦 某天同事突然问我,你知道Mybatis Plus的insert方法,插入数据后自增id是如何自增的吗? 我愣了一下,脑海里只想到,当在POJO类的id设置一个自增策略后,例如TableId(value "id",type …