zoukankan      html  css  js  c++  java
  • 解决testng断言跳出问题

    ****TestNG提供了很多断言方法 大部分断言失败后会报exception而终止进程,在实际的测试中这样的做法是不可行的

    如何做到断言失败不中断执行

    创建监听器

    package testng;
    
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.CopyOnWriteArrayList;
    
    import org.testng.ITestResult;
    import org.testng.TestListenerAdapter;
     
    public class AssertListener 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];   
                CopyOnWriteArrayList<Error> currList = new CopyOnWriteArrayList<Error>(Assertion.errors);
                for (Error e : currList) {
                    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;
        }
    }
    

    重写断言方法

    package testng;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.CopyOnWriteArrayList;
    
    import org.testng.Assert;
     
    public class Assertion {
         
        public static boolean flag = true;
         
        public static List<Error> errors = new ArrayList<Error>();
        
         
        public static void verifyEquals(Object actual, Object expected){
            try{
                Assert.assertEquals(actual, expected);
            }catch(Error e){
                errors.add(e);
                flag = false;
            }
        }
         
        public static void verifyEquals(Object actual, Object expected, String message){
            try{
                Assert.assertEquals(actual, expected, message);
            }catch(Error e){
                errors.add(e);
                flag = false;
            }
        }
        
        public static void verifyNulls(boolean actual, boolean expected){
        	try{
        		Assert.assertEquals(actual, expected);
        	}catch(Error e){
        		errors.add(e);
                flag = false;
        	}
        }
     
        public static void verifyNulls(boolean actual, boolean expected , String msg){
        	try{
        		Assert.assertEquals(actual, expected, msg);
        	}catch(Error e){
        		errors.add(e);
                flag = false;
        	}
        }
        
        public static void assertTrue(boolean condition, String message) {
        	try{
        		Assert.assertTrue(condition, message);
        	}catch(Error e){
        		errors.add(e);
                flag = false;
        	}
          }
        
        //其他需要的断言方法都可以这样写进来.....
    }
    

    执行测试

    package testng;
    
    import static org.testng.Assert.assertTrue;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    import org.apache.commons.beanutils.BeanUtils;
    import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.testng.annotations.BeforeClass;
    import org.testng.annotations.DataProvider;
    import org.testng.annotations.Listeners;
    import org.testng.annotations.Test;
    
    import com.github.checkpoint.CheckPointUtils;
    import com.github.checkpoint.JsonCheckResult;
    import com.github.crab2died.ExcelUtils;
    import com.github.crab2died.exceptions.Excel4JException;
    
    import apitest.HttpClientUtils;
    import apitest.MapUtils;
    import apitest.ParamBean;
    import apitest.ParamUtils;
    import apitest.TestCase;
    import apitest.TestResult;
    import apitest.db.DbCheckUtils;
    import apitest.thread.ApiThreadTest;
    import io.qameta.allure.Epic;
    import io.qameta.allure.Severity;
    import io.qameta.allure.SeverityLevel;
    import io.qameta.allure.Step;
    import io.qameta.allure.Story;
    
    @Listeners(AssertListener.class)
    public class ApiTestNg {
    
    	String path = System.getProperty("user.dir") + File.separator + "data" + File.separator + "apitest11.xlsx";
    	private static final Logger logger = LoggerFactory.getLogger(ApiTestNg.class);
    
    	@BeforeClass
    	public void beforeClass() {
    		HttpClientUtils.openProxy = false;
    	}
    
    //	@AfterClass
    //	public void afterClass() {
    //		try {
    //			String path_result = System.getProperty("user.dir") + File.separator + "result" + File.separator;
    //			File result_file = new File(path_result);
    //			if (!result_file.exists()) {
    //				result_file.mkdirs();
    //			}
    //			String resultFile = path_result + "result_" + ApiThreadTest.getDate() + ".xlsx";
    //			ExcelUtils.getInstance().exportObjects2Excel(ApiThreadTest.listResult, TestResult.class, resultFile);
    //			System.out.println("测试发邮件");
    //
    //			EmailUtils.sendEmailsWithAttachments("测试结果", "请查收测试结果", resultFile);
    //		} catch (Exception e) {
    //			e.printStackTrace();
    //			System.out.println("结果处理");
    //			logger.error("error {} {}", e, "测试");
    //		}
    //	}
    
    	@Epic("并行单元测试")//测试集
        @Story("单元测试")//测试case
        @Step("获取城市编码")//测试步骤
        @Severity(SeverityLevel.CRITICAL)//设置case的优先级
    	@Test(dataProvider = "excelobject",threadPoolSize = 10)
    	public void testcase(ParamBean paramBean) {
    		System.out.println(Thread.currentThread().getName() + " " + paramBean);
    		List<TestResult> runTestResults = new ArrayList<TestResult>();
    		try {
    			// addmap
    			ParamUtils.addFromObject(paramBean);
    			// 读原始数据(上一组数据被改掉了)
    			List<TestCase> list = ExcelUtils.getInstance().readExcel2Objects(ApiThreadTest.path, TestCase.class);
    			for (TestCase testCase : list) {
    				if (testCase.isRun()) {
    					System.out.println("替换前--" + testCase);
    					// 参数替换
    					ApiThreadTest.params_replace(testCase);
    					// 函数支持
    					ApiThreadTest.funtion_replace(testCase);
    					System.out.println("替换后--" + testCase);
    					// 替换变量
    					String result = "";
    					if ("get".equals(testCase.getType())) {
    						result = HttpClientUtils.doGet(testCase.getUrl());
    					} else if ("post".equals(testCase.getType())) {
    						result = HttpClientUtils.doPost(testCase.getUrl(),
    								MapUtils.covertStringToMap1(testCase.getParams()));
    					} else if ("postjson".equals(testCase.getType())) {
    						result = HttpClientUtils.doPostJson(testCase.getUrl(), testCase.getParams(),
    								MapUtils.covertStringToMap2(testCase.getHeaders()));
    					}
    
    					String testReulst_str = CheckPointUtils.check(result, testCase.getCheckpoint()).getMsg();
    					
    					JsonCheckResult jsonCheck = CheckPointUtils.check(result, testCase.getCheckpoint());
    					
    					ParamUtils.addFromJson(result, testCase.getCorrelation());
    
    					// 数据检查
    					String dbcheckResult = DbCheckUtils.check(testCase.getDbcheckpoint());
    
    					// 结果处理
    					TestResult testResult = new TestResult();
    					testResult.setTestResult(testReulst_str);
    					testResult.setDbtestResult(dbcheckResult);
    					BeanUtils.copyProperties(testResult, testCase);
    					runTestResults.add(testResult);
    					//assertTrue(jsonCheck.isResult(),jsonCheck.getMsg());
    					Assertion.assertTrue(jsonCheck.isResult(),jsonCheck.getMsg());
    				}
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}finally {
    			System.out.println(" 当前结果----------------");
    			ParamUtils.clear();
    			ApiThreadTest.listResult.addAll(runTestResults);
    			runTestResults.clear();
    		}
    	}
    
    	@DataProvider(name = "excel", parallel = true)
    	public Iterator<Object[]> excelProvider() {
    		List<Object[]> dataProvider = new ArrayList<Object[]>();
    		// 参数数据
    		try {
    			List<ParamBean> params_list = ExcelUtils.getInstance().readExcel2Objects(path, ParamBean.class, 1);
    			for (ParamBean paramBean : params_list) {
    				dataProvider.add(new Object[] { paramBean });
    			}
    		} catch (InvalidFormatException | Excel4JException | IOException e) {
    			e.printStackTrace();
    		}
    		return dataProvider.iterator();
    	}
    	
    	@DataProvider(name = "excelobject", parallel = true)
    	public Object[][] excelProviderObject() {
    		//List<Object[]> dataProvider = new ArrayList<Object[]>();
    		// 参数数据
    		 Object[][] objects = null;
    		try {
    			List<ParamBean> params_list = ExcelUtils.getInstance().readExcel2Objects(path, ParamBean.class, 1);
    			objects=new Object[params_list.size()][1];
    			for (int i = 0; i < params_list.size(); i++) {
    				objects[i][0]=params_list.get(i);
    			}
    		} catch (InvalidFormatException | Excel4JException | IOException e) {
    			e.printStackTrace();
    		}
    		return objects;
    	}
    
    }
    

    作者:我是刘先生
    地址:https://www.cnblogs.com/cekaigongchengshi/
    文章转载请标明出处,如果,您认为阅读这篇博客让您有些收获,不妨点击一下推荐按钮,据说喜欢分享的,后来都成了大神

    欢迎扫码关注微信公众号
  • 相关阅读:
    利用clear清除浮动的一些问题
    配置SpringBoot方便的切换jar和war
    java并发实战:连接池实现
    canvas绘制圆角头像
    对象的合并及拷贝
    JS数组去重
    浏览器端用JS实现创建和下载图片
    超过固定宽度(或行数)显示...(或省略)
    ssh实现免密登录
    Mac 日常使用问题收集
  • 原文地址:https://www.cnblogs.com/cekaigongchengshi/p/14102542.html
Copyright © 2011-2022 走看看