接口自动化测试必备框架知识,摸着良心讲,你学会了几样?(代码片段)

测试萌萌 测试萌萌     2022-12-20     380

关键词:


上篇为什么TestNg会成为Java测试框架的首选?还犹豫什么,看它!我们从多个角度分析了选择TestNg的理由,并且也了解了TestNg的运行时生命周期,本篇我们来详细的学习@Test注解,以及各个参数的使用。

一、@Test注解的基本使用

前面我们已经创建了好几个案例,并且每个案例的测试方法上都加上了 @Test 注解,用来标识当前方法是测试方法,而加了 @Test 注解的方法,则是最简单的TestNg测试方法了,现在我们来编写一个最基本的Test:

@Test

public void test()

System.out.println("test");


运行以后即可看到输出了我们想要的结果–>test

二、@Test注解参数

我们来进入Test注解类,来看看这个注解是如何定义的吧:

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD, ElementType.TYPE, ElementType.CONSTRUCTOR)

public @interface Test 

  String[] groups() default ;

  boolean enabled() default true;

  /** @deprecated */

  @Deprecated

  String[] parameters() default ;

  String[] dependsOnGroups() default ;

  String[] dependsOnMethods() default ;

  long timeOut() default 0L;

  long invocationTimeOut() default 0L;

  int invocationCount() default 1;

  int threadPoolSize() default 0;

  int successPercentage() default 100;

  String dataProvider() default "";

  Class<?> dataProviderClass() default Object.class;

  boolean alwaysRun() default false;

  String description() default "";

  Class[] expectedExceptions() default ;

  String expectedExceptionsMessageRegExp() default ".*";

  String suiteName() default "";

  String testName() default "";

  /** @deprecated */

  boolean sequential() default false;

  boolean singleThreaded() default false;

  Class retryAnalyzer() default Class.class;

  boolean skipFailedInvocations() default false;

  boolean ignoreMissingDependencies() default false;

  int priority() default 0;

  

可以看到Test注解的定义@Target(ElementType.METHOD, ElementType.TYPE, ElementType.CONSTRUCTOR) 则是代表了此注解可以定义的范围,即可以使用在构造方法、普通方法以及类上。而此注解中定义了大量的参数和方法,我们来看看这些参数分别是做什么的吧:

groups

groups代表组,即可以将同一个功能或者一个连续的操作方法定义为一个组,运行时可以完全按照组来运行

enabled

enabled代表是否启用当前方法,默认为true,即为启用当前测试方法

parameters

parameters代表参数,可以使用当前注解给测试方法传递参数

dependsOnGroups

dependsOnGroups代表依赖的组,即如果当前方法运行之前,必须要依赖某些方法执行完毕,我们可以将这一部分的方法设置为一个组,可以将这个组设置为依赖组,测试运行的时候会优先运行依赖的组,再去运行当前测试方法

dependsOnMethods

dependsOnMethods代表依赖的方法集合,即如果当前方法运行之前,需要依赖一个方法执行完毕或者传递结果,可以将需要依赖的方法设置进来,测试运行时会按照依赖传递优先级运行

timeOut

timeOut代表测试方法的运行超时时间,可以设置对应的时间,用来测试当前方法是否能在指定时间内正确执行完毕,单位为毫秒

invocationTimeOut

invocationTimeOut与上一个参数一样都是设置方法的超时时间,但是不同的是,此参数设置的是调用方法的超时时间,即别的方法调用当前方法的时候,指定时间内必须返回,否则视为调用超时

invocationCount

invocationCount代表当前方法允许被调用的次数,此参数可以指定当前测试方法被调用的次数,默认情况下,值为1,代表一次运行中当前方法只会被调用1次

threadPoolSize

threadPoolSize代表开启多少个线程运行当前测试方法,此参数可以指定线程池的线程数,用来模拟性能测试和并发测试,默认为0,即不开启单独线程,使用主线程

successPercentage

successPercentage代表当前测试方法运行成功的百分比,一般我们测试过程中,可能会受网络或者性能的影响,导致部分测试不成功,这个时候我们就可以指定此参数,来限制测试成功百分比

dataProvider

dataProvider是指定特殊的内容提供者的方法名

dataProviderClass

