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

打印 上一主题 下一主题

主题 549|帖子 549|积分 1657

一、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)接口对象封装--登录

    接口对象层

  1. #接口封装时,重点是依据接口文档封装接口信息,需要使用的测试数据是从测试用例传递的、接口方法被调用时需要返回对应的响应结果
  2. #导包
  3. import requests
  4. #创建接口类
  5. class LoginAPI:
  6.     def __init__(self):
  7.         # 指定url基本信息
  8.         self.url_verify="http://kdtx-test.itheima.net/api/captchaImage"
  9.         self.url_login="http://kdtx-test.itheima.net/api/login"
  10.     #验证码
  11.     def get_verify_code(self):
  12.         return requests.get(url=self.url_verify)
  13.     #登录
  14.     def login(self,test_data):
  15.         return requests.post(url=self.url_login,json=test_data)
复制代码
测试脚本层
  1. #导包
  2. from  api.login import LoginAPI
  3. #创建测试类
  4. class TestContractBusiness:
  5.       #前置处理
  6.       def setup(self):
  7.           #实例化接口对象
  8.           self.login_api=LoginAPI()
  9.       #后置处理
  10.       def teardown(self):
  11.           pass
  12.       #登录成功
  13.       def test01_login_success(self):
  14.           #获取验证码
  15.           res_v=self.login_api.get_verify_code()
  16.           print(res_v.status_code)
  17.           print(res_v.json())
  18.           #打印uuid数据
  19.           print(res_v.json().get("uuid"))
  20.           #登录
  21.           login_data={
  22.               "username":"admin",
  23.               "password":"HM_2023_test",
  24.               "code":"2",
  25.               "uuid":res_v.json().get("uuid")
  26.           }
  27.           res_l=self.login_api.login(test_data=login_data)
  28.           print(res_l.status_code)
  29.           print(res_l.json())
复制代码

  
  (5)合同新增业务


课程添加--接口封装

  
  1. #课程模块接口封装:核心在于依据接口文档实现接口信息封装,重点关注接口如何被调用
  2. #导包
  3. import requests
  4. #创建接口类
  5. class CourseAPI:
  6.     #初始化
  7.     def __init__(self):
  8.         self.url_add_course="http://kdtx-test.itheima.net/api/clues/course"
  9.     #课程添加
  10.     def add_course(self,test_data,token):
  11.         return requests.post(url=self.url_add_course,json=test_data,headers={"Authorization":token})
  12.    
复制代码
 课程添加--测试脚本

   

  1. #导包
  2. from  api.login import LoginAPI
  3. from  api.course import CourseAPI
  4. #创建测试类
  5. class TestContractBusiness:
  6.       #初始化
  7.       token=None
  8.       #前置处理
  9.       def setup(self):
  10.           #实例化接口对象
  11.           self.login_api=LoginAPI()
  12.           self.course_api=CourseAPI()
  13.       #后置处理
  14.       def teardown(self):
  15.           pass
  16.       #登录成功
  17.       def test01_login_success(self):
  18.           #获取验证码
  19.           res_v=self.login_api.get_verify_code()
  20.           print(res_v.status_code)
  21.           print(res_v.json())
  22.           #打印uuid数据
  23.           print(res_v.json().get("uuid"))
  24.           #登录
  25.           login_data={
  26.               "username":"admin",
  27.               "password":"HM_2023_test",
  28.               "code":"2",
  29.               "uuid":res_v.json().get("uuid")
  30.           }
  31.           res_l=self.login_api.login(test_data=login_data)
  32.           print(res_l.status_code)
  33.           print(res_l.json())
  34.           #提取登录成功之后的token数据并保存在类的属性中
  35.           TestContractBusiness.token=res_l.json().get("token")
  36.           print(TestContractBusiness.token)
  37.       #2.课程新增成功
  38.       def test02_add_course(self):
  39.           add_data={"name":"测试开发提升课01","subject":"6","price":899,"applicablePerson":"2","info":"测试开发提升课01"}
  40.           response=self.course_api.add_course(test_data=add_data,token=TestContractBusiness.token)
  41.           print(response.json())
