接口自动化框架代码库分享说明

在本篇内容将汇总之前在从0到1搭建的接口自动化框架所涉及到的代码仓库以及响应开发过程中解决的知识点说明。

代码仓库整理与说明

名称

功能

Gitee地址

ele_ui

接口自动化web端项目;实现基于录制的项目新建;以及基于har文件单个case新建

https://gitee.com/sophia111111/ele_ui

browsermob-proxy

ele_ui中访问录制平台需要绕过cors 进行了二次适配

https://gitee.com/sophia111111/browsermob-proxy

ele_ui_test

接口自动化demo仓库,演示了各种代码:如api编写、日志配置、日志收集、日志解析等

https://gitee.com/sophia111111/ele_ui_test

elephant_apiFrame

接口自动化框架核心代码库,实现自定义装饰器,http实现等功能

https://gitee.com/sophia111111/elephant_api-frame 

elephant_frame_helper

编写的IDEA插件工具,主要作用,基于路径快速定位api和case yaml文件

https://gitee.com/sophia111111/elephant_frame_helper

jycm

用于批量展示pre和prod自动化结果的diff字段

https://gitee.com/sophia111111/jycm

上面的仓库,其中有一些是公开的;另外一些只有购买了本专栏的同学可以查看哦,购买之后可以牛客私信我gitee账号,我来给大家加到仓库内。后续内容重点说明了以上这些仓库的开发注意事项。

browsermob-proxy 工具使用说明

本小节主要总结browsermob-proxy这个代理工具的主要功能。browsermob-proxy是一个基于java开发的代理工具,有两种使用方式,一种是作为一个独立的应用使用;另外一种是内嵌在代码中进行使用。本文主要简单介绍一下作为独立应用如何使用browsermob-proxy

官网地址:https://github.com/lightbody/browsermob-proxy  

一般在代理的时候主要步骤包含以下几个步骤:

  1. sh browsermob-proxy -port 9000 启动代理应用
  2. 使用以下的请求来开启端口并设置代理规则,具体的也可参考官网中的说明:
curl --location --request POST 'http://127.0.0.1:9000/proxy开启端口
curl --location --request GET 'http://127.0.0.1:9000/proxy' 获取已开启的代理端口

curl --location --request PUT 'http://127.0.0.1:9000/proxy/8081/whitelist' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'regex=.*app.bilibili.com.*'
设置端口的白名单

curl --location --request PUT 'http://127.0.0.1:9000/proxy/8081/har' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'captureHeaders=true' \
--data-urlencode 'captureCookies=true' \
--data-urlencode 'captureContent=true'
设置抓取的内容并开启抓取

curl --location --request PUT 'http://127.0.0.1:9000/proxy/8081/har' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'captureHeaders=true' \
--data-urlencode 'captureCookies=true' \
--data-urlencode 'captureContent=true'
使用同样的请求即可终止上一次抓取内容,并开启新的代理

然后 开始操作app,配置相应的代理端口:触发接口访问。

这里有一个问题是配置抓取https文件的时候要在官网上下载https://github.com/lightbody/browsermob-proxy/blob/master/browsermob-core/src/main/resources/sslSupport/ca-certificate-rsa.cer 文件,然后再手机的【密码与安全】-》【系统安全】-》【凭据存储】-》【从存储设备安装证书】进行证书的导入。在android手机上安装可以把后缀改为.pem 也是可以安装的。

获取到的抓取日志如下所示:

可以看到我们所需要用到的自动化生成数据在抓包的内容都包含,因此整体的数据分析都是基于这样的数据结构解析进行的。

browsermob-proxy二次开发说明

在之前我们在接口自动化中,为了进行批量case生成,使用了browsermob-proxy这个工具进行了抓包,并解析这些请求来自动化的生成case。但是在生成web端的管理工具代码编写时 因为端口号和原始的网页端口号不同,就会存在CORS问题。一般解决CORS问题,需要进行两步操作:

  1. 在js中进行请求的时候 移除Access-Control-Allow-Origin header可以实现浏览器发出的请求中不包含option请求
  2. 需要修改browsermob-proxy的源代码,从而在服务中在respone的header中增加绕过CORS的header。
  3. 具体代码可参考:https://gitee.com/sophia111111/browsermob-proxy中的CorsFilter.java

在这个修改的过程中遇到的主要问题:

  1. 看不懂这个项目的代码结构,不知道如何打包
  2. 不知道应该在哪里修改代码

为了解决上面的问题首先看了项目的readme文件 才发现使用mvn -DskipTests命令即可实现打包,项目打包的产物在/Users/lujuan/IdeaProjects/browsermob-proxy/browsermob-dist/target 目录下。同时该目录下的browsermob-proxy-2.1.6-SNAPSHOT-bin.zip 的产物就是我们之前下载使用的内容。

为了弄清楚在哪里修改代码,灵机一动搜索了一下”/proxy“这个路径,因为这个是接口定义的路径,那么相应的我们就能找到接口实现的代码,从而进一步完成相应的修改。

