文章目录

  • 1开启retry
    • 1.1 命令模式启动-python
    • 1.2 界面开启
  • 2 创建监听

1开启retry

1.1 命令模式启动-python

python中运行命令,retry次数为2
重点看ui_cmd,Katalon的命令行模式,最终都是为了运行Katalon的该cmd,-retry=2

import subprocess
import osos.chdir(katalon_path)
# TODO : subprocess支持cmd参数用来指定当前运行的目录,可以不需要用os.chdir来切换。
ui_cmd ='katalon -noSplash -runMode=console -projectPath="{proj_path}" -testSuitePath="{test_suite}" -executionProfile="{test_profile}" -browserType="Chrome" -retry=2 -retryFailedTestCases=true -reportFolder="{report_path}" --reportFileName="uiauto" -apikey="851eeef5-xxxx-xxxx-xxxx-xxxxxxxxxxx"'.format(proj_path=proj_path,test_suite = test_suite,test_profile = test_profile,report_path = test_report_path)
print(ui_cmd, flush=True)#开始运行测试subprocess.call(ui_cmd, shell=True)

1.2 界面开启

同样也是设置2次重跑,界面模式中有failed Test Cases only,仅重跑失败用例;

2 创建监听

CICD的时候不可能用界面模式,只能用cmd模式,那就不能做到Passed用例不重跑,如何实现呢?
用PassedCaseinSuite.txt记录通过用例,测试用例运行时,查看该txt文件,如果该用例是Passed,则跳过运行;