复制代码
 合同上传--封装与调用

   

  封装
  

  1. #导包
  2. import requests
  3. #创建接口类
  4. class ContractAPI:
  5.     #初始化
  6.     def __init__(self):
  7.         self.url_upload="http://kdtx-test.itheima.net/api/common/upload"
  8.     #合同上传接口
  9.     def upload_contract(self,test_data,token):
  10.         return requests.post(url=self.url_upload,files={"file":test_data},headers={"Authorization":token})
复制代码
调用
  

  1. #导包
  2. from  api.login import LoginAPI
  3. from  api.course import CourseAPI
  4. from api.contract import ContractAPI
  5. #创建测试类
  6. class TestContractBusiness:
  7.       #初始化
  8.       token=None
  9.       #前置处理
  10.       def setup(self):
  11.           #实例化接口对象
  12.           self.login_api=LoginAPI()
  13.           self.course_api=CourseAPI()
  14.           self.contract_api=ContractAPI()
  15.       #后置处理
  16.       def teardown(self):
  17.           pass
  18.       #登录成功
  19.       def test01_login_success(self):
  20.           #获取验证码
  21.           res_v=self.login_api.get_verify_code()
  22.           print(res_v.status_code)
  23.           print(res_v.json())
  24.           #打印uuid数据
  25.           print(res_v.json().get("uuid"))
  26.           #登录
  27.           login_data={
  28.               "username":"admin",
  29.               "password":"HM_2023_test",
  30.               "code":"2",
  31.               "uuid":res_v.json().get("uuid")
  32.           }
  33.           res_l=self.login_api.login(test_data=login_data)
  34.           print(res_l.status_code)
  35.           print(res_l.json())
  36.           #提取登录成功之后的token数据并保存在类的属性中
  37.           TestContractBusiness.token=res_l.json().get("token")
  38.           print(TestContractBusiness.token)
  39.       #2.课程新增成功
  40.       def test02_add_course(self):
  41.           add_data={"name":"测试开发提升课01","subject":"6","price":899,"applicablePerson":"2","info":"测试开发提升课01"}
  42.           response=self.course_api.add_course(test_data=add_data,token=TestContractBusiness.token)
  43.           print(response.json())
  44.       #3.上传合同成功
  45.       def test03_upload_contract(self):
  46.           #读取pdf文件数据
  47.           f=open("../data/test.pdf","rb")
  48.           response=self.contract_api.upload_contract(test_data=f,token=TestContractBusiness.token)
  49.           print(response.json())
复制代码
合同新增--封装与调用

    

  封装
  

  1. #导包
  2. import requests
  3. #创建接口类
  4. class ContractAPI:
  5.     #初始化
  6.     def __init__(self):
  7.         self.url_upload="http://kdtx-test.itheima.net/api/common/upload"
  8.         self.url_contract="http://kdtx-test.itheima.net/api/contract"
  9.     #合同上传接口
  10.     def upload_contract(self,test_data,token):
  11.         return requests.post(url=self.url_upload,files={"file":test_data},headers={"Authorization":token})
  12.     #合同新增
  13.     def add_contract(self,test_data,token):
  14.         return requests.post(url=self.add_contract,json=test_data,headers={"Authorization":token})
  15.    
