接口测试可以实现接口自动化测试框架执行吗

查看: 4455|回复: 5
开展有效的自动化测试
该用户从未签到
根据自己经验总结的一些体会,欢迎大家一起讨论,多提宝贵意见^_^
很多时候测试人员在开展自动化测试的时候都是不加思考的就开始做,认为用工具录几
个脚本再回放就可以了,没有考虑有效性;而做了并不一定就会有效果,如果自
动化测试在整个测试工作中发挥不了作用,那么哪怕是只投入了很少的成本也是在浪费
资源。所以在开展自动化测试之前必须认真思考虑一些问题,以确保它的有效性:
1、被测系统是否适合做自动化测试;
2、被测系统适合在哪些环节做自动化测试;
3、使用何种测试工具、测试框架;
4、开展自动化测试需要哪些资源,包括:人员、机器、时间;
5、当前可用或是可以申请到的资源;
6、如何在不影响日常测试工作的前提下,开展自动化测试工作;
1、被测系统是否适合做自动化测试;
很多人可能都回觉得这个问题有些多余,不需要考虑。可事实上作为一名测试主管必须
考虑这个问题,应为自动化测试并非只是做与不做这么简单,而是需要考虑成本投入与
效果产出。不管是做软件、做系统、还是做网站,最终的目的基本上都是要盈利的,要
盈利就必须控制成本,提高利润。所以在测试工作中也必须考虑到成本投入。
如何确定系统是否适合做自动化测试呢?个人认为主要考虑当前的被测项目是长期的还
是短期?如果被测项目是在今后半年或者几年间要不断进行开发维护的,那么就需要重
复的进行大量的回归测试,这种情况下如果有自动化的回归测试体系就可以节省成本投
入;如果被测项目是短期的,比如说一个月,或几个月,同时如果开发自动化测试又不
是很容易,也没有足够的时间去做这件事,那么就完全没有必要作自动化测试,费尽力
气做出的自动化测试脚本,可能只会用到一次或两次,这样就很不值当。
2、被测系统适合怎样的自动化测试;
自动化测试覆盖的范围很广:单元测试、集成测试、接口测试,GUI测试等等都可以实现
自动化执行;同时,不同的系统情况是不一样,有的适合或是可以做GUI的自动化测试,
有的可能只适合做接口的自动化测试,所以需要针对不同的被测项目,考虑具体在哪一个
环节作自动化测试。比如说针对搜索引擎,前端往往比较简单,只是一个文本框和提交
按钮,大部分的逻辑处理都是在后端完成的,这种情况做自动化的接口测试就可以达到
事半功倍的效果;如果是被测系统有很多的页面操作,那么可以考虑GUI的自动化测试;
以上这两种情况都不是绝对的,如果测试资源足够,那么在各个环节都是可以开展自动
化测试的。此外,还有一点需要考虑的是自动化测试的可行性,比如说对一个系统而言
,做GUI测试是最合适的,也是最有效,但是有可能通过各种工具或者是脚本很难实现
GUI的自动化测试,那么就需要考虑变通,考虑是否可以将自动化测试调整到接口测试或
是集成测试等环节。
3、使用何种测试工具、测试框架;
当前可以做自动化测试的工具不少,主流的付费的qtp,winrunner,silktest等,开源
免费的Jemmy,watir,pywinauto等等。这么多的工具框架该如何选择,就要看被测系统了
,至少要考虑是C/S、还是B/S结构的,服务端和客户端都是用何种语言编写的,是什么
数据库,服务器类型等等。
4、开展自动化测试需要哪些资源,包括:人员、机器、时间;
确定了使用何种测试工具、测试框架,就需要确定需要的资源,如:需要几个自动化测
试工程师、需要购买的测试工具、测试机(服务器、客户机)、以及开发自动化框架所
需要的时间;
5、当前可用或是可以申请到的资源;
确定了需要哪些资源,就要看当前可用的资源有哪些,如果资源不足应提前申请,如招
聘测试人员、购买配置测试机。甚至需要测试人员提前学习新的技术;
6、如何在不影响日常测试工作的前提下,开展自动化测试工作;
在以上问题考虑清楚以后,就需要制定自动化测试的计划进度了,这时候必须考虑到自动
化测试的开展不能影响到日常的测试项目,毕竟不能因为开展自动化就把日常测试耽搁
,该做的还是要做的,这点恐怕是必须要考虑的,整个公司或者整个项目往往不能为你
特意分配一段时间做这样让某些人不能一下子看到和利润有何相关的事,所以必须安排
好计划进度,更多的需要整个测试部门挤时间去做。
未完待续^_^
[ 本帖最后由 wzstar2008 于
10:08 编辑 ]
该用户从未签到
8错,顶一下
该用户从未签到
使用何种测试工具、测试框架?
你这一块说都不是很详细,能否说都更详细些,把现有都测试工具适合测试那些系统,把优缺点都分析都更详细些我觉都会更好一些。。。因为很多人没有用过那么多工具,不知道测试什么被测系统需要什么样的测试工具,因为就学习一样(比如QTP),就只会用这一样去测试。。。不知道其他测试工具都好处。。。麻烦楼主了。。。谢谢
[ 本帖最后由 language_fw 于
12:36 编辑 ]
该用户从未签到
最近在学自动化测试工具,不知道最适合做GUI测试的是什么测试工具?
该用户从未签到
该用户从未签到
虽然是老贴了,还是支持一个
站长推荐 /4
小伙伴们踊跃闯关,赢取测试积点,换取豪礼,还等什么,赶快行动吧~
了解自己的心里圈,学习不同的内容,让自己由内而外强大起来!
【活动时间】:每个工作日的周一至周五(AM:10:00~PM:5:00)
人人称道的大数据,云计算,虚拟化是什么?该怎么学?——《Docker入门与应用实战》
4.16开启直播授课,好评率100%的大咖手把手教你Docker容器的搭建与应用,利用虚拟化解决测试环境问题!
Powered by基于Testng的Web接口测试的自动化框架设计与实现--《浙江工业大学》2016年硕士论文
基于Testng的Web接口测试的自动化框架设计与实现
【摘要】:随着软件开发过程的发展,Web软件产品各系统的架构日益复杂,系统不断向着分布式、业务中心化和高可用性的方向发展。在分层的软件体系中,由于各接口模块是相互独立开发的,所提供的接口功能正确与否以及是否符合预期通常在系统集成的时候才能明确。同时,由于系统的不断复杂,通过传统的界面测试保证整个Web功能的做法不再有效或成本巨大。而且,目前业界没有形成统一的接口测试的自动化框架标准,只有一些比较大型的公司会根据自身业务需求进行测试的自动化框架设计与实现。本文的研究目的在于设计并实现一种基于Testng的Web接口测试的自动化框架,从程序模块层面来验证所提供接口的正确性,并用自动化测试取代大部分的手工测试,而且该框架可以适用于目前市面上的大部分基于Http请求的Web软件应用产品。主要的研究工作如下:1.从接口测试基本理论出发,分析了接口测试相关技术和方法。针对接口测试的特点及现有的自动化测试框架进行分析和比较,结合目前Java项目的特点和系统架构,分析了测试工具Testng与Junit的区别。针对Testng工具的特点,提出了采用Testng工具搭建自动化测试框架。2.设计与实现了数据存储与封装模块。传统的数据存储方法没有将测试代码与测试数据分离,存在代码量巨大等弊端,设计了Excel和Dat两种外部文件存放数据的方法,实现了代码与数据分离,减少代码冗余。并采用Mybatis框架连接数据库读取测试数据,实现了对数据库的操作。3.设计与实现了Web接口请求与应用交互模块。针对Http请求原理和特点,设计了采用HttpClient工具发送接口请求,同时在构造接口请求的过程中对数据进行加密生成相应的Uri。本文设计的框架可以发送基于B/S架构的Web应用的Http接口请求,并返回相应的结果,实现了接口访问的功能。4.设计与实现了接口测试用例执行模块。针对Java语言的特点,规定接口测试用例编写规范和执行规范,同时根据业务需求,采用Testng进行调用和组织测试用例,实现了接口测试框架的用例执行部分,为后续的持续集成奠定了基础。5.编写符合业务需求的测试用例对框架进行测试,通过Jenkins平台持续集成,根据运行的结果测试该框架的功能和性能。通过分析可得,本文设计的接口测试自动化框架能够有效实现接口测试,同时具有执行用例时间短,准确率高等性能特点。
【学位授予单位】:浙江工业大学【学位级别】:硕士【学位授予年份】:2016【分类号】:TP311.53
欢迎:、、)
支持CAJ、PDF文件格式
【相似文献】
中国期刊全文数据库
李越;;[J];计算机技术与发展;2011年06期
李财云;陈颖慧;;[J];电脑知识与技术;2011年07期
刘洋;;[J];电子设计技术;2010年12期
王智立,孟洛明;[J];计算机应用;2004年02期
潘娟;[J];电信网技术;2005年07期
王国师;李强;刘柳;朱向阳;;[J];空军雷达学院学报;2008年02期
兰艳桃;吕杨;王伟;;[J];电脑知识与技术;2009年34期
刘春裕;;[J];计算机技术与发展;2014年01期
李力;[J];电脑学习;1996年04期
;[J];电信工程技术与标准化;2001年05期
中国重要会议论文全文数据库
张川;王君珂;王柏;;[A];第六届全国计算机应用联合学术会议论文集[C];2002年
王智立;叶萱;孟洛明;;[A];2003年通信软件技术学术年会论文集[C];2003年
中国重要报纸全文数据库
本报实习记者 齐兴一;[N];通信产业报;2006年
东方智慧证券研究所 周杰;[N];证券时报;2006年
中国硕士学位论文全文数据库
潘焕岩;[D];内蒙古大学;2015年
庄元;[D];华北电力大学;2015年
李波;[D];电子科技大学;2014年
江屿;[D];东南大学;2015年
付雪梅;[D];西南交通大学;2016年
周健;[D];西安电子科技大学;2015年
蒋灵仙;[D];浙江工业大学;2016年
张先雄;[D];北京邮电大学;2011年
刘文勇;[D];北京邮电大学;2011年
韦静涵;[D];电子科技大学;2013年
&快捷付款方式
&订购知网充值卡
400-819-9993WEB、接口、APP自动化测试的一些看法
我的图书馆
WEB、接口、APP自动化测试的一些看法
标签:&&&&&&&&&&&&&&&& 当故事看即可,只是个人看法...............& 目前在各个软件公司中基本上存在WEB和APP的对外系统,不管是电子商务、电信、新闻等基本上都有WEB和APP同时存在。对于APP个人感觉是新东西,但也觉得它就是个老东西,因为大家是否记得我们曾经装在电脑上的Application应用程序,当然一个管理软件当时就很NB了。不过现在手机上的Application和以前电脑上的Application当然不管技术上还是形态上都是不一样的,但使用上似乎是一样的,同样的下载---安装---使用。这些都是体外话题,我想说的是软件测试,当年的软件危机大爆发导致了软件测试这个职业的出现,测试中的懒人出现导致自动化测试的产生,而Application应用程序是最初的尝试产品吧。那个时候的自动化测试就是很NB的自动化测试,但现在呢,应该叫Application应用程序的UI自动化测试、接下来互联网的出现,应该出现了WEB的UI自动化测试、再接下来API技术的来临,应该出现了接口的自动化测试、这几年又出现了手机版本Application出现,然后就是APP自动化测试的出现(其实APP自动化测试按技术类型分也包含了UI(UI应该主要包含了NATIVE和WEBVIEW,还有加载中间的hybrid,我还是看好WEBVIEW的未来,哈哈。。。。)和接口。说了这么多只想说明我知道的挺多.....接下来我想说说WEB的UI自动化测试、接口自动化测试和APP的自动化测试。& WEB的UI自动化测试:&&&&很多人在说自动化测试的时候,基本上现在指的是WEB的UI自动化测试,但其实这是不对的,自动化测试包含了很多开发的技术,不只是界面上的自动化测试。WEB的UI自动化测试只是其中的一种,但它的工具确实最多的,我所知道的有WINRUNNER\QTP(UFT)\TESTCOMPLETE\SILKTEST\ROBOT\SELENIUM\RF\WAITER等等,当然最出名的是商业工具QTP和开源工具SELENIUM。现在各个公司通过开源搭建的自动化框架基本上都是以SELENIUM为底层,个人感觉SELENIUM还是非常的好的工具。而对于没有开发基础的测试人员,可以考虑QTP这个自动化工具,掌握比较快,但要学精还是需要掌握开发技术。但当你掌握了开发技术后就会放弃QTP想玩SELENIUM了。原因是QTP越做越烂了,虽然最新版本的UFT增加了API的测试,当我觉得这个更加是鸡肋,QTP这个产品在WINDOWS环境下做还可以,但是你想扩展到其他环境就麻烦了,如自动启停进程相关的操作....。工具介绍就到这吧,总体来说根据自己的需求来选择符合自己公司的工具和开发语言。接下来我说下WEB的UI自动化测试的优缺点:&&&&缺点:&&&&开发效率低、维护成本高、执行速度慢.......................几百种缺点。&&&&优点:&&&&用户操作真实性强。&接口自动化测试:&&&&接口自动化测试在后来出现,但现在大部分的互联网公司都喜欢用它作为测试工作辅助。原因很简单,UI自动化的缺点它都能进行弥补,但同时它也存在一个最大的问题:用户操作真实性不强。其实个人觉得接口自动化测试和UI自动化测试可以产生互补的测试。因为我们做接口测试时更多的是根据开发的技术进行测试HTTP\SOCKET等等(接口测试基本上不需要用到什么工具进行,如果一定需要的话建议是用SOAPUI),而非真实的进行对系统进行操作验证系统是否存在问题。&APP的自动化测试:& APP的自动化测试应该也要分为UI和接口自动化测试,接口测试与上面说的一样都是技术层面上的事情就不说了。那么还是关注APP的UI自动化测试,APP的自动化测试工具方面也有很多,但也都不成熟,我选择了APPIUM,主要考虑到的它可以进行跨平台测试,但最大的问题还是不稳定。所以也不敢大面积的布置其自动化测试用例。APP刚才说过了主要分为NATIVE和WEBVIEW,NATIVE的对象还好获取,像android可以直接使用uiautomatorviewer进行获取。而WEBVIEW就比较麻烦,不能直接获取要么就让开发提供给你,要么就直接下代码自己找,还有就是通过google的一个方法进行获取.......& 说了一下这三种技术的一些内容,其实我想说不管什么类型的自动化测试,我们测试的过程中都需要和开发进行紧密的结合,但测试优于开发的测试思想。另外这三种技术我们在实际的应用中更应该将其进行混合的测试:&&&&1、UI(WEB)自动化测试走主流程的测试、接口自动化测试走全面的测试:先布置接口的自动化测试用于测试和回归测试,特别在敏捷测试中,接口自动化测试应该占主体。后布置UI自动化测试用于住流程的回归测试。&&&&2、UI(WEB)自动化测试与APP自动化测试结合:需要一个自动化测试框架的协调,可以进行UI自动化测试到APP接口层的长流程场景自动化测试,也可以进行UI自动化测试到APPUI层的长流程场景自动化测试。&&&&3、接口自动化测试与APP自动化测试结合:其实和UI与APP自动化测试长流程的交换一样的原理,需要自动化测试框架的支撑。先进行接口测试用例的执行后进行APP的UI和接口测试的用例执行。& & 以上是我想说的这么个故事....看看就好....本文出自 “” 博客,请务必保留此出处标签:&&&&&&&&&&&&& &
馆藏&11296
TA的最新馆藏
喜欢该文的人也喜欢接口自动化测试方案详解 - 为程序员服务
接口自动化测试方案详解
去年,我们进行了项目的拆分,拆分后的各个子系统也都逐步的改成了通过接口进行数据的交换,接口测试也被提上日程。经过一段时间的探索,接口自动化测试方案越来越完善,今天给大家做个详细的讲解。
目前我们的接口都是使用的http协议,其测试的基本原理是模拟前端(客户端)向服务器发送数据,得到相应的响应数据,从而判断接口是否可以正常的进行数据交换。在测试的过程中尝试过两种方式,一种是利用性能测试工具Jmeter模拟客户端发起http请求,另外一种是使用python脚本直接编写脚本模拟客户端发起http请求。
利用Jmeter工具配置,需要对如何利用Jmeter进行性能测试熟悉,通过相应的配置可完成,但不够灵活,比如某些字段需要经过特定的加密处理,不能通过Jmeter直接完成。
所以选择直接用python脚本进行,模拟http请求也就几行代码就可完成。但只是模拟请求不是最终的目标,也需要易用,不会编码的人也会维护我们的测试用例,所以形成了现在的形态,遵循了测试框架的一些基本原则,业务逻辑与测试脚本分离,测试脚本与测试数据分离。大致框架如下图所示:
目录结构如下:
所有的测试用例使用Excel统一管理,测试数据根据需要可以选择配置在Excel中或者保存在测试数据文件中。测试用例格式如下:
日志格式如下:
测试完成后可将异常的接口通过邮件发送给相关人。以上是接口测试方案的大致介绍,下面给大家说说具体怎么配置用例。
如何进行测试
测试的核心脚本已经搭建好,后续不会有太大的改动,维护测试用例的Excel表格即可完成后续接口的测试,不管是新接口的测试还是老接口的回归,那如何编写一个接口的测试用例呢?
打开测试用例的Excel表格,填写用例编号、接口描述信息,被测接口的域名和请求地址。
选择接口请求的方式,目前有两种,一种是POST,一种是GET,根据实际情况选择。
选择接口接收数据的方式,目前有三种,Form类型,请求的数据会进行urlencode编码,一般都是这种类型,官网的接口主要是这种;Data类型,以文本的形式直接请求接口,不经过urlencode编码,引擎的接口大部分是这种,选择Data类型时,请求的数据有两种,一种是直接在Excel中配置json字符串,一种是填写文本文件路径,文件中也是json字符串,主要在于post的数据很大时,比如保存案例,在Excel中不好管理。File类型表示上传文件,在测试上传时选择File类型。
配置需要向接口发送的数据,如下图所示,需要根据上一步中选择的类型配置正确的测试数据,除了填写的是文件路径外,数据必须是标准的json格式字符串。
测试数据中,可以带参数,格式为${parameter},此处的参数必须在后面的关联(Correlation)字段中有赋值,在后面的关联字段配置给大家详细介绍。其中内置了四个参数,分别是:${randomEmail}(随机邮箱地址)、${randomTel}(随机手机号码)、${timestamp}(当前时间戳)、${session}(session id,默认为None)以及${hashPassword}(hash加密密码,明文123456)。
配置数据是否需要编码加密,目前有三种,不加密,MD5加密和DES加密。这是根据我们自身项目的特点加的选项,引擎有几个接口需要进行MD5加密,场景秀的接口都经过了DES加密。
配置检查点,检查点的目的是校验接口返回的数据是否是我们期望的。
配置关联,在接口的测试过程中,两个接口常常会有相关性,比如引擎新建案例需要先登录官网,那么,就需要做前后接口数据的关联。前面步骤已经提到过,在配置测试数据的时候可以配置参数,那么,关联的配置就是为了给这些参数赋值的,格式如下:${parameter}=[level1][level2][level3],多个参数中间用半角的分号(;)隔开,如下图所示。关联参数有两部分组成,等号前面是参数名称,需要跟测试数据中配置的参数名称保持一致,等号后面的部分是获取当前接口返回值的,因为接口返回值都是json格式的字符串,所以[level1]表示第一层级的指定key的值,[level1][level2]表示获取第一层级指定key的值中的指定key的值,有点绕,我们举例说明,大家就明白了。
登录接口的返回值是:
{"data":"http:\/\/my.test.liveapp.com.cn\/admin\/myapp\/applist","success":true,"message":"6tdehonrs6mg9metjqprfind16"}
后续的操作都需要是登录状态,所以需要得到session id,那么参数就可以这么写:${session}=[message],得到的值就是6tdehonrs6mg9metjqprfind16。
保存案例接口的返回值是:
{"ecode":0,"msg":"SUCCESS","data":[{"$id":"55d43d077f8b9ad56b8b4576","page_id":115323,"page_order":0},……
后续的操作需要mongo id和page id,那么参数可以这样写:${mongo_id}=[data][0][$id];${page_id}=[data][0][page_id],就可以分别得到55d43d077f8b9ad56b8b。这里大家发现会出现数字,是因为”data”的值是一个列表,而不是字典,没有相应的key,所以可以用数字代替,从0开始计算。
最后一步,配置用例是否执行,只有Yes和No两种选项,这个很好理解,就不多解释了。
以上就是配置一条用例的过程,配置完成后,保存Excel文件,提交到SVN即可,Jenkins接口测试的项目已经配置好,在每次引擎项目构建之后都会自动构建接口测试项目。
如果大家还有什么疑问,可以找我一起探讨。
附代码如下(Github:https://github.com/TronGeek/InterfaceTest):
#!/usr/bin/env python
#coding=utf=8
# Todo:接口自动化测试
# Author:归根落叶
# Blog:http://this.ispenn.com
import json
import http.client,mimetypes
from urllib.parse import urlencode
import random
import time
import logging
import os,sys
import xlrd
os.system('pip install -U xlrd')
import xlrd
from pyDes import *
except ImportError as e:
os.system('pip install -U pyDes --allow-external pyDes --allow-unverified pyDes')
from pyDes import *
import hashlib
import base64
import smtplib
from email.mime.text import MIMEText
log_file = os.path.join(os.getcwd(),'log/liveappapi.log')
log_format = '[%(asctime)s] [%(levelname)s] %(message)s'
logging.basicConfig(format=log_format,filename=log_file,filemode='w',level=logging.DEBUG)
console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
formatter = logging.Formatter(log_format)
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
#获取并执行测试用例
def runTest(testCaseFile):
testCaseFile = os.path.join(os.getcwd(),testCaseFile)
if not os.path.exists(testCaseFile):
logging.error('测试用例文件不存在!!!')
sys.exit()
testCase = xlrd.open_workbook(testCaseFile)
table = testCase.sheet_by_index(0)
errorCase = []
correlationDict = {}
correlationDict['${hashPassword}'] = hash1Encode('123456')
correlationDict['${session}'] = None
for i in range(1,table.nrows):
correlationDict['${randomEmail}'] = ''.join(random.sample('abcdefghijklmnopqrstuvwxyz',6)) + '@automation.test'
correlationDict['${randomTel}'] = '186' + str(random.randint(99999))
correlationDict['${timestamp}'] = int(time.time())
if table.cell(i,10).value.replace('\n','').replace('\r','') != 'Yes':
num = str(int(table.cell(i,0).value)).replace('\n','').replace('\r','')
api_purpose = table.cell(i,1).value.replace('\n','').replace('\r','')
api_host = table.cell(i,2).value.replace('\n','').replace('\r','')
request_url = table.cell(i,3).value.replace('\n','').replace('\r','')
request_method = table.cell(i,4).value.replace('\n','').replace('\r','')
request_data_type = table.cell(i,5).value.replace('\n','').replace('\r','')
request_data = table.cell(i,6).value.replace('\n','').replace('\r','')
encryption = table.cell(i,7).value.replace('\n','').replace('\r','')
check_point = table.cell(i,8).value
correlation = table.cell(i,9).value.replace('\n','').replace('\r','').split(';')
for key in correlationDict:
if request_url.find(key) & 0:
request_url = request_url.replace(key,str(correlationDict[key]))
if request_data_type == 'Form':
dataFile = request_data
if os.path.exists(dataFile):
fopen = open(dataFile,encoding='utf-8')
request_data = fopen.readline()
fopen.close()
for keyword in correlationDict:
if request_data.find(keyword) & 0:
request_data = request_data.replace(keyword,str(correlationDict[keyword]))
if encryption == 'MD5':
request_data = json.loads(request_data)
status,md5 = getMD5(api_host,urlencode(request_data).replace("%27","%22"))
if status != 200:
logging.error(num + ' ' + api_purpose + "[ " + str(status) + " ], 获取md5验证码失败!!!")
request_data = dict(request_data,**{"sign":md5.decode("utf-8")})
request_data = urlencode(request_data).replace("%27","%22")
elif encryption == 'DES':
request_data = json.loads(request_data)
request_data = urlencode({'param':encodePostStr(request_data)})
request_data = urlencode(json.loads(request_data))
except Exception as e:
logging.error(num + ' ' + api_purpose + ' 请求的数据有误,请检查[Request Data]字段是否是标准的json格式字符串!')
elif request_data_type == 'Data':
dataFile = request_data
if os.path.exists(dataFile):
fopen = open(dataFile,encoding='utf-8')
request_data = fopen.readline()
fopen.close()
for keyword in correlationDict:
if request_data.find(keyword) & 0:
request_data = request_data.replace(keyword,str(correlationDict[keyword]))
request_data = request_data.encode('utf-8')
elif request_data_type == 'File':
dataFile = request_data
if not os.path.exists(dataFile):
logging.error(num + ' ' + api_purpose + ' 文件路径配置无效,请检查[Request Data]字段配置的文件路径是否存在!!!')
fopen = open(dataFile,'rb')
data = fopen.read()
fopen.close()
request_data = '''
------WebKitFormBoundaryDf9uRfwb8uzv1eNe
Content-Disposition:form-name="file";filename="%s"
Content-Type:
Content-Transfer-Encoding:binary
------WebKitFormBoundaryDf9uRfwb8uzv1eNe--
''' % (os.path.basename(dataFile),data)
status,resp = interfaceTest(num,api_purpose,api_host,request_url,request_data,check_point,request_method,request_data_type,correlationDict['${session}'])
if status != 200:
errorCase.append((num + ' ' + api_purpose,str(status),'http://'+api_host+request_url,resp))
for j in range(len(correlation)):
param = correlation[j].split('=')
if len(param) == 2:
if param[1] == '' or not re.search(r'^\[',param[1]) or not re.search(r'\]$',param[1]):
logging.error(num + ' ' + api_purpose + ' 关联参数设置有误,请检查[Correlation]字段参数格式是否正确!!!')
value = resp
for key in param[1][1:-1].split(']['):
temp = value[int(key)]
temp = value[key]
value = temp
correlationDict[param[0]] = value
return errorCase
# 接口测试
def interfaceTest(num,api_purpose,api_host,request_url,request_data,check_point,request_method,request_data_type,session):
headers = {'Content-Type':'application/x-www-form- charset=UTF-8',
'X-Requested-With':'XMLHttpRequest',
'Connection':'keep-alive',
'Referer':'http://' + api_host,
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0. Safari/537.36'}
if session is not None:
headers['Cookie'] = 'session=' + session
if request_data_type == 'File':
headers['Content-Type'] = 'multipart/form-boundary=----WebKitFormBoundaryDf9uRfwb8uzv1eNe;charset=UTF-8'
elif request_data_type == 'Data':
headers['Content-Type'] = 'text/ charset=UTF-8'
conn = http.client.HTTPConnection(api_host)
if request_method == 'POST':
conn.request('POST',request_url,request_data,headers=headers)
elif request_method == 'GET':
conn.request('GET',request_url+'?'+request_data,headers=headers)
logging.error(num + ' ' + api_purpose + ' HTTP请求方法错误,请确认[Request Method]字段是否正确!!!')
return 400,request_method
response = conn.getresponse()
status = response.status
resp = response.read()
if status == 200:
resp = resp.decode('utf-8')
if re.search(check_point,str(resp)):
logging.info(num + ' ' + api_purpose + ' 成功, ' + str(status) + ', ' + str(resp))
return status,json.loads(resp)
logging.error(num + ' ' + api_purpose + ' 失败!!!, [ ' + str(status) + ' ], ' + str(resp))
return 2001,resp
logging.error(num + ' ' + api_purpose + ' 失败!!!, [ ' + str(status) + ' ], ' + str(resp))
return status,resp.decode('utf-8')
#获取md5验证码
def getMD5(url,postData):
headers = {'Content-Type':'application/x-www-form- charset=UTF-8',
'X-Requested-With':'XMLHttpRequest'}
conn = http.client.HTTPConnection('this.ismyhost.com')
conn.request('POST','/get_isignature',postData,headers=headers)
response = conn.getresponse()
return response.status,response.read()
# hash1加密
def hash1Encode(codeStr):
hashobj = hashlib.sha1()
hashobj.update(codeStr.encode('utf-8'))
return hashobj.hexdigest()
def desEncode(desStr):
k = des('secretKEY', padmode=PAD_PKCS5)
encodeStr = base64.b64encode(k.encrypt(json.dumps(desStr)))
return encodeStr
# 字典排序
def encodePostStr(postData):
keyDict = {'key':'secretKEY'}
mergeDict = dict(postData, **keyDict)
mergeDict = sorted(mergeDict.items())
postStr = ''
for i in mergeDict:
postStr = postStr + i[0] + '=' + i[1] + '&'
postStr = postStr[:-1]
hashobj = hashlib.sha1()
hashobj.update(postStr.encode('utf-8'))
token = hashobj.hexdigest()
postData['token'] = token
return desEncode(postData)
#发送通知邮件
def sendMail(text):
sender = 'no-'
receiver = ['']
mailToCc = ['']
subject = '[AutomantionTest]接口自动化测试报告通知'
smtpserver = 'smtp.exmail.qq.com'
username = 'no-'
password = 'password'
msg = MIMEText(text,'html','utf-8')
msg['Subject'] = subject
msg['From'] = sender
msg['To'] = ';'.join(receiver)
msg['Cc'] = ';'.join(mailToCc)
smtp = smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(username, password)
smtp.sendmail(sender, receiver + mailToCc, msg.as_string())
smtp.quit()
def main():
errorTest = runTest('TestCase/TestCasePre.xlsx')
if len(errorTest) & 0:
html = '&html&&body&接口自动化定期扫描,共有 ' + str(len(errorTest)) + ' 个异常接口,列表如下:' + '&table&&tr&&th style="width:100"&接口&/th&&th style="width:50"&状态&/th&&th style="width:200"&接口地址&/th&&th&接口返回值&/th&&/tr&'
for test in errorTest:
html = html + '&tr&&td&' + test[0] + '&/td&&td&' + test[1] + '&/td&&td&' + test[2] + '&/td&&td&' + test[3] + '&/td&&/tr&'
html = html + '&/table&&/body&&/html&'
#sendMail(html)
if __name__ == '__main__':
生命不止 o 极客以折腾不息
原文地址:, 感谢原作者分享。
您可能感兴趣的代码

我要回帖

更多关于 python实现接口自动化 的文章

 

随机推荐