Java(40).JAVA结合testng断言verify(断言失败不中断继续执行)

已知前提

1、Java语言编写的接口自动化框架

2、新增角色接口有5个用例,一个方法传参数5个,需要执行5次操作

3、使用的是testng的断言

import org.testng.Assert;

Assert.assertEquals(code, expectData,"角色添加接口");

问题描述:

TestNg,调试新增接口,执行到第3个用例时遇到Assert断言失败,剩下的2个用例不再执行

错误如下:

java.lang.AssertionError: 角色添加接口 expected [0] but found [600110]

Expected :0

Actual   :600110

解决方法:

原理:

1.自已构造一个断言类,把Assert.assertEquals给try catch住。

2.利用testng的监听类在测试方法运行结束后进行分析。

断言类:

package com.ciphergateway.asserts;


import java.util.ArrayList;
import java.util.List;
import org.testng.Assert;
/**
 * Description: Assertion工具类
 *
 * @author HMF
 * @date Created on 2021/09/18
 */
public class Assertion {

    public static boolean flag = true;

    public static List<Error> errors = new ArrayList<Error>();
    /**
       * String对比
       * @param actual
       * @param expected
       */
    public static void verifyEquals(Object actual, Object expected){
        try{
            Assert.assertEquals(actual, expected);
        }catch(Error e){
            errors.add(e);
            flag = false;
        }
    }
    /**
     * String对比+msg
       * @param actual
       * @param expected
       * @param message
       */
    public static void verifyEquals(Object actual, Object expected, String message){
        try{
            Assert.assertEquals(actual, expected, message);
        }catch(Error e){
            errors.add(e);
            flag = false;
        }
    }

    /**
       * 判断是否为空
       * @param actual
       * @param message
       */
    public static void assertNull(Object actual, String message){
        try{
            Assert.assertNull(actual,message);
        }catch(Error e){
            errors.add(e);
            flag=false;
        }
    }
}

监听类:

package com.ciphergateway.asserts;

import java.util.ArrayList;
import java.util.List;

import org.testng.ITestResult;
import org.testng.TestListenerAdapter;

public class AssertionListener extends TestListenerAdapter {

    @Override
    public void onTestStart(ITestResult result) {
        Assertion.flag = true;
        Assertion.errors.clear();
    }

    @Override
    public void onTestFailure(ITestResult tr) {
        this.handleAssertion(tr);
    }

    @Override
    public void onTestSkipped(ITestResult tr) {
        this.handleAssertion(tr);
    }

    @Override
    public void onTestSuccess(ITestResult tr) {
        this.handleAssertion(tr);
    }

    private int index = 0;

    private void handleAssertion(ITestResult tr){
        if(!Assertion.flag){
            Throwable throwable = tr.getThrowable();
            if(throwable==null){
                throwable = new Throwable();
            }
            StackTraceElement[] traces = throwable.getStackTrace();
            StackTraceElement[] alltrace = new StackTraceElement[0];
            for (Error e : Assertion.errors) {
                StackTraceElement[] errorTraces = e.getStackTrace();
                StackTraceElement[] et = this.getKeyStackTrace(tr, errorTraces);
                StackTraceElement[] message = new StackTraceElement[]{new StackTraceElement("message : "+e.getMessage()+" in method : ", tr.getMethod().getMethodName(), tr.getTestClass().getRealClass().getSimpleName(), index)};
                index = 0;
                alltrace = this.merge(alltrace, message);
                alltrace = this.merge(alltrace, et);
            }
            if(traces!=null){
                traces = this.getKeyStackTrace(tr, traces);
                alltrace = this.merge(alltrace, traces);
            }
            throwable.setStackTrace(alltrace);
            tr.setThrowable(throwable);
            Assertion.flag = true;
            Assertion.errors.clear();
            tr.setStatus(ITestResult.FAILURE);
        }
    }

    private StackTraceElement[] getKeyStackTrace(ITestResult tr, StackTraceElement[] stackTraceElements){
        List<StackTraceElement> ets = new ArrayList<StackTraceElement>();
        for (StackTraceElement stackTraceElement : stackTraceElements) {
            if(stackTraceElement.getClassName().equals(tr.getTestClass().getName())){
                ets.add(stackTraceElement);
                index = stackTraceElement.getLineNumber();
            }
        }
        StackTraceElement[] et = new StackTraceElement[ets.size()];
        for (int i = 0; i < et.length; i++) {
            et[i] = ets.get(i);
        }
        return et;
    }

    private StackTraceElement[] merge(StackTraceElement[] traces1, StackTraceElement[] traces2){
        StackTraceElement[] ste = new StackTraceElement[traces1.length+traces2.length];
        for (int i = 0; i < traces1.length; i++) {
            ste[i] = traces1[i];
        }
        for (int i = 0; i < traces2.length; i++) {
            ste[traces1.length+i] = traces2[i];
        }
        return ste;
    }
}

测试类:

import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

@Listeners({com.ciphergateway.asserts.AssertionListener.class})
public class roleTest {
    @Test(description = "testAssert0")
    public void testAssert0(){
        Assertion.verifyEquals(2, 3, "比较两个数是否相等:");
        Assertion.verifyEquals(1, 2, "比较两个数是否相等:");
    }
    @Test(description = "add_role")
    @Step("addRole")
    public void a1_addRole() throws Exception {
        //code,expectData为参数
        Assertion.verifyEquals(code, expectData,"新增角色接口");
    }
}

测试结果:

当然也可以采用在testng.xml文件中配置监听

 

 但我这遇到问题,该监听器如果配置到testng.xml有时监听不到,需要直接配置到类里。(因testng.xml配此监听器有时能够监听到报出异常,有时直接过,变成PASS,容易误导)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java Selenium TestNG中,可以封装断言方法来验证测试结果。根据提供的引用内容,可以看到有三个封装的断言方法。 第一个引用\[1\]中的方法是assertElementTextContains,它用于验证指定元素的文本是否包含预期的内容。该方法首先获取元素的文本,然后使用assertContains方法进行断言。 第二个引用\[2\]中的方法是assertNotEquals,它用于验证两个对象是否不相等。该方法首先使用assertFalse方法判断实际值和预期值是否相等,如果相等则抛出AssertionError异常。 第三个引用\[2\]中的方法是assertElementVisible和assertElementNotVisible,它们分别用于验证元素是否可见和不可见。这两个方法使用waitElementIsVisible方法等待元素的可见性,并使用assertTrue和assertFalse方法进行断言。 因此,可以根据需要选择合适的断言方法来验证测试结果。 #### 引用[.reference_title] - *1* *2* [Java版UI自动化测试的断言方法/selenium Testng方法封装断言](https://blog.csdn.net/Franciz777/article/details/114063739)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [JAVA+selenium+testng 断言封装及调用](https://blog.csdn.net/weixin_44242153/article/details/117709979)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宁宁可可

您的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值