复制代码
调用
  1. #导包
  2. from  api.login import LoginAPI
  3. from  api.course import CourseAPI
  4. from api.contract import ContractAPI
  5. #创建测试类
  6. class TestContractBusiness:
  7.       #初始化
  8.       token=None
  9.       #前置处理
  10.       def setup(self):
  11.           #实例化接口对象
  12.           self.login_api=LoginAPI()
  13.           self.course_api=CourseAPI()
  14.           self.contract_api=ContractAPI()
  15.       #后置处理
  16.       def teardown(self):
  17.           pass
  18.       #登录成功
  19.       def test01_login_success(self):
  20.           #获取验证码
  21.           res_v=self.login_api.get_verify_code()
  22.           print(res_v.status_code)
  23.           print(res_v.json())
  24.           #打印uuid数据
  25.           print(res_v.json().get("uuid"))
  26.           #登录
  27.           login_data={
  28.               "username":"admin",
  29.               "password":"HM_2023_test",
  30.               "code":"2",
  31.               "uuid":res_v.json().get("uuid")
  32.           }
  33.           res_l=self.login_api.login(test_data=login_data)
  34.           print(res_l.status_code)
  35.           print(res_l.json())
  36.           #提取登录成功之后的token数据并保存在类的属性中
  37.           TestContractBusiness.token=res_l.json().get("token")
  38.           print(TestContractBusiness.token)
  39.       #2.课程新增成功
  40.       def test02_add_course(self):
  41.           add_data={"name":"测试开发提升课01","subject":"6","price":899,"applicablePerson":"2","info":"测试开发提升课01"}
  42.           response=self.course_api.add_course(test_data=add_data,token=TestContractBusiness.token)
  43.           print(response.json())
  44.       #3.上传合同成功
  45.       def test03_upload_contract(self):
  46.           #读取pdf文件数据
  47.           f=open("../data/test.pdf","rb")
  48.           response=self.contract_api.upload_contract(test_data=f,token=TestContractBusiness.token)
  49.           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)登录单接口测试

   

  1. #导包
  2. from api.login import LoginAPI
  3. #创建测试类
  4. class TestLoginAPI:
  5.     #初始化
  6.     uuid=None
  7.     #前置处理
  8.     def setup(self):
  9.         #实例化接口类
  10.         self.login_api=LoginAPI()
  11.         #获取验证码
  12.         response=self.login_api.get_verify_code()
  13.         print(response.json())
  14.         #提取验证码接口返回的uuid参数值
  15.         TestLoginAPI.uuid=response.json().get("uuid")
  16.         print(TestLoginAPI.uuid)
  17.     #后置处理
  18.     def teardown(self):
  19.         pass
  20.     #登录成功
  21.     def test01_success(self):
  22.         login_data={
  23.             "username":"admin",
  24.             "password":"HM_2023_test",
  25.             "code":"2",
  26.             "uuid":TestLoginAPI.uuid
  27.         }
  28.         response=self.login_api.login(test_data=login_data)
  29.         #断言响应状态码为200
  30.         assert 200 == response.status_code
  31.         #断言响应数据包含‘成功’
  32.         assert '成功' in response.text
  33.         #断言响应json数据中code值
  34.         assert 200 == response.json().get("code")
  35.     #登录失败(用户名为空)
  36.     def test01_success(self):
  37.         login_data={
  38.             "username":"",
  39.             "password":"HM_2023_test",
  40.             "code":"2",
  41.             "uuid":TestLoginAPI.uuid
  42.         }
  43.         response=self.login_api.login(test_data=login_data)
  44.         #断言响应状态码为200
  45.         assert 200 == response.status_code
  46.         #断言响应数据包含‘错误’
  47.         assert '错误' in response.text
  48.         #断言响应json数据中code值
  49.         assert 500 == response.json().get("code")
  50.     #登录失败(未注册用户)
  51.     def test01_success(self):
  52.         login_data = {
  53.             "username": "jack666",
  54.             "password": "HM_2023_test",
  55.             "code": "2",
  56.             "uuid": TestLoginAPI.uuid
  57.         }
  58.         response = self.login_api.login(test_data=login_data)
  59.         # 断言响应状态码为200
  60.         assert 200 == response.status_code
  61.         # 断言响应数据包含‘错误’
  62.         assert '错误' in response.text
  63.         # 断言响应json数据中code值
  64.         assert 500 == response.json().get("code")