因此我们可以看到具体的代码在browsermob-rest目录下。

那么这个时候我们可以看到该项目sever端用到的一些主要框架涉及到guice、Jetty这些关键词,查找代码我们发现,实现的关键应该是修改JettyServerProvider之类的代码,但是对于如何修改还一头雾水。因此用了很多不同的关键词在网络上进行搜索。后来发现browsermob-rest只是做了相应的类的di,具体的ioc代码是在:

因此相继在这两个文件中做了修改。最后发现要想修改还是需要尝试修改那么因此搜索了”how to add own filter in guice Filter“,最后看到了一个学习的源码 https://github.com/ninjaframework/ninja/blob/develop/ninja-servlet/src/main/java/ninja/servlet/NinjaServletFilter.java#L52  ,所以进行了尝试性的修改,最终得以解决了此CORS的问题。

关键就是实现以下替换:

详见以下commit:https://gitee.com/sophia111111/browsermob-proxy/commit/3fb98ee66dfc5c8c43a6efc6244ddab765b6530b

elephant_frame_helper IDEA插件开发说明

在我以往的使用经验中,这种基于配置话的书写方法在运维过程中麻烦的地方就在于case的配置文件的定位,因此为了提高书写case的便利性以及愉悦性,配套开发相应的IDEA插件用于快速定位case.yaml以及api.yaml 文件。

具体的使用使用演示如下:

https://gitee.com/sophia111111/elephant_frame_helper/blob/master/d1ccc7302752fc2eaca38444a795ab62.mov 

 

大家可以再idea中配置以下插件:

https://gitee.com/sophia111111/elephant_frame_helper/blob/master/elephant_frame_helper-2.0-SNAPSHOT.zip 

Idea插件配置配置

在Preference中选择Plugin从本地进行导入。

Idea插件开发步骤

在idea中新建工程并选择IntelliJ Platform Plugin:

 

然后需要修改plugin.xml文件来创建配置的功能项:

原始xml如下图所示:

我们在goto的菜单栏中增加goto按钮:(需要在plugin.xml文件中编写按钮位置)

会执行GotoTestDataAction这个class类,在图中的src的main目录下。下面的代码需要更具idea的规则来具体的编写,因为篇幅的问题,具体的代码实现可以在以下的gitee的链接中找到。

插件项目的编译开发方法:在下图中点击buildPlugin,生成的产物在build的distribution中。

使用下面的按钮可以直接debug相应的代码。

需要配置以下内容来使得打包会更加的容易:

elephant_apiFrame Python包开发说明

在python中打安装包需要的是在项目下面生成setup.cfg文件,然后执行相应的命令即可。

elephant_apiframe打包和安装方法:

打包:在根目录下执行 python3 -m build ,

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

进击的测试开发工程师2.0 文章被收录于专栏

本专栏专注于对复杂项目对测试用例编写思路、接口自动化测试用例以及自定义接口测试框架及工具对实现。

全部评论

相关推荐

#测开面经#非常听劝,之前牛友说我简历乱写,我改了,去投了海鼎的测开 笔试过了,面试的面经如下: 未来的leader挺和善的,感觉有点机会MentorQ:你认为软件测试开发岗是做什么的Q:你认为测试的重要性如何,谈谈对测试的理解Q:软件测试的目的Q:你平时有做测试方面的工作吗 A:简历上红轨,后面两个有Q:谈谈你在红轨项目中的测试是做了哪些方面 A:主要是评价和测试优化方法的可行性Q:说一说你知道的软件测试方法 Q:你的简历上有说你熟悉黑盒白盒灰盒测试,说说黑盒测试关注点在哪Q:灰盒测试与黑盒白盒测试的关系Q:给你一个接口,你怎么用黑盒测试来设计测试常用方法Q:你简历上有了解流水线自动化部署测试的内容,谈一谈你对流水线的理解Q:谈谈你对自动化测试的理解Q:你如何做到CI/CD?Q:给你一个产品/网页,考虑从哪方面着手做测试Q:如果你测试的结果出了问题(与预期不一致),反馈给开发团队,但团队不认为他们是错的,怎么办?Q:你知道我们公司做什么的吗? 我:物流 Mentor:不全是,物流系统只是一部分,还有零售 Q:谈谈你作为一个测试人员应该考虑侧重于对公司业务提供哪方面的技术支持测试?Q:对pytest的了解有多少? A:了解不多,只知道这是个测试框架Q:微信朋友圈用过吗?给你一个微信朋友圈,找出可能的问题测试点,设计测试文档Q:使用过Vue吗?知道Vue的测试侧重点在哪吗?反问:公司对于测试的重点需求是在java接口吗? Mentor:对的,同时也包含产品的一些测试,公司有自己的测试框架,使用比较方便
点赞 评论 收藏
转发
1 3 评论
分享
牛客网
牛客企业服务