自动化测试之常见参数实例
更新时间:2021-12-31 09:40:43 作者:多测师 浏览:188
我们通过一些实例来看看常见的注解参数的使用
如何在测试中报告异常
在早期开发中,传统的报告错误的方式就是利用返回码,例如返回-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); }}
以上内容为大家介绍了自动化测试之常见参数实例,希望对大家有所帮助,如果想要了解更多接口自动化测试相关知识,请关注多测师。https://www.aichudan.com/xwzx/
上一篇:自动化测试之Test注解参数
下一篇:自动化测试适合的项目