• 0
  • 0
分享
  • Karate让RESTful Web Service测试更简捷更高效
  • 曼倩诙谐 2020-10-16 10:43:54 字数 3663 阅读 2002 收藏 0

  应用场景:在API的测试中,测试某些具体数据值,比如返回的结果是否是需求的类型,文件是否是符合且具备完整的数据结构。这些都是必须且很细致的测试工作。另外,组织、运行测试场景,以及演示测试结果这些也都使得测试人员要更加快速的找到合适的API测试方法。今天就详细地介绍如何用Karate组织、运行测试场景,以及验证Json 文件数据的正确性。

  如果您想跟着以下示例操作,需要做好以下配置:

  测试框架:Java + Karate + Junit 5

  语言:Java, Cucumber

  IDE:Intellij IDEA

  项目类型:Maven

  Karate 项目配置

  为了能让跟着步骤操作的小伙伴们真正地运行起代码来,所以下面是有关配置的操作(注:如您已经熟悉这些配置,可以跳过。)

  1.创建一个新的Maven 项目

  2.POM配置 (这里介绍的清楚一些,有时就是因为配置没设好,脚本就是运行不起来。)

Y1.png

  3.配置 Cucumber

  依次打开Files > Settings > Plugins : 确保cucumber for Java 和Gherkin 插件已经安装成功。

Y2.png

  创建 Karate 测试用例

  1.创建测试场景 (feature 文件)

  如下图显示,本示例中country-get.feature 文件前面有一个绿色的图标,这就是cucumber feature 文件的标识。

Y3.png

  2.编写测试场景

  背景 Background:  本示例中,url  和 header 是所有测试用例中共用的一部份,所以就把它们写在了Background中。

Y4.png

  用例一:测试get method 并验证响应代码,文件长度以及第一个字段值 (期待成功)

  文件长度:这里实际是指返回的一个json数组里包含了多个.json 文件,比如本实返回了250个文件。

Y5.png

  @Value: @ 注释 是测试人员组织测试用例时非常好用的小工具。我们可以一组类似的测试用例用 相同的 @ 把它它们标识出来,这样运行的时候根据需求也可以分组执行。

  Given: path 从下图中可以看出,path 只是后面的一部份而已,当运行的时候,会和Background 中的url自动地连接在一起。 相当于https://restcountries.eu/rest/v2/all

  When: 本例中我们测试 get 请求

  Then, And : 这是本例中要验证的结果,期待请求发表以后,会收到成功的返回代码: 200, 并且包含有 250 文件,同时第一个.json文件的第一层nativeName 要等于验证的字符串。(注:在第二截图里显示了实际返回的nativeName 值)

Y6.png

Y7.png

  用例二 :测试带有参数的get method  并验证响应代码,文件长度以及国家名称 (期待成功)

  本例中多加了一个参数:相当于请求 https://restcountries.eu/rest/v2/name/aruba?fullText=true

  Y8.png

  用例三:测试带有参数的get method  并验证响应代码和返回的文件内容 (期待失败)

  本示例是测试当请求有误时,系统的响应信息。和前一个示例不同的时,把国家的名字给错了,请求的url:https://restcountries.eu/rest/v2/name/arubaq?fullText=true

  在验证时,第一个match 中期待返回的status 是一整型, 第二match中期待返回的status是一个字符型。根据实际返回信息 (如下图二), status应该是一个整型。

  注: 这个用例中的@Contents 与前二个示例不同. (在运行文件中,您能切身体会有什么效果了。)

Y9.png

Y9-1.png

  创建运行文件

  如下图所示,这里创建5 种运行方式 ( @Karate.Test)。下面我们依次介绍如下:

  ·testTags(): 运行同一文件夹里country-get.feature 里面标记是@Value的测试场景

  ·testSingle(): 运行同一文件夹里country-get.feature 里面所有的测试场景

  ·testFullPath(): 指定运行feature 文件夹里country-get.feature 里面标记是@Contents 的测试场景

  ·testPost():  想运行country-post.feature文件中的所有测试场景 (注:这里是一种错误的写法,文件运行不起来,因为当前文件夹下没有country-post.feature 文件)

  ·testinFeaturePost(): 指定运行featurepost 文件夹里country-post.feature文件中的所有测试场景

  ·testAll(): 指定运行同一文件夹里所有feature文件中的所有测试场景

  现在各位朋友清楚了在feature文件中,各个场景里@的不同意义了吧。同时写这么多运行方式也是想让大家更加明了当你有不同的需求时,如何快捷地运行你的测试场景。

Y10.png

  脚本运行

  1.运行在IDE

  右键点击CountryRunnerTest文件,在弹出的菜单列表中点击 Run CountryRunnerTest。 收割的时候到了,快看一下结果吧。

  如下图(运行结果一)所示,从左边的窗口中, 可以看出

  1) testAll() 运行了country-get.feature 和sample.feature 两个文件。country-get中显示运行了3个场景: 2 个成功,1个失败。

  2)失败的场景结果中: 我们设计去验证status 应该是整型而不是字符型,右边窗口显示了指示出清晰的错误原因

  3)testTags(): 只运行了两个成功的场景 @Value

  4)testFullPath(): 只运了失败的场景 @Contents

  运行结果一:

Y11.png

  如下图(运行结果二)所示,从左边的窗口中, 可以看出

  1)testTagsPost(): 没有运行,因为没有找到对应feature 文件或场景

  2)testTagsPostinFeaturePost():  运行正确

  运行结果二:

