use*_*499 5 java testing testng selenium jenkins
对于我的实习,我必须使用TestNG和selenium来测试网络应用程序.但我有一个问题,有时候selenium或浏览器因某些随机原因无法正常工作,因此工作测试被标记为"失败".为了避免这种情况,我可以使用注释@Test(invocationCount = 4, successPercentage = 25)
,然后如果测试成功一次,测试被标记为"成功",这很好,但问题是这个解决方案将测试时间乘以4,这不是很有效.
我可以做些什么来减少测试时间,是写一些规则"如果测试失败,重新运行此测试(并且只有在测试失败时),并且如果它在第二次,第三次或第四次工作,那么将此测试标记为"成功""因此我可以避免这些随机错误.但我还没有找到如何编写这个规则,我看到我们可以添加一个监听器,所以我们有一个名为" onTestFailure
" 的方法,所以当测试失败但我不知道如何重新运行时我可以做一些事情考试.
我还找到了testng-failed.xml,其中保存了所有失败的测试,因此我们可以运行这个xml文件来重新运行这些测试,但这将删除上一次运行的报告,但我只想要标记失败的测试如果第二次运行成功,则"成功".(我已将testNG/selenium集成到Jenkins中,所以我有一个包含所有测试的图表,所以这个方法不是很适应,但这种方法不会将测试时间乘以4,这就是我想要的)
所以如果你有任何关于如何做到这一点的线索,那将是非常好的.
小智 4
您可以使用 IRetryAnalyzer、侦听器和自定义报告器的组合来完成您想要的操作。
IRetry分析器:
public class RetryAnalyzer implements IRetryAnalyzer {
private int count = 0;
// this number is actually twice the number
// of retry attempts will allow due to the retry
// method being called twice for each retry
private int maxCount = 6;
protected Logger log;
private static Logger testbaseLog;
static {
PropertyConfigurator.configure("test-config/log4j.properties");
testbaseLog = Logger.getLogger("testbase.testng");
}
public RetryAnalyzer()
{
testbaseLog.trace( " ModeledRetryAnalyzer constructor " + this.getClass().getName() );
log = Logger.getLogger("transcript.test");
}
@Override
public boolean retry(ITestResult result) {
testbaseLog.trace("running retry logic for '"
+ result.getName()
+ "' on class " + this.getClass().getName() );
if(count < maxCount) {
count++;
return true;
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
重试监听器:
public class RetryTestListener extends TestListenerAdapter {
private int count = 0;
private int maxCount = 3;
@Override
public void onTestFailure(ITestResult result) {
Logger log = Logger.getLogger("transcript.test");
Reporter.setCurrentTestResult(result);
if(result.getMethod().getRetryAnalyzer().retry(result)) {
count++;
result.setStatus(ITestResult.SKIP);
log.warn("Error in " + result.getName() + " with status "
+ result.getStatus()+ " Retrying " + count + " of 3 times");
log.info("Setting test run attempt status to Skipped");
}
else
{
count = 0;
log.error("Retry limit exceeded for " + result.getName());
}
Reporter.setCurrentTestResult(null);
}
@Override
public void onTestSuccess(ITestResult result)
{
count = 0;
}
Run Code Online (Sandbox Code Playgroud)
然而,TestNG 中似乎存在一个错误,实际上导致一些测试结果被报告为跳过和失败。为了防止这种情况,我建议您重写您想要使用的任何 Reporter 并包含如下方法:
private IResultMap removeIncorrectlyFailedTests(ITestContext test)
{
List<ITestNGMethod> failsToRemove = new ArrayList<ITestNGMethod>();
IResultMap returnValue = test.getFailedTests();
for(ITestResult result : test.getFailedTests().getAllResults())
{
long failedResultTime = result.getEndMillis();
for(ITestResult resultToCheck : test.getSkippedTests().getAllResults())
{
if(failedResultTime == resultToCheck.getEndMillis())
{
failsToRemove.add(resultToCheck.getMethod());
break;
}
}
for(ITestResult resultToCheck : test.getPassedTests().getAllResults())
{
if(failedResultTime == resultToCheck.getEndMillis())
{
failsToRemove.add(resultToCheck.getMethod());
break;
}
}
}
for(ITestNGMethod method : failsToRemove)
{
returnValue.removeResult(method);
}
return returnValue;
}
Run Code Online (Sandbox Code Playgroud)
完成所有这些后,您可以使用 .addListener 添加报告器,并在 @Test 注释中指定 retryAnalyzer。
归档时间: |
|
查看次数: |
8246 次 |
最近记录: |