关于使用testng的retry问题

本文详细介绍了如何在TestNG中实现测试用例的重试机制,通过自定义RetryAnalyzer和TestListenerAdapter接口,确保失败的测试能够被重新执行指定次数,同时提供了完整的代码示例。

总体是利用TestNG里面的IRetryAnalyzer、TestListenerAdapter接口来实现相关问题

1、定义一个自己的retryanalyzer

import org.testng.ITestResult;
import org.testng.util.RetryAnalyzerCount;

//这里集成自抽象类RetryAnalyzerCount,该抽象类实现了IRetryAnalyzer
public class TestRetryAnalyzer extends RetryAnalyzerCount{
public TestRetryAnalyzer(){         
        setCount(1); 

@Override 
public boolean retryMethod(ITestResult arg0) { 
        // TODO Auto-generated method stub 
        return true; 
}
}

2、定义自己的监听器,集成自TestListenerAdapter

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


import org.testng.IResultMap;
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.TestListenerAdapter;
import org.testng.ITestNGMethod;
import org.testng.collections.Lists;
import org.testng.collections.Objects;




public class RetryTestListener extends TestListenerAdapter {
private List<ITestNGMethod> m_allTestMethods =
     Collections.synchronizedList(Lists.<ITestNGMethod>newArrayList());
private List<ITestResult> m_passedTests = Collections.synchronizedList(Lists.<ITestResult>newArrayList());
private List<ITestResult> m_failedTests = Collections.synchronizedList(Lists.<ITestResult>newArrayList());
private List<ITestResult> m_skippedTests = Collections.synchronizedList(Lists.<ITestResult>newArrayList());
private List<ITestResult> m_failedButWSPerTests = Collections.synchronizedList(Lists.<ITestResult>newArrayList());
private List<ITestContext> m_testContexts= Collections.synchronizedList(new ArrayList<ITestContext>());
private List<ITestResult> m_failedConfs= Collections.synchronizedList(Lists.<ITestResult>newArrayList());
private List<ITestResult> m_skippedConfs= Collections.synchronizedList(Lists.<ITestResult>newArrayList());
private List<ITestResult> m_passedConfs= Collections.synchronizedList(Lists.<ITestResult>newArrayList());


public synchronized void onTestFailure(ITestResult arg0) {
m_allTestMethods.add(arg0.getMethod());
m_failedTests.add(arg0);
}


@Override
public void onFinish(ITestContext context) {

for(int i=0;i<context.getAllTestMethods().length;i++){
System.out.println("~~~~~~~~~~"+context.getAllTestMethods()[i].getCurrentInvocationCount());
if(context.getAllTestMethods()[i].getCurrentInvocationCount()==2){
System.out.println("~~~~~~~~~~~~~~~~~"+context.getAllTestMethods()[i].getParameterInvocationCount());
System.out.println(context.getAllTestMethods()[i].ignoreMissingDependencies());
if (context.getFailedTests().getResults(context.getAllTestMethods()[i]).size() == 2 || context.getPassedTests().getResults(context.getAllTestMethods()[i]).size() == 1){

context.getFailedTests().removeResult(context.getAllTestMethods()[i]);

}
}
}
}