复制代码

  数据驱动实现 

   

  

  1. #导包
  2. from api.login import LoginAPI
  3. import pytest
  4. #测试数据
  5. test_data=[
  6.     ("admin","HM_2023_test",200,'成功',200),
  7.     ("","HM_2023_test",200,"错误",500),
  8.     ("jack666","HM_2023_test",200,"错误",500),
  9. ]
  10. #创建测试类
  11. class TestLoginAPI:
  12.     #初始化
  13.     uuid=None
  14.     #前置处理
  15.     def setup(self):
  16.         #实例化接口类
  17.         self.login_api=LoginAPI()
  18.         #获取验证码
  19.         response=self.login_api.get_verify_code()
  20.         print(response.json())
  21.         #提取验证码接口返回的uuid参数值
  22.         TestLoginAPI.uuid=response.json().get("uuid")
  23.         print(TestLoginAPI.uuid)
  24.     #后置处理
  25.     def teardown(self):
  26.         pass
  27.     #登录成功
  28.     @pytest.mark.parametrize("username,password,status,message,code",test_data)
  29.     def test01_success(self,username,password,status,message,code):
  30.         login_data={
  31.             "username":username,
  32.             "password":password,
  33.             "code":"2",
  34.             "uuid":TestLoginAPI.uuid
  35.         }
  36.         response=self.login_api.login(test_data=login_data)
  37.         #断言响应状态码为200
  38.         assert status == response.status_code
  39.         #断言响应数据包含‘成功’
  40.         assert message in response.text
  41.         #断言响应json数据中code值
  42.         assert code == response.json().get("code")
复制代码
json文件实现数据驱动 

   

  修改代码
  

  完整代码
  1. #导包
  2. from api.login import LoginAPI
  3. import pytest
  4. import json
  5. # #测试数据
  6. # test_data=[
  7. #     ("admin","HM_2023_test",200,'成功',200),
  8. #     ("","HM_2023_test",200,"错误",500),
  9. #     ("jack666","HM_2023_test",200,"错误",500),
  10. # ]
  11. #读取json文件
  12. def build_data(json_file):
  13.     #定义空列表
  14.     test_data=[]
  15.     #打开json文件
  16.     with open(json_file, 'r', encoding='utf-8') as f:
  17.         #加载json文件数据
  18.         json_data=json.load(f)
  19.         #循环遍历测试数据
  20.         for case_data in json_data:
  21.             #转换数据格式[{},{}]==>[(),()]
  22.             username=case_data.get("username")
  23.             password=case_data.get("password")
  24.             status=case_data.get("status")
  25.             message=case_data.get("message")
  26.             code=case_data.get("code")
  27.             test_data.append((username,password,status,message,code))
  28.         #返回处理之后的测试数据
  29.         return test_data
  30. #创建测试类
  31. class TestLoginAPI:
  32.     #初始化
  33.     uuid=None
  34.     #前置处理
  35.     def setup(self):
  36.         #实例化接口类
  37.         self.login_api=LoginAPI()
  38.         #获取验证码
  39.         response=self.login_api.get_verify_code()
  40.         print(response.json())
  41.         #提取验证码接口返回的uuid参数值
  42.         TestLoginAPI.uuid=response.json().get("uuid")
  43.         print(TestLoginAPI.uuid)
  44.     #后置处理
  45.     def teardown(self):
  46.         pass
  47.     #登录成功
  48.     @pytest.mark.parametrize("username,password,status,message,code",build_data(json_file="../data/login.json"))
  49.     def test01_success(self,username,password,status,message,code):
  50.         login_data={
  51.             "username":username,
  52.             "password":password,
  53.             "code":"2",
  54.             "uuid":TestLoginAPI.uuid
  55.         }
  56.         response=self.login_api.login(test_data=login_data)
  57.         #断言响应状态码为200
  58.         assert status == response.status_code
  59.         #断言响应数据包含‘成功’
  60.         assert message in response.text
  61.         #断言响应json数据中code值
  62.         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
  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

泉缘泉

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表