开山篇--Java接口自动化测试选型与基础搭建

最近我司事业部的业务中台开发完毕,由于中台业务的特殊性,并没有对应的页面操作等,所以我们需要做
一个线上的可自动化部署的接口自动化测试平台,但是搜遍了全网的博客资料等,发现居然没有完整的自动
化的系列文章,找到的几十篇博客更是把如今的博客生态圈的抄袭展现的淋漓尽致,很多文章的内容是完全
一样的,而且最让人气愤的是,很多搭建的细节都没有描述,或者描述的并不是正确的,居然没有人进行验
证后在发,后来基于认识的某大厂的资深工程师给的经验和方案,慢慢摸索,踩了无数坑终于完成了我司的
接口自动化测试平台,现整理成系列给后来人使用

自动化测试的目标

首先,我们搭建之前必须要做的两件事:分析自动化测试平台需要完成的目标或者能实现的功能,以及基于我司业务的自动化测试的技术选型和工具选型,我们先来看第一点,自动化测试平台要完成的目标,决定这一点更重要的是根据我们需要测试的工程和项目是什么类别,业务方向,如何测试,以及测试目标等来决定

项目类型

我司项目类型为业务中台,即开放的业务Api平台,我司的中台架构采用CloudAlibaba系列重构,内部产品线使用RPC接口,Resful接口仅开放OpenApi使用,所以测试需要完全依赖于接口覆盖测试

业务方向(业务架构)

我司主要业务方向为电商与数字商业化,所以业务中台整体架构为三层服务,一级服务为各个基础能力中心,如注册中心,Redis开放能力中心,Mongo存储能力中心,外部服务中心,以及各个中间件、短信等基础能力中心,二级服务为依据我司数十个产品线业务功能模块能力整合拆分出来的业务中心,每个中心仅完成独立能力,如店铺相关能力中心,价格控制能力中心等,三级服务为完整的部分业务能力,按照完整的功能流程独立拆分,例如活动、促销、秒杀等相关的促销域,短信、EMAIL、商城客服聊天IM等相关的消息域等(仅对外开放三级业务域服务)

如何测试

由于我司项目的特殊性,所以在制定测试方式上,分为三类测试,即分为接口覆盖测试子流程闭环测试主分支业务流程覆盖测试,首先我们看第一类接口覆盖测试,此测试需要把我司对外的四百多个三级业务服务全部进行单元测试覆盖,并且完整测试通过,第二类子流程闭环测试,简单理解为每个域独立的业务串联测试,例如市场域的完整闭环流程可能会有多个,例如其中一个流程:申请开店-->审核开店(Y/N)-->设置店铺风格-->设置装修模版-->申请商品(创建商品)-->设置价格-->设置快递模版-->上架商品-->下架商品,至此一个简单的部分流程闭环完成,为什么说是简单的闭环流程呢?我想细心的可能发现,此流程都是涉及市场域相关的接口,并且按照流程顺序执行的,但是很多与之相关的操作并不存在,例如,用户注册、登录、实名认证、账户设置等前置流程没有涉及,且中间流程还有设置促销活动、订单、支付、配送、仓储、物流、结算等诸多流程没有涉及,所以仅为简单闭环流程--即本域业务范围内从无到有再到无的过程,而第三类测试即属于按照公司业务线发展,将中间所有的主流程全部涉及,覆盖面更广,数据要求更严格

测试目标

第一类接口测试我们的目标是接口全覆盖,代码覆盖率达到90%,并且测试目标为可持续多次运行,且测试通过,第二类测试要求可以循环测试多轮,且测试通过,第三类测试要求可动态循环测试,并且要求每一个流程的数据与理想数据相符,且测试通过

技术选型与测试相关工具

