基于springboot的支持http接口dubbo接口的T
一、背景
由于大多数公司都是使用Java作为后端开发语言,因此为了更好的与研发的框架对接、测试,掌握一套Java的自动化测试框架也逐渐成为测试人员的必修课。
同时随着现在微服务框架的流行,自动化测试框架除了支持传统的http接口之外,各系统微服务间的RPC接口的自动化测试需求也越来越旺盛。本篇文章主要介绍基于springboot的支持http接口dubbo接口的TestNG自动化测试框架。
欢迎关注我的微信公众号:程序员杨叔,各类文章都会第一时间在上面发布,持续分享全栈测试知识干货,你的支持就是作者更新最大的动力二、框架结构
项目整体采用springboot框架,首先来看框架的整体结构图:
1。数据驱动:
使用Json文件作为case的数据驱动,Json文件中包含了接口的基础信息、入参信息、期望结果信息:
TestDataJson文件:{dataItem:〔{id:createActivity1,name:创建活动,desc:创建活动,isRun:Y,url:https:testxxxx。comadd,parameters:{name:自动化测试活动},expectData:{code:0000,result:成功,}}〕}2。测试用例调度框架:
使用testNG框架作为测试用例调度框架,TestCase类:publicclassserviceTestextendsBaseCase{测试Json文件读取效果Test(dataProviderTaskServiceData,dataProviderClassTaskServiceDataProvider。class)publicvoidtestData(ParamOBparamOB)throwsTaskRemoteException{System。out。println(paramOB。toString());Reporter。log(获取Json文件入参为:paramOB。toString());}}
BaseCase类:importorg。springframework。boot。test。context。SpringBootTest;importorg。springframework。test。context。testng。AbstractTestNGSpringContextTests;SpringBootTestpublicclassBaseCaseextendsAbstractTestNGSpringContextTests{}
BaseCase类的作用:继承AbstractTestNGSpringContextTests,AbstractTestNGSpringContextTests这个类的作用:测试类只有继承了该类才拥有注入实例的能力。
同时BaseCase添加了SpringBootTest注解,Spring将加载所有被管理的bean。不然测试类注入bean时会报空指针。3。Http接口调用:
使用okhttp3工具包调用,OkHttpUtils类:publicStringokHttpPost(HashMapString,StringrequestBody,Stringurl,StringcookieValue){设置接口调用超时时间为60秒OkHttpClientclientnewOkHttpClient()。newBuilder()。connectTimeout(60,TimeUnit。SECONDS)。readTimeout(60,TimeUnit。SECONDS)。build();可以单独把formbody拿出来FormBody。BuilderformBuildernewFormBody。Builder();将传进来包含的参数键值对的map集合遍历出来for(Objecto:requestBody。keySet()){将参数添加到frombody中formBuilder。add(o。toString(),String。valueOf(requestBody。get(o。toString())));}将frombody初始化到request对象中然后拿去请求RequestBodybodyformBuilder。build();RequestrequestnewRequest。Builder()。url(url)。method(POST,body)。addHeader(ContentType,applicationxwwwformurlencoded)。addHeader(Cookie,cookieValue)。build();try{Responseresponseclient。newCall(request)。execute();Stringrescontentresponse。body()。string();log。info(调用接口:url返回rescontent);returnrescontent;}catch(IOExceptione){e。printStackTrace();returnnull;}}publicStringokHttpGet(Stringurl,StringcookieValue){OkHttpClientclientnewOkHttpClient()。newBuilder()。connectTimeout(60,TimeUnit。SECONDS)。readTimeout(60,TimeUnit。SECONDS)。build();RequestrequestnewRequest。Builder()。url(url)。addHeader(ContentType,applicationxwwwformurlencoded)。addHeader(Cookie,cookieValue)。build();try{Responseresponseclient。newCall(request)。execute();Stringrescontentresponse。body()。string();returnrescontent;}catch(IOExceptione){e。printStackTrace();returnnull;}4。Dubbo接口调用:
使用zookeeperdubboxml配置方式调用dubbo接口,applicationtest。properties配置文件:dubbo。registry。addresszookeeper:testzk1。xxxx。com:2181dubbo。application。nameautotest
springdubboconfig。xml配置文件:lt;?xmlversion1。0encodingUTF8?beansxmlnshttp:www。springframework。orgschemabeansxmlns:xsihttp:www。w3。org2001XMLSchemainstancexmlns:dubbohttp:code。alibabatech。comschemadubboxsi:schemaLocationhttp:www。springframework。orgschemabeanshttp:www。springframework。orgschemabeansspringbeans。xsdhttp:code。alibabatech。comschemadubbohttp:code。alibabatech。comschemadubbodubbo。xsddubbo:applicationname{dubbo。application。name}!zookeeper注册中心dubbo:registryaddress{dubbo。registry。address}checkfalse!要测试的Dubbo服务dubbo:referenceidtestDubboServiceinterfacecom。xxxx。dubbo。TestDubboServicetimeout1000checkfalsebeans
TestCase类调用dubbo接口:publicclassDubboServiceTestextendsBaseCase{ResourceprivateTaskDubboServicetaskDubboService;Test(dataProviderTaskServiceData,dataProviderClassTaskServiceDataProvider。class,description测试dubbo接口)publicvoidtestDubbo(ParamOBparamOB)throwsTaskRemoteException{1。获取Json数据中的用例ID、名称、入参、期望结果数据StringparamparamOB。getParams();StringexpectDataparamOB。getExpectData();2。转换为对应的参数对象信息TaskContexttaskContextJSONObject。parseObject(param,TaskContext。class);Reporter。log(接口入参为JSONObject。toJSONString(taskContext));3。测试环境正常调用接口ListInforesulttestDubboService。process(taskContext);StringresultStrJSONObject。toJSONString(result);Reporter。log(testDubboService接口返回为resultStr);去掉返回结果前后的中括号StringfinalResultStringUtils。strip(resultStr,〔〕);4。转化格式然后调用check方法校验接口返回结果和Json文件中的期望结果数据是否匹配MapString,ObjectexpectDataMapJSONObject。parseObject(expectData,Map。class);CommonResultCheck。CommonJsonCheck(finalResult,expectDataMap);}}5。测试报告:
使用ExtentReports报告框架输出测试报告,testng。xml配置文件:lt;?xmlversion1。0encodingUTF8?!DOCTYPEsuiteSYSTEMhttp:testng。orgtestng1。0。dtdsuitename测试模板testname测试入参获取classesclassnamecom。autotestdemo。cases。task。api。testCase。TaskServiceTestmethodsincludenametestDataincludemethodsclassclassestestlisteners!listenerclassnamecom。vimalselvam。testng。listener。ExtentTestNgFormatterlistener!直接使用我们自己写的监听器,可以跳过翻墙的Js文件,不然报告一致转圈圈加载不出来listenerclassnamecom。autotestdemo。utils。ExtendTestNGIReporterListenerNewlistenerssuite三、项目目录结构文件内容介绍1。主目录srcmain
srcmainjava用于存放一些封装公共方法类和基础类:CommonResultCheck:封装结果方法断言类OkHttpUtil:封装http请求方法类DBUtil:封装数据库操作方法类AutotestdemoApplication:springboot启动类
srcmainresources用于存放各类配置文件:applicationtest。properties:配置文件(zookeeper、数据库配置等)springdubboconfig。xml:dubbo配置文件2。测试目录srctest
srctestjavacases用于存放测试用例:systemName文件夹:系统名称文件夹dataProvider文件夹:系统的测试数据获取类testcase文件夹:系统的测试用例类
srctestjavautils用于存放公共方法类:DataProviderUtils:转换测试数据为DataProvider格式类ExtendTestNGReporterListenerNew:测试报告优化类ParamOB:测试数据对象类LoginUtil:封装登录方法类ReadJsonUtil:封装读取Json文件数据方法类
srctestresources用于存放测试数据、离线报告样式文件等:css文件夹:ExtendReport报告的css文件js文件夹:ExtendReport报告的js文件font文件夹:ExtendReport报告的字体文件jsonData文件夹:存放各系统接口Json测试数据testSuites文件夹:存放testNG的xml文件用于批量运行3。测试报告结果展示:
以上就是本次的全部内容,都看到这里了,如果对你有帮助,麻烦点个赞收藏关注,一键三连啦
程序员杨叔:持续分享全栈测试知识干货。标签:自动化测试、性能测试、Java、Python、DevOps、CICD、小程序测试、测试工具、测试开发、测试框架平台、测试管理