上一篇
为什么开发测试框架?
测试工具的局限性
维护成本的增加
这里使用python,也可以选用自己熟悉的语言
1.安装requests
pip install requests
2.基本请求
get请求,getTest.py
import requests url_index='http://127.0.0.1:8081/api/files/detail?id=1' response_index = requests.get(url_index) print('Response 内容:'+response_index.text)
post请求
需要通过 Body 传递参数
postTest.py
import requests url_search = 'http://127.0.0.1:8081/api/files/searchByIds' # 拼凑 body 的参数 payload = { 'ids':(None, "1,2") } # 调用 requests 类的 post 方法,也就是 HTTP 的 POST 请求方式, # 访问了 url_search,其中通过将 payload 赋值给 data 完成 body 传参 response_search = requests.post(url_search, data=payload) print('Response 内容:' + response_search.text)
3.抽象
提取公共部分,common.py
import requests # 定义一个 common 的类,它的父类是 object class Common(object): # common 的构造函数 def __init__(self,url_root): # 被测系统的跟路由 self.url_root = url_root # get 请求,uri 是访问路由,params 是 get 请求的参数,如果没有默认为空 def get(self, uri, params=''): # 拼凑访问地址 url = self.url_root + uri + params # 通过 get 请求访问对应地址 res = requests.get(url) # 返回 request 的 Response 结果,类型为 requests 的 Response 类型 return res # post 方法,uri 是访问路由,params 是 post 请求需要传递的参数,如果没有参数这里为空 def post(self, uri, params=''): # 拼凑访问地址 url = self.url_root + uri if len(params) > 0: # 如果有参数,那么通过 post 方式访问对应的 url,并将参数赋值给 requests.post 默认参数 data # 返回 request 的 Response 结果,类型为 requests 的 Response 类型 res = requests.post(url, data=params) else: # 如果无参数,访问方式如下 # 返回 request 的 Response 结果,类型为 requests 的 Response 类型 res = requests.post(url) return res
修改getTest.py
from common import Common url_root="http://127.0.0.1:8081/api/" uri='files/detail?id=1' # 实例化Common comm = Common(url_root) response_index = comm.get(uri) print('Response 内容:'+response_index.text)
修改postTest.py
from common import Common url_root="http://127.0.0.1:8081/api/" uri='files/searchByIds' payload = { 'ids':(None, "1,2") } # 实例化Common comm = Common(url_root) response_search = comm.post(uri,payload) print('Response 内容:' + response_search.text)
测试框架就是在测试脚本中不断抽象和封装得来的
(1)不断写测试脚本
(2)观察已写好的测试脚本,找出重复部分,进行封装
(3)重复(1)、(2)
4.支持Restful
用java写restful接口
package com.example.demo.controller; import com.example.demo.model.Users; import com.example.demo.repository.UsersRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; @Slf4j @RestController @RequestMapping("/user") public class UsersController { @Autowired UsersRepository usersRepository; @GetMapping("/list") public List<Users> list() { List<Users> users = usersRepository.findAll(); return users; } /** * 新增 */ @PostMapping public Users add(@RequestBody Users user) { usersRepository.save(user); return user; } /** * 修改 */ @PutMapping public Users edit(@RequestBody Users user) { usersRepository.save(user); return user; } /** * 删除 */ @DeleteMapping("/{id}") public boolean remove(@PathVariable Integer id) { usersRepository.deleteById(id); return true; } }
View Code
重写common.py
import requests # 定义一个 common 的类,它的父类是 object class Common(object): # common 的构造函数 def __init__(self,url_root): # 被测系统的跟路由 self.url_root = url_root # 封装get 请求,uri 是访问路由,params 是 get 请求的参数,如果没有默认为空 def get(self, uri, params=''): # 拼凑访问地址 url = self.url_root + uri + params # 通过 get 请求访问对应地址 res = requests.get(url) # 返回 request 的 Response 结果,类型为 requests 的 Response 类型 return res # 封装post 方法,uri 是访问路由,params 是 post 请求需要传递的参数,如果没有参数这里为空 def post(self, uri, headers='',params=''): # 拼凑访问地址 url = self.url_root + uri if len(params) > 0: # 如果有参数,那么通过 post 方式访问对应的 url,并将参数赋值给 requests.post 默认参数 data # 返回 request 的 Response 结果,类型为 requests 的 Response 类型 res = requests.post(url, headers=headers,data=params) else: # 如果无参数,访问方式如下 # 返回 request 的 Response 结果,类型为 requests 的 Response 类型 res = requests.post(url, headers=headers) return res def put(self,uri, headers='',params=None): ''' 封装put 方法,uri 是访问路由,params 是 put 请求需要传递的参数,如果没有参数这里为空 :param uri: 访问路由 :param params: 传递参数,string 类型,默认为 None :return: 此次访问的 response ''' url = self.url_root+uri if params is not None: # 如果有参数,那么通过 put 方式访问对应的 url,并将参数赋值给 requests.put 默认参数 data # 返回 request 的 Response 结果,类型为 requests 的 Response 类型 res = requests.put(url, headers=headers, data=params) else: # 如果无参数,访问方式如下 # 返回 request 的 Response 结果,类型为 requests 的 Response 类型 res = requests.put(url) return res def delete(self,uri,params=None): ''' 封装delete 方法,uri 是访问路由,params 是 delete 请求需要传递的参数,如果没有参数这里为空 :param uri: 访问路由 :param params: 传递参数,string 类型,默认为 None :return: 此次访问的 response ''' url = self.url_root + uri if params is not None: # 如果有参数,那么通过 delete 方式访问对应的 url,并将参数赋值给 requests.delete 默认参数 data # 返回 request 的 Response 结果,类型为 requests 的 Response 类型 res = requests.delete(url, data=params) else: # 如果无参数,访问方式如下 # 返回 request 的 Response 结果,类型为 requests 的 Response 类型 res = requests.delete(url) return res
getTest.py
from common import Common url_root="http://127.0.0.1:8080" uri='/user/list' # 实例化Common comm = Common(url_root) response_index = comm.get(uri) print('Response 内容:'+response_index.text)
postTest.py
from common import Common import json url_root="http://127.0.0.1:8080" uri='/user' payload = "{/"name/": /"EFG/",/"age/": 30}" headers = { 'Content-Type': 'application/json' } # 实例化Common comm = Common(url_root) response_search = comm.post(uri,headers,payload) print('Response 内容:' + response_search.text)
putTest.py
from common import Common url_root="http://127.0.0.1:8080" uri='/user' payload = "{/"id/": 3,/"age/": 22,/"name/": /"xyz/"}" headers = { 'Content-Type': 'application/json' } # 实例化Common comm = Common(url_root) response_search = comm.put(uri,headers,payload) print('Response 内容:' + response_search.text)
delTest.py
from common import Common url_root="http://127.0.0.1:8080" uri='/user/2' # 实例化Common comm = Common(url_root) response_search = comm.delete(uri) print('Response 内容:' + response_search.text)
补充:
加快框架的生成
可以利用Postman 生成接口测试脚本
改写通过工具导出的脚本
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/20484.html