有了前面的条件后,我们就可以考虑技术选型和工具相关的准备工作了,毕竟工欲善其事,必先利其器嘛,我们先把能想到的准备好了,才能防止未知的问题,首先我们来看看技术选型,测试工程肯定是需要远程调用接口服务的,而常见的接口一般是Http和RPC两种,我们产品线内部使用则是直接选择RPC调度,所以Dubbo是必不可少的,而项目工程可能会需要独立运行的能力,而SpringBoot也是不错的选择,(至于Http接口,这里可以默认选择使用HttpClient框架进行请求工具类封装,也可以选择使用OkHttp3+Retfit2进行快速简单的Http请求操作)。而我们需要测试一般可选的市场主流的测试框架并不多,常见的如Junit、Nunit、TestNg、Mock等,而Mock用于模拟用户操作,并不触发真实操作,一般情况下用于接口开发的单元测试使用,可以有效的查找问题,而我们当前测试需要依赖真实的远程服务,进行请求操作,与Mock背道而驰,且我司在项目开发的过程中,已经使用Mock进行了单元测试,所以Mock被排除在外,JunitNunit属于类似的测试框架产物,由于是最早提出的测试剥离的框架,并且也是第一个进行完善测试的框架,所以一直到现在也是最常用的测试框架之一,但是JUnit有以下几个约束至今依然存在:

  • 它们的名称必须以 test 开始,如果不是test开头将会启动异常
  • 它们不返回任何值,junit测试过程中所有的测试方法必须是void,否则测试启动异常
  • 它们不能带任何参数,junit直到最新的版本中依然不支持动态测试传递参数,即方法必须无参,虽然发展到现在有各种设计模式和编程技巧可以让我们尽量避免这个约束的问题,比如使用全局变量,并且在测试启动的时候注入有参构造,解决传递参数的问题等,但是灵活度和实用性很差,测试工作也会变得局限性很大,且复杂度会很高

而TestNg比起Junit更年轻,且直到现在依然在保持着更新状态,TestNg从jdk1.5开始,就开始改变测试的方式和细节,完全拥抱java的新特性,如静态、注解等,TestNg提供了更多的生命周期和一堆默认组件,甚至于提供了大量的注解,可以满足常见的主流测试,主流IDE来说,TestNg也有对应的插件可以辅助测试,并且TestNg还有扩展机制,可以支持企业级复杂测试需求的定制化,由此可见,TestNg相比较于其他几个框架来说会更加合适一些,思考完这些,我们可以着手考虑开始快速搭建工程了

项目搭建

首先打开IDEA,使用Spring插件--Spring Assistant快速创建一个Springboot工程,这里我们默认选择SpringBoot2.1.9版本,下面需要选择的start启动类,我们默认勾选web启动类即可(其实这里我们不需要任何启动类,因为工程并不需要启动,也不需要成为web工程),然后等待工程创建完毕即可

strat.png

创建.png

web.png

选择完毕以后,等待工程创建完毕,这里我们将这三个文件进行删除:


删除三个文件.png

这个时候,我们打开pom.xml文件可以看到,当前工程中仅仅引入了spring-boot-web相关的jar以及test相关的jar,但是我们查看maven依赖可以看到,test中使用的jar是junit系列,所以我们需要重新添加testNg依赖,且为了简化开发,我们这里也依赖lombok,坐标如下:

<!--引入testNg-->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.10</version>
            <scope>test</scope>
        </dependency>

        <!--引入lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
            <scope>provided</scope>
        </dependency>

至此,testNg基本集成已经完成,我们开始第一个Test类的编写吧!由于我们的maven依赖作用域范围为test,即jar生效范围在src/test包下生效,但是由于我们当前工程就是为了测试而搭建的工程,这里建议删除test包或者完全不编写,而是修改范围使其在src/main下生效,并且我们将版本号进行统一管理,修改后的依赖如下:

<!-- 版本号管理 -->
<properties>
        <java.version>1.8</java.version>
        <testNg.version>6.10</testNg.version>
        <lombok.version>1.16.10</lombok.version>
    </properties>

.............
<!--引入testNg-->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>${testNg.version}</version>
        </dependency>

        <!--引入lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>

现在我们开始编写我们的第一个Test类,开启我们的TestNg学习之旅吧

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 一、testNG TestNG是Java中的一个测试框架。Java中已经有一个JUnit的测试框架了。 Test...
    DayBreakL阅读 1,444评论 0 8
  • “开始的开始,我们都是孩子。最后的最后,渴望变成天使。歌谣的歌谣,唱着童话的影子,孩子的孩子,该要飞往哪去……”从...
    西柚女孩阅读 202评论 0 2
  • 今天,读了一篇文章,讲了一位老人,如何年轻时从哈佛辍学,如何用50年在纽约的街头风雨无阻,拍下了一整部纽约的...
    杜尔伯特阅读 102评论 0 0
  • 2018.4.7 清明 4月5日清明节,去拜山祭祖,见到了一年前见过的远房亲戚,每年也就见这么一个小时,好些还是会...
    Ly漫步阅读 194评论 0 0
  • 在我们的眼里,让学生怨恨的教师一定是打骂、体罚、恶意训斥或引发强烈冲突的教师,但可曾想到,一些常常被教师们忽略的或...
    石成玉_d24e阅读 261评论 0 0