重庆网站建设公司哪家好北京建网站定制价格

张小明 2026/1/9 15:05:32
重庆网站建设公司哪家好,北京建网站定制价格,广告公司的电话,门户网上登录入口一、简介 本文从一个简单的登录接口测试入手#xff0c;一步步调整优化接口调用姿势#xff1b; 然后简单讨论了一下接口测试框架的要点#xff1b; 最后介绍了一下我们目前正在使用的接口测试框架 pithy。 期望读者可以通过本文对接口自动化测试有一个大致的了解。 二…一、简介本文从一个简单的登录接口测试入手一步步调整优化接口调用姿势然后简单讨论了一下接口测试框架的要点最后介绍了一下我们目前正在使用的接口测试框架 pithy。期望读者可以通过本文对接口自动化测试有一个大致的了解。二、引言为什么要做接口自动化测试在当前互联网产品迭代频繁的背景下回归测试的时间越来越少很难在每个迭代都对所有功能做完整回归。但接口自动化测试因其实现简单、维护成本低容易提高覆盖率等特点越来越受重视。为什么要自己写框架呢使用 requets unittest 很容易实现接口自动化测试而且 requests 的api已经非常人性化非常简单。但通过封装以后特别是针对公司内特定接口再加上对一些常用工具的封装可以进一步提高业务脚本编写效率。三、环境准备确保本机已安装 python2.7 以上版本然后安装如下库pip install flaskpip install requests后面我们会使用 flask 写一个用来测试的接口使用requests去测试。四、测试接口准备下面使用 flask 实现两个 http 接口一个登录另外一个查询详情但需要登录后才可以新建一个 demo.py 文件注意不要使用windows记事本把下面代码 copy 进去然后保存、关闭。接口代码#!/usr/bin/python# codingutf-8from flask import Flask, request, session, jsonify USERNAME adminPASSWORD 123456app Flask(__name__) app.secret_key pithyapp.route(/login, methods[GET, POST])def login(): error None if request.method POST: if request.form[username] ! USERNAME: error Invalid username elif request.form[password] ! PASSWORD: error Invalid password else: session[logged_in] True return jsonify({code: 200, msg: success}) return jsonify({code: 401, msg: error}), 401app.route(/info, methods[get])def info(): if not session.get(logged_in): return jsonify({code: 401, msg: please login !!}) return jsonify({code: 200, msg: success, data: info})if __name__ __main__: app.run(debugTrue)最后执行如下命令python demo.py复制代码响应如下* Running on http://127.0.0.1:5000/ (Press CTRLC to quit)* Restarting with stat大家可以看到服务已经起来了。接口信息登录接口请求url/login请求方法post请求参数| 参数名称 | 参数类型 | 参数说明 || :————: | :——-: | :——: || username | String | 登录名称 || password | String | 登录密码 |响应信息| 参数名称 | 参数类型 | 参数说明 || :————: | :——-: | :——: || code | Integer | 结果code || msg | String | 结果信息 |详情接口请求url/info请求方法get请求 cookies| 参数名称 | 参数类型 | 参数说明 || :————: | :——-: | :——: || session | String | session |响应信息| 参数名称 | 参数类型 | 参数说明 || :————: | :——-: | :——: || code | Integer | 结果code || msg | String | 结果信息 || data | String | 数据信息 |五、编写接口测试测试思路使用 requests [ http://docs.python-requests.org/zh_CN/latest/user/quickstart.html ] 库模拟发送 HTTP 请求。使用 python 标准库里 unittest 写测试 case。脚本实现#!/usr/bin/python# codingutf-8import requestsimport unittestclass TestLogin(unittest.TestCase): classmethod def setUpClass(cls): cls.login_url http://127.0.0.1:5000/login cls.info_url http://127.0.0.1:5000/info cls.username admin cls.password 123456 def test_login(self): 测试登录 data { username: self.username, password: self.password } response requests.post(self.login_url, datadata).json() assert response[code] 200 assert response[msg] success def test_info(self): 测试info接口 data { username: self.username, password: self.password } response_cookies requests.post(self.login_url, datadata).cookies session response_cookies.get(session) assert session info_cookies { session: session } response requests.get(self.info_url, cookiesinfo_cookies).json() assert response[code] 200 assert response[msg] success assert response[data] info六、优化封装接口调用写完这个测试登录脚本你或许会发现在整个项目的测试过程登录可能不止用到一次如果每次都这么写会不会太冗余了对确实太冗余了下面做一下简单的封装把登录接口的调用封装到一个方法里把调用参数暴漏出来示例脚本如下#!/usr/bin/python# codingutf-8import requestsimport unittesttry: from urlparse import urljoinexcept ImportError: from urllib.parse import urljoinclass DemoApi(object): def __init__(self, base_url): self.base_url base_url def login(self, username, password): 登录接口 :param username: 用户名 :param password: 密码 url urljoin(self.base_url, login) data { username: username, password: password } return requests.post(url, datadata).json() def get_cookies(self, username, password): 获取登录cookies url urljoin(self.base_url, login) data { username: username, password: password } return requests.post(url, datadata).cookies def info(self, cookies): 详情接口 url urljoin(self.base_url, info) return requests.get(url, cookiescookies).json()class TestLogin(unittest.TestCase): classmethod def setUpClass(cls): cls.base_url http://127.0.0.1:5000 cls.username admin cls.password 123456 cls.app DemoApi(cls.base_url) def test_login(self): 测试登录 response self.app.login(self.username, self.password) assert response[code] 200 assert response[msg] success def test_info(self): 测试获取详情信息 cookies self.app.get_cookies(self.username, self.password) response self.app.info(cookies) assert response[code] 200 assert response[msg] success assert response[data] infoOK在这一个版本中我们不但在把登录接口的调用封装成了一个实例方法实现了复用而且还把 hostself.base_url提取了出来。但问题又来了登录之后登录接口的 http 响应会把session以 cookie 的形式 set 到客户端之后的接口都会使用此 session 去请求。还有就是在接口调用过程中希望可以把日志打印出来以便调试或者出错时查看。好吧我们再来改一版。保持 cookies 增加 log 信息使用 requests 库里的同一个 Session 对象 (它也会在同一个 Session 实例发出的所有请求之间保持 cookie )即可解决上面的问题示例代码如下#!/usr/bin/python# codingutf-8import unittestfrom pprint import pprintfrom requests.sessions import Sessiontry: from urlparse import urljoinexcept ImportError: from urllib.parse import urljoinclass DemoApi(object): def __init__(self, base_url): self.base_url base_url # 创建session实例 self.session Session() def login(self, username, password): 登录接口 :param username: 用户名 :param password: 密码 url urljoin(self.base_url, login) data { username: username, password: password } response self.session.post(url, datadata).json() print(\n*****************************************) print(u\n1、请求url: \n%s % url) print(u\n2、请求头信息:) pprint(self.session.headers) print(u\n3、请求参数:) pprint(data) print(u\n4、响应:) pprint(response) return response def info(self): 详情接口 url urljoin(self.base_url, info) response self.session.get(url).json() print(\n*****************************************) print(u\n1、请求url: \n%s % url) print(u\n2、请求头信息:) pprint(self.session.headers) print(u\n3、请求cookies:) pprint(dict(self.session.cookies)) print(u\n4、响应:) pprint(response) return responseclass TestLogin(unittest.TestCase): classmethod def setUpClass(cls): cls.base_url http://127.0.0.1:5000 cls.username admin cls.password 123456 cls.app DemoApi(cls.base_url) def test_login(self): 测试登录 response self.app.login(self.username, self.password) assert response[code] 200 assert response[msg] success def test_info(self): 测试获取详情信息 self.app.login(self.username, self.password) response self.app.info() assert response[code] 200 assert response[msg] success assert response[data] info大功告成我们把多个相关接口调用封装到一个类中使用同一个 requests Session 实例来保持 cookies并且在调用过程中打印出了日志我们所有目标都实现了。但再看下脚本又会感觉不太舒服在每个方法里都要写一遍print 1、2、3… 要拼url、还要很多细节等等。但其实我们真正需要做的只是拼出关键的参数url 参数、body 参数或者传入 headers 信息可不可以只需定义必须的信息然后把其它共性的东西都封装起来呢统一放到一个地方去管理封装重复操作来我们再整理一下我们的需求:首先不想去重复做拼接 url 的操作。然后不想每次都去手工打印日志。不想和 requests session 打交道。只想定义好参数就直接调用。我们先看一下实现后脚本可能是什么样:class DemoApi(object): def __init__(self, base_url): self.base_url base_url request(urllogin, methodpost) def login(self, username, password): 登录接口 data { username: username, password: password } return {data: data} request(urlinfo, methodget) def info(self): 详情接口 pass调用登录接口的日志****************************************************** 1、接口描述 登录接口 2、请求url http://127.0.0.1:5000/login 3、请求方法 post 4、请求headers { Accept: */*, Accept-Encoding: gzip, deflate, Connection: keep-alive, User-Agent: python-requests/2.7.0 CPython/2.7.10 Darwin/16.4.0 } 5、body参数 { password: 123456, username: admin } 6、响应结果 { code: 200, msg: success }在这里我们使用 python 的装饰器功能把公共特性封装到装饰器中去实现。现在感觉好多了没什么多余的东西了我们可以专注于关键参数的构造剩下的就是如何去实现这个装饰器了我们先理一下思路获取装饰器参数获取函数/方法参数把装饰器和函数定义的参数合并拼接 url处理 requests session有则使用无则新生成一个组装所有参数发送http请求并打印日志因篇幅限制源码不再列出有兴趣的同学可以查看已经实现的源代码。源代码查看地址https://github.com/yuyu1987/pithy-test/blob/master/pithy/api.py七、扩展http 接口请求的姿势我们定义好了我们还可以做些什么呢[x] 非HTTP协议接口[x] 测试用例编写[x] 配置文件管理[x] 测试数据管理[x] 工具类编写[x] 测试报告生成[x] 持续集成[x] 等等等等需要做的还是挺多的要做什么不要做什么或者先做哪个我觉得可以根据以下几点去判断是否有利于提高团队生产效率是否有利于提高测试质量有没有现成的轮子可以用下面就几项主要的点进行一下说明限于篇幅不再展开了。测试报告这个应该是大家最关心的了毕竟这是测试工作的产出目前 python 的主流单元测试框均有 report 插件因此不建议自己再编写除非有特殊需求的。pytest推荐使用 pytest-html 和 allure pytest。unittest推荐使用 HTMLTestRunner。持续集成持续集成推荐使用 Jenkins运行环境、定时任务、触发运行、邮件发送等一系列功能均可以在 Jenkins 上实现。测试用例编写推荐遵守如下规则原子性每个用例保持独立彼此不耦合以降低干扰。专一性一个用例应该专注于验证一件事情而不是做很多事情一个测试点不要重复验证。稳定性绝大多数用例应该是非常稳定的也就是说不会经常因为除环境以外的因素挂掉因为如果在一个测试项目中有很多不稳定的用例的话测试结果就不能很好的反应项目质量。分类清晰有相关性的用例应写到一个模块或一个测试类里这样做即方便维护又提高了报告的可读性。测试工具类这个可以根据项目情况去做力求简化一些类库的使用数据库访问、日期时间、序列化与反序列化等数据处理或者封装一些常用操作如随机生成订单号等等以提高脚本编写效率。测试数据管理常见的方式有写在代码里、写在配置文件里(xml、yaml、json、.py、excel等)、写在数据库里等该处没有什么好推荐的建议根据个人喜好怎么方便怎么来就可以。八、pithy测试框架介绍pithy意为简洁有力的意在简化自动化接口测试提高测试效率。项目地址https://github.com/yuyu1987/pithy-test帮助文档http://pithy-test.readthedocs.io/目前实现的功能如下一键生成测试项目http client封装thrift接口封装简化配置文件使用优化JSON、日期等工具使用编写测试用例推荐使用 pytesthttps://docs.pytest.org/pytest 提供了很多测试工具以及插件http://plugincompat.herokuapp.com/可以满足大部分测试需求。安装pip install pithy-testpip install pytest使用一键生成测试项目 pithy-cli init 请选择项目类型,输入api或者app: api 请输入项目名称,如pithy-api-test: pithy-api-test 开始创建pithy-api-test项目 开始渲染... 生成 api/.gitignore [√] 生成 api/apis/__init__.py [√] 生成 api/apis/pithy_api.py [√] 生成 api/cfg.yaml [√] 生成 api/db/__init__.py [√] 生成 api/db/pithy_db.py [√] 生成 api/README.MD [√] 生成 api/requirements.txt [√] 生成 api/test_suites/__init__.py [√] 生成 api/test_suites/test_login.py [√] 生成 api/utils/__init__.py [√] 生成成功,请使用编辑器打开该项目生成项目树 tree pithy-api-test pithy-api-test ├── README.MD ├── apis │ ├── __init__.py │ └── pithy_api.py ├── cfg.yaml ├── db │ ├── __init__.py │ └── pithy_db.py ├── requirements.txt ├── test_suites │ ├── __init__.py │ └── test_login.py └── utils └── __init__.py 4 directories, 10 files调用 HTTP 登录接口示例from pithy import requestrequest(urlhttp://httpbin.org/post, methodpost)def post(self, key1value1): post method data { key1: key1 } return dict(datadata)# 使用response post(test).to_json() # 解析json字符,输出为字典response post(test).json # 解析json字符,输出为字典response post(test).to_content() # 输出为字符串response post(test).content # 输出为字符串response post(test).get_cookie() # 输出cookie对象response post(test).cookie # 输出cookie对象# 结果取值, 假设此处response {a: 1, b: { c: [1, 2, 3, 4]}}response post(13111111111, 123abc).jsonprint response.b.c # 通过点号取值,结果为[1, 2, 3, 4]print response($.a) # 通过object path取值,结果为1for i in response($..c[3]): # 通过object path取值,结果为选中c字典里大于3的元素 print i优化 JSON、字典使用# 1、操作JSON的KEYfrom pithy import JSONProcessor dict_data {a: 1, b: {a: [1, 2, 3, 4]}} json_data json.dumps(dict_data) result JSONProcessor(json_data)print result.a # 结果1print result.b.a # 结果[1, 2, 3, 4]# 2、操作字典的KEYdict_data {a: 1, b: {a: [1, 2, 3, 4]}} result JSONProcessor(dict_data)print result.a # 1print result.b.a # [1, 2, 3, 4]# 3、object path取值raw_dict { key1:{ key2:{ key3: [1, 2, 3, 4, 5, 6, 7, 8] } } } jp JSONProcessor(raw_dict)for i in jp($..key3[3]): print i# 4、其它用法dict_1 {a: a} json_1 {b: b}jp JSONProcessor(dict_1, json_1, cc) print(jp)九、总结在本文中我们以提高脚本开发效率为前提一步一步打造了一个简易的测试框架。但因水平所限并未涉及测试数据初始化清理、测试中如何 MOCK 等话题前路依然任重而道远希望给大家一个启发不足之处还望多多指点非常感谢。最后作为一位过来人也是希望大家少走一些弯路在这里我给大家分享一些软件测试的学习资料和我花了3个月整理的软件测试自学全栈这些资料希望能给你前进的路上带来帮助。​视频文档获取方式这份文档和视频资料对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴我走过了最艰难的路程希望也能帮助到你以上均可以分享点下方小卡片即可自行领取。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