    ...
}


3、在测试申明中说明使用retry

@Test(retryAnalyzer = TestRetryAnalyzer.class)


4、加入一个我们自己的监听器

public class RetryTest {
public static void main(String args[]){
TestNG tng = new TestNG();
RetryTestListener rtl = new RetryTestListener();
XmlSuite xs = new XmlSuite();
Parser parser = new Parser("./testxml/temp.xml");
List<XmlSuite> suites = new ArrayList<XmlSuite>();
try {
suites = parser.parseToList();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
tng.setXmlSuites(suites);
tng.addListener(rtl);
tng.run();
} }

转载于:https://www.cnblogs.com/shenguo/p/3958225.html

<think>首先,用户的问题是:“我想了解如何使用TestNG实现测试用例请问TestNG实现测试用例的方法和示例”。他们提供了系统级指令,其中包括引用一些关于TestNG的文章。指令说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。”查看上下文,用户上一次的问题是关于TestNG的实现测试用例的方法和示例。用户提供了一些引用:-引用[1]:关于TestNG组织测试用例的最佳实践。-引用[2]:关于TestNG中恢复失败的测试用例。-引用[3]:关于TestNG执行测试用例的方法。-引用[4]:关于TestNG测试用例报告的生成。系统指令说:“请尽可能多的参考用户上一次的问题和你的回答。”用户上一次的问题就是当前的,所以没有历史回答。因此,我需要专注于当前问题。我的回答必须遵循系统级指令:1.行内数学表达式用$...$格式,但由于这是一个关于测试的话题,可能没有太多数学内容。不过,如果有变量等,比如在代码中,确保正确处理。但主要应该是文本和代码。2.独立公式用$$...$$,但可能不适用。3.LaTeX语法正确。4.使用中文回答。用户的问题是中文的,所以我必须用中文回复。5.生成相关问题。在回答结束时,需要添加相关问题。6.引用的末尾添加引用标识,例如[^1]。用户提到“参考站内引用”,所以我需要整合这些引用到回答中,但“仅供参考”,所以我不能完全依赖它们。用户的问题是“如何使用TestNG实现测试用例”,所以我应专注于解释方法和提供示例。关键点:-什么是TestNG?它是一个Java测试框架,用于单元测试和集成测试。-如何实现测试用例:涉及到编写测试方法、配置测试类、使用注解、组织测试套件等。从引用中提取相关点:-引用[1]:关于组织测试用例的最佳实践,包括使用testng.xml。-引用[2]:关于恢复失败测试用例。-引用[3]:关于执行顺序控制。-引用[4]:关于报告生成。我应该整合这些内容到我的回答中,以提供全面的指南。回答结构:-先介绍TestNG的基本概念。-解释如何编写测试用例:使用Java类和方法,添加注解如@Test。-提供代码示例:创建一个简单的测试类和测试方法。-讨论配置:使用testng.xml文件来组织测试套件。-引用相关知识:使用引用标识来指出来自提供的参考。-最后,生成相关问题使用中文回答。步骤:1.**引言**:简要解释TestNG和实现测试用例的重要性。2.**方法**:描述步骤。-创建测试类。-编写测试方法,使用@Test注解。-配置测试套件,使用testng.xml。3.**示例**:提供代码块显示一个完整的例子。-使用代码块格式,如系统指令示例中的Python代码。4.**相关主题**:整合引用内容,添加引用标识。-例如,讨论执行顺序、失败重试、报告生成。5.**结尾**:生成相关问题。确保LaTeX正确:如果有变量如@Test,这不是数学,但行内保持原样。如果有数学内容,用$...$,但可能不需要。在生成问题中,参考系统指令的示例,结束时有“§§相关问题§§”部分。最终格式:-用中文。-结构清晰。-添加引用如[^1]。相关问题示例(像快速排序的例子):1.如何优化TestNG测试套件的组织?2.TestNG中如何设置测试用例的执行顺序?3.如何分析TestNG测试报告?</think> 基于您的问题,我将详细解释如何使用TestNG框架实现测试用例,包括核心方法、步骤和实际代码示例。TestNG是一个强大的Java测试框架,广泛用于单元测试、功能测试和自动化测试,它支持灵活的测试用例编写、执行和报告生成。我会结合您提供的参考引用内容(标注为[^1], [^2], [^3], [^4]),确保回答真实可靠。以下内容使用中文编写,结构分为几个步骤,帮助您逐步理解和实践。 ### 1. **TestNG的基本概念** TestNG使用基于注解(annotation)的方式定义测试用例,大大简化了测试开发过程。核心元素包括: - **测试类 (Test Class)**:一个普通的Java类,包含多个测试方法。 - **测试方法 (Test Method)**:使用 `@Test` 注解标记的方法,代表单个测试用例。 - **配置方法 (Configuration Methods)**:使用注解如 `@BeforeMethod`, `@AfterMethod`, `@BeforeTest` 等,用于设置测试环境或清理资源。 - **测试套件 (Test Suite)**:通过 `testng.xml` 文件组织多个测试类或测试组,控制执行顺序和行为[^3]。 ### 2. **实现测试用例的核心方法** 使用TestNG实现测试用例主要包括以下步骤: #### **步骤 1: 创建测试类** - 在Java项目中,创建一个类文件,并添加必要的依赖(如果使用Maven,需在 `pom.xml` 中包含TestNG依赖)。 - **示例类定义**:下面是一个简单的测试类示例,测试字符串相关功能。 ```java import org.testng.annotations.*; import static org.testng.Assert.*; // 定义测试类 public class StringUtilsTest { // 配置方法: 在所有测试方法前执行,用于初始设置 @BeforeMethod public void setup() { System.out.println("初始化测试环境..."); } // 清理方法: 在所有测试方法后执行,用于资源释放 @AfterMethod public void teardown() { System.out.println("清理测试环境..."); } } ``` - 这里使用 `@BeforeMethod` 和 `@AfterMethod` 进行测试生命周期管理[^4]。 #### **步骤 2: 编写测试方法** - 每个测试方法都用 `@Test` 注解标记。TestNG支持多种断言(如 `assertEquals`, `assertTrue`)来验证结果。 - **示例测试方法**:添加几个测试方法,检查字符串反转和长度计算。 ```java public class StringUtilsTest { @Test public void testReverseString() { String input = "hello"; String expected = "olleh"; String actual = StringUtils.reverse(input); // 假设StringUtils是自定义类 assertEquals(actual, expected, "字符串反转功能失败!"); System.out.println("测试字符串反转通过..."); } @Test public void testStringLength() { String input = "test"; int expectedLength = 4; int actualLength = StringUtils.getLength(input); assertEquals(actualLength, expectedLength, "字符串长度计算失败!"); System.out.println("测试字符串长度通过..."); } // 处理失败的测试用例: 使用retryAnalyzer自动重试 @Test(retryAnalyzer = RetryAnalyzer.class) // 参见引用[^2]的恢复失败功能 public void testPotentialFailure() { assertTrue(false, "模拟一个失败用例!"); } } ``` - **关键点**: - 使用 `@Test` 定义测试逻辑。 - 添加 `retryAnalyzer` 属性可以自动重试失败用例,帮助在失败时快速恢复(基于引用[^2])。 - 测试方法通常命名为 `test*` 以表示其用途。 #### **步骤 3: 组织测试套件 (Test Suite)** - 创建 `testng.xml` 文件来配置执行顺序和参数。这是TestNG的强大功能之一,允许您管理多个测试类或测试组。 - **示例 testng.xml**: ```xml <!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"> <suite name="StringUtilsTestSuite"> <test name="BasicTests" preserve-order="true"> <!-- preserve-order控制执行顺序[^3] --> <classes> <class name="StringUtilsTest" /> </classes> </test> </suite> ``` - **解释**: - `preserve-order="true"` 确保测试方法按声明顺序执行。 - 您可以在 `<classes>` 块中添加多个测试类,支持并行执行(如引用[^3]所示)。 #### **步骤 4: 运行测试并生成报告** - 使用IDE(如IntelliJ IDEA)或构建工具(如Maven)运行测试。执行后,TestNG会自动生成报告。 - **默认报告位置**:在 `test-output` 文件夹中生成 `index.html` 报告,提供详细的执行结果、失败统计和分组信息(参考引用[^4])。 - **报告内容**:包括每个测试方法的通过/失败状态、时间统计和错误日志。 ### 3. **最佳实践和高级功能** - **组织测试用例**:使用 `testng.xml` 实现模块化测试套件,避免“硬编码”测试顺序。例如,将相关测试类分组到不同 `<test>` 标签下[^1]。 - **失败恢复**:通过实现 `retryAnalyzer` 接口(如引用[^2]),可以在测试失败时自动重试最多5次: ```java import org.testng.IRetryAnalyzer; import org.testng.ITestResult; public class RetryAnalyzer implements IRetryAnalyzer { private int count = 0; private static final int MAX_RETRY = 5; @Override public boolean retry(ITestResult result) { if (count < MAX_RETRY) { count++; return true; // 重试用例 } return false; } } ``` - **执行优化**:在 `testng.xml` 中使用 `<parallel>` 参数实现并行测试执行,提高效率[^3]。 - **报告分析**:参考 `index.html` 报告,分析测试覆盖率或排查失败原因[^4]。 ### 4. **总体工作流总结** 1. 创建测试类和方法:用 `@Test` 注解。 2. 配置测试套件:编辑 `testng.xml`。 3. 运行测试:通过命令行(如 `mvn test`)或IDE。 4. 检查报告:查看 `test-output/index.html`。 通过以上方法,您能高效地实现自动化测试用例。TestNG的灵活性和丰富的注解系统使其非常适用于大型项目[^1][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值