dataProviderClass指定内容提供者所在的类名

alwaysRun

alwaysRun指的是当前方法是否无论什么情况都会运行,如果指定为true,则代表即使此方法依赖的方法或者组运行失败,此方法依然会尝试运行,默认为false

description

description代表当前测试方法的描述说明

expectedExceptions

expectedExceptions指的是当前测试方法可能会抛出某些异常,可以使用当前参数指定具体的异常,并且将这些异常排除,则被排除的异常出现,当前测试方法依然算成功运行

expectedExceptionsMessageRegExp

expectedExceptionsMessageRegExp指得是通过设置此参数,可以用来匹配测试方法中异常的消息是否一致

suiteName

suiteName指的是当前测试方法运行的时候指定所属的套件名称

 testName

testName指的是当前测试方法运行的时候指定的测试用例的名称

sequential

sequential指的是如果当前参数为true,则当前测试类的所有测试方法都会按照定义的顺序来执行

singleThreaded

singleThreaded如果设置为true,则此测试类上的所有方法都保证在同一个线程中运行,即使当前正在使用 parallel =“methods”运行测试。此属性只能在类级别使用,如果在方法级别使用,它将被忽略。注意:此属性曾被称为顺序(现在已经弃用)

retryAnalyzer

retryAnalyzer指的是测试重试机制,即当前测试方法如果失败,可以指定此参数,当失败的时候会按照指定的值进行一定次数的重试

skipFailedInvocations

skipFailedInvocations指的是当此方法运行过程中有失败的时候,是否跳过失败的方法继续运行,默认为false

ignoreMissingDependencies

ignoreMissingDependencies指的是找不到指定的依赖的时候是否依然继续执行,默认为false

priority

priority参数指定了当前测试方法的优先级,较低的优先级则会优先运行,最低为0,默认优先级为0

三、常见的参数实例

接下来,我们通过一些实例来看看常见的注解参数的使用

如何在测试中报告异常

在早期开发中,传统的报告错误的方式就是利用返回码,例如返回-1代表运行失败等,但是此种方式会存在一些问题,例如当调用者拿到返回值以后需要大量的if分支来判断当前成功还是失败,并且每一次不一定有合适的错误码来与之对应,往往会导致错误码与错误并不匹配的情况。所以针对此种情况,后来又出现了通过异常信息来获取具体的错误信息的方式,此种方式把之前的错误码的弊端解决了,但是如果在java测试过程中优雅的处理测试异常呢?假设此时有个需求:预定一个航班,如果第一次尝试失败,即抛出异常,在junit3中的处理方式为:

@Test

public void shouldThrowIfPlaneIsFull() 

Plane plane = createPlane();

plane.bookAllSeats();

try 

plane.bookPlane(createValidItinerary ( ), null);