微信网站制作设计方案建筑工程有限责任公司

学长亲荐8个AI论文软件,专科生搞定毕业论文格式规范! 论文写作的救星,AI 工具如何帮你轻松应对格式难题 对于专科生来说,毕业论文不仅是学术能力的体现,更是对学习成果的一次全面总结。然而,面对繁复的格式…

张小明 2026/1/7 4:06:43 网站建设

备案个人可以做视频网站崇明建设镇乡镇府网站

第一章:Open-AutoGLM项目概述Open-AutoGLM 是一个开源的自动化通用语言模型(General Language Model, GLM)构建与优化框架,旨在降低大语言模型定制化开发的技术门槛。该项目结合了模型微调、提示工程、数据增强和自动评估等多项技…

张小明 2026/1/7 4:06:24 网站建设

长沙网站技术专家做网站做软件怎么赚钱吗

你根本不需要安装 dos2unix! Linux 系统自带了强大的文本处理工具(sed 和 tr),它们完全可以替代 dos2unix,而且不需要 root 权限,直接就能用 你根本不需要安装 dos2unix! Linux 系统自带了强大的文本处理工具(sed 和 tr),它们完全可以替代 dos2unix,而且不需要 ro…

张小明 2026/1/7 4:17:51 网站建设

大学生网站开发工作室总结网页设计素材怎么算侵权

JavaScript性能优化实战技术文章大纲性能优化的重要性用户体验与性能的关系业务指标受性能影响的具体案例现代Web应用对性能的高要求代码层面的优化减少全局变量使用,避免内存泄漏使用事件委托减少事件监听器数量避免在循环中进行DOM操作合理使用防抖和节流技术数据…

张小明 2026/1/7 4:20:52 网站建设

协会建设网站的必要性请公司做网站没有做好可以退钱吗

树莓派的多样玩法与技术探索 1. Alcyone MIDI 控制器 Alcyone MIDI 控制器是一款为站立吉他手设计的乐器,其网络服务机制是一个简单的循环。它会处理请求,通过内部的 switch/case 检查消息值的高半字节,并根据需要进行更改。无论请求的操作是什么,Alcyone 都会以纯文本…

张小明 2026/1/7 4:06:22 网站建设