Y12.png

  2.运行通过命令行

  ·指定运行某一个方法

  执行命令: mvn test -Dtest=CountryRunnerTest#testFullPath

  CountryRunnerTest: java class 文件名

  #testFullPath:  指定运行测试 (注:这里就是CountryRunnerTest文件中的运行方法)

Y13.png

  ·运行单个文件

  移除其它的运行方法

  执行命令:  mvn test  (注:当用这个命令时,运行的文件名必须是*Test.java)

Y14.png

  3.并行运行Parallel Run

  ·创建CountryPallelTest.java 文件。 如下图所示,classpath:feature 是指当前的package feature, parallel: 示例中有2 thread to run country-get.feature and sample.feature (注: 把先前CountryRunnerTest文件名改为CountryRunner)

  ·执行 mvn test

Y15.png

  ·如下图示,结果中显示 threads: 2, passed: 2 , failed:1

  (注: 这里的两个feature 文件运行了1个,ignored: 1, 是因为sample.feature 是一个空文件)

Y16.png

  4.如果您在运行时遇到错误信息: The forked VM terminated without properly saying goodbye. VM crash or System.exit called? 可以执行: mvn clean install

  报告测试结果

  1.Karate 报表

  以执行mvn test -Dtest=CountryRunnerTest#testFullPath 为例,运行完毕以后,target文件夹会自动生成,展开target > surefire-reports文件夹,找到feature.country-get.html,右键点击,在显示的菜单列表中点击Open in Browser ,选择您想要找开文件的browser。

Y17.png

  如下图所示,karate 的报告中显示出很明确请求连接url与验证失败的原因。

Y18.png

  2.并行运行报告

  从产生的目录结构中,可以看出并行运行的结果与单个运行结果的报表是不同:

Y19.png

  Timeline.html中很明确显示了3个测试场景在2 threads 的分配和运行状况。

Y20.png


作者:胡军英

来源:51Testing软件测试网原创


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 测试流程我们一般在项目进行开立项会(产品经理 项目经理 开发人员 测试人员)的时候进行参与,讨论需求并提出建议,在立项会中制定需求文档,由UI设计原型图,开发根据需求进行编码,我们测试会根据需求文档进行编写测试计划,根据模块的颗粒度划分并编写测试用例以及对用例的评审,开发结束后,测试对主要功能进行冒烟测试,执行测试用例,提交bug开发进行修改,修改成功后关闭bug,进行回归测试,在上线前进行测试总结。用例评审会:【测试人员 测试组长/项目经理 产品经理】 a:组内评审【测试人员 测试组长/项目经理 产品经理 客户】 b:组外评审冒烟测试:对主要功能进行测试回归测试:bug修改后,重新测试查看是...
            0 0 2373
            分享
          • 简介Loadrunner是一种预测系统行为和性能的负载测试工具,它可以轻松创建虚拟用户、创建真实的负载、定位性能问题、重复测试保证系统的高性能。LR与JM对比组成Vuser GeneratorC语言脚本开发的Controller指挥官的作用,控制执行场景Analysis收集测试数据,进行结果分析的什么时候可以开始执行性能测试功能测试通过;一般需要进行性能测试的系统,都是用户量比较大、业务使用比较频繁、比较重要的功能模块。使用Loadrunner的步骤制定性能测试计划—>开发测试脚本—>设计测试场景—>执行测试场景—>监控测试场景—>分析测试结果为什么用事务事务Tr...
            13 13 1497
            分享
          •   技术背景  需要有一定的python基础,代码阅读能力;以及自动化测试思想。  去到任何一家企业,如果少不了自动化,必然会要搭建一套自动化测试框架!  那么问题随之而来,这框架如何选择呢?  如果是代码能力强,可以自行开发与设计,那要是不呢?KPI摆在那,总不能说不行吧!  不行,代表着真的不行,在测试职业领域真的没有什么测试的不行!作者回顾以往工作经历,测试从来没有说过不字。  不会安全测试,但总得会几样安全型测试工具吧,不济也该知道安全测试的目的和原理吧。  不会性能测试,但总得会使用工具吧,理解性能测试指标和知道如何设计性能测试场景吧。  不会单元测试,不会自动化测试?不会渗透测试?...
            0 0 945
            分享
          •   测试团队作为产品研发团队重要的一环,承担着产品研发质量保证的工作。一款产品质量的好坏,测试团队起着很重要的作用。  作为测试团队的管理者、负责人,所有工作的开展,都需要从自身团队的价值出发,为整个团队找到最佳的价值输出点。  今天,我们就从这个点出发,探讨测试团队的管理工作。  一般情况下,测试团队工作的服务对象,主要包括两个:一个是产品的最终用户,另一个是产品的研发团队,我们分开来说。  最终用户  产品的最终用户,最直观地感受着一款产品质量,测试团队测试的好坏与否,产品的最终用户最有发言权。  因此,如何让产品的最终用户的体验,来证明测试团队的价值,是测试团队最重要的工作之一。  从这...
            1 2 2037
            分享
          • 于公司的开发团队偏向于使用Java技术,而且公司倡导学习开源技术,所以我选择用Java语言来进行Selenium WebDriver的自动化框架开发。由于本人没有Java开发经验,以前虽然学过QTP但从没有接触过Selenium,正好通过这个机会能学习一下自动化测试,同时也学习一下基本的Java开发过程。一、首先是搭建框架开发环境按照网上的方法部署eclipse,建立TestAction工程,并Import引用JDK和Selenium-2.44完整包二、继续引用和安装相关jar包首先是要满足数据驱动(场景用例和动作用例、数据用例都需要放到excel表上),就需要引用jxl.rar包(实现调用和...
            12 12 1568
            分享
      • 51testing软件测试圈微信