fail(MThe reservation should have failed");



catch(ReservationException ex) 

//success, do nothing: the test will pass




try-catch是我们最常见的处理方式,那么如果我们需要测试抛异常的时候作为此条测试用例成功的条件呢?难道每次都靠try-catch来处理吗?在testNG中有更优雅的处理方式:

@Test(expectedExceptions = ReservationException.class)

public void shouldThrowIfPlanelsFull() 

     plane plane = createPlane();

     plane. bookAHSeats ();

     plane.bookPlane(createValidItinerary(), null);


@Test 注解中设置一个 expectedExceptions 参数,将期望抛出的异常标记出来,如果运行的时候出现了这个异常,那么则视为我们当前测试用例测试成功,比起前面的确优雅了不少。如果这个时候我返回的异常都是RuntimeException,但是我希望根据msg来确定是不是我希望触发的某种异常场景,又该如何呢?这个时候就需要 expectedExceptionsMessageRegExp 参数登场了,只要设置固定的返回异常信息,或者对应的正则表达式即可,最后返回的异常类型匹配上以后,会进行异常信息的正则匹配,只有都匹配上的异常才会视为测试成功。

多线程与并发运行测试

早期开发主要使用单线程,依赖机器的硬件性能提升用户体验,但是到了后来多核心算力成为主流,所以几乎所有的程序都支持多线程运行,同样的java程序在单线程测试下往往表现很好,不会出现问题,但是当用户过多往往会发现未知的问题,我们该如何模拟多线程下的测试用例场景呢?别担心,testNg中加入了并发模块支持,从而来证明一些场景下是否为线程安全的。我们先来看一个经典的单例写法:

public class Singleton 
     private static Singleton instance = null;
          public static Singleton getlnstance() 
          if (instance == null) 
          instance = new Singleton();
          
         return instance;
      

这是一个经典的单例的写法,看起来似乎能保证Singleton类实例仅被实例化一次,但是事实真的如此吗?我们来模拟一下多线程运行的并发测试:

private Singleton singleton;

@BeforeClass

public void init() 

       singleton = new Singleton();



@Test(invocationCount = 100, threadPoolSize = 10)

public void testSingleton()

      Thread.yield();

      Assert.assertNull(instance);

      Singleton p = singleton.getlnstance();


可以看到我们在 @Test 注解上设置了 invocationCount 参数,表示此方法被运行100次,并且设置了

threadPoolSize 参数,代表同时开启10个线程运行此方法(无论多少个线程,运行的总数都是100次),我们来看看结果:

=======================================

Concurrent testing

Total tests run: 100, Failures: 5, Skips: 0

=======================================

可以看到,我们的断言居然有5个没有成功的,可见此单例在多线程下的确是不安全的

稳定性测试与可靠性测试

在测试的过程中,往往我们还会遇到需求,比如某一部分接口的调用时间不稳定,需要我们测试一下具体的稳定性或者当前接口的可靠性,这个时候我们就需要 timeOut 和 successPercentage 参数出场了,例如我们有一个接口我们必须保证在10s内调用100次这个接口成功率在98%以上,否则这个接口就是不合格的,测试代码即可如下编写所示:

//测试10s内运行一百次方法调用成功率是否超过98%

@Test(timeOut = 10000, invocationCount = 1000,

successPercentage = 98)

public void waitForAnswer() 

     while (1 success) 

          Thread.sleep(1000);

     



最后: 欢迎大家关注公众号:【 伤心的辣条 】,领取一份300页pdf文档的Python自动化测试工程师核心知识点总结!

公众号里大部分资料都是面试时面试官必问的知识点,也包括了很多测试行业常见知识,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果你测试中有许多的困惑,那么我创建的软件测试技术交流群将会是你接触良师益友的有益社区,同行或许可以给你带来一些实际性的帮助与突破。群:902061117 你也想知道同行都在怎样致富吧!

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

好文推荐:

阿里小黑叹息:越来越多的年轻人从职场撤退了?

Python简单?先来40道基础面试题测试下

App公共测试用例梳理

从一名开发人员转做测试的一些感悟

五分钟学会接口自动化测试框架(代码片段)

今天,我们来聊聊接口自动化测试是什么?如何开始?接口自动化测试框架怎么做?自动化测试自动化测试,这几年行业内的热词,也是测试人员进阶的必备技能,更是软件测试未来发展的趋势。特别... 查看详情

揭秘阿里测试框架,各大cto良心力荐

自动化测试因其节约成本、提高效率、减少手动干预等优势已经日渐成为测试人员的“潮流”,从业人员日益清楚地明白实现自动化框架是软件自动化项目成功的关键因素之一。本篇文章将从 什么是真正的自动化测试... 查看详情

appium入坑必备--不写代码的自动化测试,你不心动吗?(代码片段)

       上一章我们讲了appium的一些基本操作,也是app测试中一些比较常用的一些方法。本章我们讲讲另外两种工具的使用,最后一种会让你心动!元素定位及工具使用-------必须学会的技能app定位的基本操作-------... 查看详情

webui自动化必备技能-html和css知识详解

学习web自动化的前提条件:手工测试(了解各种测试的知识)、学习编程语言、学习Web基础、学习自动化测试工具、学习自动化测试框架、需要掌握前端的一些知识,无论学习语言还是前端知识,都是为了接... 查看详情

python接口自动化测试框架(工具篇)--接口测试工具requests

文章目录前言requests代码实现你的第一个接口测试依葫芦画瓢扩展前言这是一个插曲,前面说了一堆python基础语法,紧接着就到了工具,再按照目录一直往下写,就到了代码层,但是在许多代码示例中出现了requests库,相信有些... 查看详情

这些自动化测试框架知识你还不知道?

这些自动化测试框架知识你还不知道?!  无论是在自动化测试实践,还是日常交流中,经常听到一个词:框架。之前学习自动化测试的过程中,一直对“框架”这个词知其然不知其所以然。  最近看了很多自动化相关的资... 查看详情

这些自动化测试框架知识你还不知道

无论是在自动化测试实践,还是日常交流中,经常听到一个词:框架。之前学习自动化测试的过程中,一直对“框架”这个词知其然不知其所以然。最近看了很多自动化相关的资料,加上自己的一些实践,算是对“框架... 查看详情

快速打造属于你的接口自动化测试框架(代码片段)

...换,传递和控制管理过程,以及相互逻辑依赖关系。接口自动化相对于UI自动化来说,属于更底层的测试,这样带来的好处就是测试收益更大,且维护成本相对来说较低,是我们进行自动化测试的首选2框架选型目前接口自动化的... 查看详情

自动化测试必备实用工具,帮你提高工作效率

...测试、性能测试等方面,为大家整理了码云上优秀的自动化测试开源项目,希望能给大家带来一点帮助。不足之处,欢迎讨论交流:)一、WebUI自动化测试1、项目名称:自动化测试平台LuckyFrame项目简介ÿ... 查看详情