import static com.kms.katalon.core.checkpoint.CheckpointFactory.findCheckpoint
import static com.kms.katalon.core.testcase.TestCaseFactory.findTestCase
import static com.kms.katalon.core.testdata.TestDataFactory.findTestData
import static com.kms.katalon.core.testobject.ObjectRepository.findTestObjectimport java.lang.reflect.Arrayimport com.kms.katalon.core.checkpoint.Checkpoint as Checkpoint
import com.kms.katalon.core.model.FailureHandling as FailureHandling
import com.kms.katalon.core.testcase.TestCase as TestCase
import com.kms.katalon.core.testdata.TestData as TestData
import com.kms.katalon.core.testobject.TestObject as TestObjectimport com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords as WS
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
import com.kms.katalon.core.mobile.keyword.MobileBuiltInKeywords as Mobileimport internal.GlobalVariable as GlobalVariableimport com.kms.katalon.core.annotation.BeforeTestCase
import com.kms.katalon.core.annotation.BeforeTestSuite
import com.kms.katalon.core.annotation.AfterTestCase
import com.kms.katalon.core.annotation.AfterTestSuite
import com.kms.katalon.core.context.TestCaseContext
import com.kms.katalon.core.context.TestSuiteContext
import com.kms.katalon.core.configuration.RunConfigurationclass TestListener {static String passedCaseinSuitePath = RunConfiguration.getProjectDir() + '/';static String passedCaseinSuiteFile = 'PassedCaseinSuite.txt';static String passedCaseTXTFilePath = passedCaseinSuitePath + passedCaseinSuiteFilepublic static boolean deleteTXTFile() {boolean flag = falseString sPath = passedCaseinSuitePath + passedCaseinSuiteFileSystem.out.println('PassedCaseinSuiteFilePath:  ' + passedCaseTXTFilePath)File file = new File(passedCaseinSuitePath, passedCaseinSuiteFile)if (file.isFile() && file.exists()) {file.delete()System.out.println('Successd to delete the file:' + passedCaseTXTFilePath)flag = true}return flag}public static String readTXT() {File file = new File(passedCaseTXTFilePath);if(file.isFile() && file.exists()){try {FileInputStream fileInputStream = new FileInputStream(file);InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);StringBuffer sb = new StringBuffer();String text = null;while((text = bufferedReader.readLine()) != null){sb.append(text);}return sb.toString();} catch (Exception e) {e.printStackTrace();}}return null;}/**使用FileOutputStream来写入txt文件* @param txtPath txt文件路径* @param content 需要写入的文本*/public static void writeTXT(String txtPath, String content){FileOutputStream fileOutputStream = null;File file = new File(txtPath);try {if(!file.exists()){//判断文件是否存在,如果不存在就新建一个txtfile.createNewFile();}fileOutputStream = new FileOutputStream(file, true);fileOutputStream.write(content.getBytes());fileOutputStream.flush();fileOutputStream.close();} catch (Exception e) {e.printStackTrace();}}public static void writetoTXT(String content){writeTXT(passedCaseTXTFilePath, content)}public String getMapToString(Map<String,String> map){Set<String> keySet = map.keySet();//将set集合转换为数组String[] keyArray = keySet.toArray(new String[keySet.size()]);//给数组排序(升序)Arrays.sort(keyArray);//因为String拼接效率会很低的,所以转用StringBuilder。博主会在这篇博文发后不久,会更新一篇String与StringBuilder开发时的抉择的博文。StringBuilder sb = new StringBuilder();for (int i = 0; i < keyArray.length; i++) {// 参数值为空,则不参与签名 这个方法trim()是去空格if (map.get(keyArray[i]).toString().trim().length() > 0) {sb.append(keyArray[i]).append("=").append(map.get(keyArray[i]).toString().trim());}if(i != keyArray.length-1){sb.append("&");}}return sb.toString();}def getPassedCaseListFromFile() {String fileContent = readTXT();if (fileContent == null) {return [];}else {String[] passedCase = fileContent.split('@@@@@');return Arrays.asList(passedCase);}}@BeforeTestSuitedef PassedCaseTXTbeforeTestSuite(){// deleteTXTFile();File file = new File(passedCaseinSuitePath, passedCaseinSuiteFile);//判断文件是否存在,如果不存在就新建一个txt文件if(!file.exists()){            file.createNewFile();}}/**  @AfterTestSuitedef PassedCaseTXTafterTestSuite(){deleteTXTFile();}/*** Executes before every test case starts.* @param testCaseContext related information of the executed test case.*/@BeforeTestCasedef beforeTestcase(TestCaseContext testCaseContext) {String testCaseId = testCaseContext.getTestCaseId();Map<String, Object> vars = testCaseContext.getTestCaseVariables();String svars = getMapToString(vars);String caseWithVars = testCaseId + "&&&&" + svars;List<String> testCasePassed = getPassedCaseListFromFile();if (testCasePassed.contains(caseWithVars)) {testCaseContext.skipThisTestCase();}}/*** Executes after every test case ends.* @param testCaseContext related information of the executed test case.*/@AfterTestCasedef afterTestcase(TestCaseContext testCaseContext) {        File file = new File(passedCaseinSuitePath, passedCaseinSuiteFile)if (file.isFile() && file.exists()) {if (testCaseContext.getTestCaseStatus() == "PASSED") {String testCaseId = testCaseContext.getTestCaseId();Map<String, Object> vars = testCaseContext.getTestCaseVariables();String svars = getMapToString(vars);String caseWithVars = "@@@@@" + testCaseId + "&&&&" + svars;writetoTXT(caseWithVars);}}}
}

【Katalon Studio】失败用例重跑相关推荐

  1. 失败用例重跑机制-python装饰器

    def failrun(n=3):def decorator(func):def wrapper(*args,**kw):for i in range(n):try:r= func(*args,**k ...

  2. testNG-失败用例重跑机制

    下面简单介绍下testNG的失败重跑的实现方法: 1.首先编写一个类,实现IRetryAnalyzer类,重写其中的retry方法. public class TestNGRetry implemen ...

  3. TestNG测试框架之失败测试重跑

    前言 在案例执行过程中,往往需要对失败的案例进行重跑,TestNG亦提供相应的实现方案. 示例 当套件中的测试执行失败时,TestNG都会创建一个名为testng-failed.xml的文件,该XML ...

  4. 测试用例出错重跑--flaky插件

    2019独角兽企业重金招聘Python工程师标准>>> 自动化测试的时候,经常会遇到这样的问题:大部分时候执行测试用例都能pass,只是偶然出现false,而出现false的时候是因 ...

  5. 如何解决testng执行用例失败自动重跑问题

    如何解决testng执行用例失败自动重跑问题 参考文章: (1)如何解决testng执行用例失败自动重跑问题 (2)https://www.cnblogs.com/cheese320/p/847864 ...

  6. pytest_失败用例的重跑机制@pytest.mark.flaky()

    执行失败了的用例可以按照一定频率去跑多次,频率+次数. reruns=2 重跑次数 reruns_delay=2 频率 import pytest import os import allure@py ...

  7. TestNG监听器实现失败自动截图、重跑、自定义html结果文件功能

    本文转载自孔庆云kevin<TestNG监听器实现失败自动截图.重跑.自定义html结果文件功能> 使用Testng框架搭建自动测试框架,经常会需要增加失败自动截图,以及失败重跑功能,下面 ...

  8. python3 unittest框架失败重跑加截图支持python2,python3

    github源码地址下载:https://github.com/GoverSky/HTMLTestRunner_cn.git 解压文件后取出/HTMLTestRunner_cn.py文件丢进C:\Py ...

  9. selenium+python自动化81-html报告优化(饼图+失败重跑+兼容python23)

    优化html报告 为了满足小伙伴的各种变态需求,为了装逼提升逼格,为了让报告更加高大上,测试报告做了以下优化: 测试报告中文显示,优化一些断言失败正文乱码问题 新增错误和失败截图,展示到html报告里 ...

最新文章

  1. 深入理解PHP之OpCode
  2. LightOJ1234 Harmonic Number 调和级数求和
  3. 如何入门Go语言?这个开源项目赶紧收藏!
  4. 滴滴海量离线数据的在线化 — FastLoad
  5. 的内怎么放_燕窝买回来怎么炖?资深窝友告诉你!
  6. 适合Java新手练手的小项目!
  7. 麻省理工18年春软件构造课程阅读02“Java基础”
  8. 惠普打印机P1108驱动无法安装怎么处理?
  9. cad怎么画坐标系箭头_CAD中怎么画箭头啊 cad箭头
  10. jmeter学习:如何使用jmeter自动发帖
  11. 网页制作中的超链接怎么做
  12. 2022-2028年中国幼儿园露天游乐设备行业市场专项调查及投资前景分析报告
  13. Ubantu18.04环境下编译android源码
  14. thrift安装天坑
  15. Microsoft Surface
  16. VTT字幕文件处理(vi + sed + awk)
  17. android 设置打印级别
  18. 【算法】贪心算法:LeetCode 714 买卖股票的最佳时机含手续费 、LeetCode 968 监控二叉树
  19. 【问题】不能加载 MSCOMCTL.OCX(机房问题)
  20. 优麒麟设置root登入

热门文章

  1. 数据库:sql递归查询
  2. I2C电路:一种超级实用的3.3V/5V双向电平转换电路
  3. java依赖dll,java - 使用Java查找/解析DLL的依赖DLL - 堆栈内存溢出
  4. 小马哥---高仿苹果7p 9900-875AQ0-A-6571新版刷机拆机图示与识别图
  5. 废旧光盘手工小制作_废旧光盘再利用大型台灯制作方法
  6. Curator之Recipes之选举
  7. python赋值中文变量_Python变量引用赋值
  8. viewport 视口
  9. linux shell stty,shell stty : command not found
  10. [Qt] isVisible()与isHidden()区别