在实习期间,我必须使用 TestNG 和 selenium 来测试网络应用程序。但我有一个问题,有时 selenium 或浏览器由于某种随机原因无法工作,因此工作测试被标记为“失败”。为避免这种情况,我可以使用注释 @Test(invocationCount = 4, successPercentage = 25)
,然后如果测试成功一次,则测试标记为“成功”,这很好,但问题是是这个解决方案将测试时间乘以4,这不是很有效。
我可以做些什么来减少测试时间,就是写一些规则“如果测试失败,重新运行这个测试(并且只有在测试失败的情况下),如果第二次、第三次或第四次成功时间,然后将此测试标记为“成功”“这样我就可以避免这些随机错误。但是我还没有找到如何写这个规则,我看到我们可以添加一个监听器,所以我们有一个名为“onTestFailure
”的方法,所以我可以在测试失败时做一些事情但我不知道不知道如何重新运行测试。
我还找到了 testng-failed.xml ,其中保存了所有失败的测试,因此我们可以运行此 xml 文件以重新运行这些测试,但这会清除前一次运行的报告,但我只想要失败的如果第二次运行成功,测试将标记为“成功”。 (我已经将testNG/selenium集成到Jenkins,所以我有一个包含所有测试的图表,所以这种方法不是很适应,但是这种方法不会将测试时间乘以4,这就是我想要的)
因此,如果您知道如何做到这一点,那就太好了。
最佳答案
您可以结合使用 IRetryAnalyzer、监听器和自定义报告器来执行您要查找的操作。
IRetryAnalyzer:
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;
}
}
重试监听器:
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;
}
但是,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;
}
完成所有这些后,您可以使用 .addListener 添加报告器并在 @Test 注释中指定 retryAnalyzer。
关于java - 如何优化testng和selenium测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7803691/