接口自动化框架

...基础回顾对接口基础知识进行回顾,课前预习 1-1接口自动化测试从基础到框架-导学 1-2接口基础知识回顾 1-3接口测试基础面试解答第2章fiddler在工作中的运用讲解在工作中如何使用fiddler,提高工作效率,增加对接口... 查看详情

swagger接口测试框架-知识集锦

...测试和部署。它提供了许多试用的工具来帮助开发者进行接口开发,如及时接口文档编写工具swagger-editor,前端展示swagger-ui,还有代码自动生成工具swagger-codegen。下面会分别对这些工具进行介绍,由于Swagger的版本更新较快,功... 查看详情

10分钟学会jmeter接口测试

...是不是得等前后端都完成你才能进行测试,才能进行自动化代码编写。而如果是接口测试,只需要前后端定义好接口,那这时自动化就可以介入编写接口自动化测试代码ÿ 查看详情

python接口自动化测试框架(工具篇)--接口测试工具jmeter

...装JMeter接口测试案例快速创建JMeter接口测试计划扩展接口自动化测试性能自动化测试前言相比使用postman做接口测试,作为测试人员,熟练使用jmeter做接口测试已经是必备技能,这可以从各大招聘测试岗的JD中得到印证,它不仅仅... 查看详情

熬夜整理的自动化测试框架结构图,值的一看

自动化测试框架结构图目录自动化测试框架结构图1、接口自动化测试框架设计图2、接口自动化执行设计图3、API自动化平台框架设计图4、UI自动化测试框架设计图5、接口+UI自动化测试框架设计图6、Appium移动端自动化测试框架... 查看详情

手把手教你接口自动化测试–soapui&groovy

...。另外,本文的思路和我上一篇文章<零成本实现接口自动化测试–Java+TestNG测试Restfulservice>很相似,只不过把Java+TestNG的组合换成了SoapUI+Groovy,另外测试对象也换成了基于Soap的we 查看详情

编程程软件测试培训的课程内容包含哪些方面?

...分别是计算机基础、功能测试课程、Python编程和数据库、自动化测试课程、性能测试、MySQL加强、LoadRunner和就业指导。软件测试需要学:1、学习测试基础和理论知识,包括测试计划编写、编写BUG报告单、设计测试用例等;2、学... 查看详情

2020自动化测试岗位需求的7项必备技能(更新版)

...业界不断增长。测试人员现在正在与开发人员一起工作,自动化测试在许多方面极大地取代了手动测试。如果您是自动化测试领域的新手,刚雇用您的组织将期望您快速,开箱即用,并能够检测到错误或提供没人想到的解决方案... 查看详情

接口自动化知识梳理

接口自动化知识梳理学习知识块:基础知识类与对象单元测试requestsopenpyxlpandasreddtunittestmysqllogging框架梳理学习方式:靠时间堆思考清楚http请求类:写2组数据在Python里面。单元测试类:写2组数据在Python里面。解... 查看详情