Java老矣,Java正年轻!一文了解Java接口自动化测试框架TestNg

JAVA 2023-07-05 17:29:38
204阅读

  前环节大家从好几个视角剖析了挑选TestNg的原因,而且也了解了TestNg的运作时生命期,此次大家来详尽的学习培训@Test注解,及其每个主要参数的应用。

Java老矣,Java正年轻!一文了解Java接口自动化测试框架TestNg

  

  @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意味着测试方法的运作请求超时時间,能够设定相匹配的時间,用于检测当今方式是不是能在特定時间内恰当实行结束,企业为ms

  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

  普遍的主要参数案例

  接下去,大家根据一些案例讨论一下普遍的注解主要参数的应用:

Java老矣,Java正年轻!一文了解Java接口自动化测试框架TestNg

  

  怎样在检测中汇报出现异常

  在初期开发设计中,传统式的汇报不正确的方法便是运用回到码,比如回到-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老矣,Java正年轻!一文了解Java接口自动化测试框架TestNg

  

  线程同步与高并发运作检测

  初期开发设计关键应用并行处理,依靠设备的硬件配置特性提高客户体验,可是来到之后多关键算率变成流行,因此 基本上全部的程序流程都适用线程同步运作,一样的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);

    }

    }

  请关注+私信回复:“测试”就可以免费拿到软件测试学习资料和面试题库!

Java老矣,Java正年轻!一文了解Java接口自动化测试框架TestNg

  

the end
免责声明:本文不代表本站的观点和立场,如有侵权请联系本站删除!本站仅提供信息存储空间服务。