即使由于脚本中的错误处理(尝试和捕获块)而导致测试失败,Jenkins也会显示“构建成功”

时间:2019-02-06 16:47:18

标签: java maven selenium jenkins testng

注意:由于无法从外部访问正在使用的服务器,因此我无法粘贴确切的框架和代码。因此,我将尝试用简单的单词和例子来解释我的问题。

概述-我创建了一个Selenium自动化框架,其中包括TestNG,Maven(POM.XML),测试数据文件,脚本和一些可重用的功能。

我面临的问题-我使用Jenkins执行脚本。 Jenkins调用POM.XML文件,该文件又调用testng.xml文件(在testng.xml文件中,我提到了要执行的脚本)

比方说,我必须执行登录操作

主脚本

@Test
Public void maintest ()
{

//I use Extent reports for reporting purpose and hence I have created extent 
 //reporting reusable function which is called in the below fashion.

//If Login method returns pass, ExtentReportingFunc passes Pass to its 
 //function and displays Pass for that particular Login step in the report.

ExtentReportingFunc (Login(UserName, Password));
}

可重复使用的功能

Public String Login (String UN, String Pass)
{
//Sendkeys and set UN
driver.findelement (By.id("username")).sendkeys(UN);

//Sendkeys and set Password
driver.findelement (By.id("password")).sendkeys(pass);

//Click Login
driver.findelement (By.id("login")).click ();

//Verifying the message "Welcome User" is displayed after login
   try 
   {
      if (driver.findlement (By.id("welcomemessage")).isdisplayed ();
      {
        return pass;
      }
   } catch (Exception e)
   {
     //If welcome message is not found then return fail to the Reporting function
     return "fail";

     //Below code will be unreachable which is correct as per Java but that is the challenge.
      // I tried several ways to find a work around to return fail as above as 
      // well throw exception but no luck till now.
      // Upon throwing exception in the below way, Jenkins displays build as 
      //failed. If it is not done, though the script has failed, 
      //Jenkins displays "BUILD PASSED"

       throw e;
   }
}

//Extent Reporting function
ExtentReportingFunc (String status)
{
log.report (status);
}

在这里,挑战在于-在catch块中,如果我不提及“ throw e”,Jenkins将不了解发生了故障,并在控制台输出中显示“ BUILD PASSED”。我希望它在Jenkins控制台中显示“ BUILD FAILURE”。我希望它显示“ BUILD FAILED”的原因是-我已将JIRA与Jenkins集成在一起。仅当詹金斯显示“ BUILD FAILED”时,它才会自动将错误记录到JIRA。如果它是“ BUILD PASSED”,尽管完成状态是“不稳定”,则Jenkins的测试结果部分将不会显示任何故障,也不会在JIRA中记录任何错误。

但是,那一次我将无法将return“ fail”传递给主要报告功能,以便它可以在报告中将登录步骤显示为失败。

我了解,按照JAVA,我们可以在catch块中抛出或返回,但不能两者都抛出。还有其他方法可以使这项工作成功吗?

我已经创建了端到端框架,但是后来在我开始与Jenkins集成时意识到了这个问题(否则一切都很好)。

2 个答案:

答案 0 :(得分:1)

为什么不在catch语句中添加断言失败,那样就迫使testng测试在catch语句中时失败

org.testng.Assert.fail(“由于...,我在这里失败,您可以在此处添加您的电子邮件”);

只需在前面添加代码行

return "fail";

并保持其余功能不变

答案 1 :(得分:0)

您可以使用断言来解决此问题,因此只要不满足条件,断言就会失败,因此您的测试用例和詹金斯也将构建状态显示为“不稳定”而不是“通过”。

例如,在上面的示例中,可以使用单行的assert来解决该问题,而不是使用try catch和if条件,也可以为您提供所需的构建状态。

您可以将以上代码替换为:
Assert.assertTrue(driver.findElement(By.id("welcomemessage")).isDisplayed(), "Element is not present on the page");

在这种情况下,如果元素未显示在页面上,则assert会失败,因为它期望的是true值,但是会变为false,并且您的jenkins构建状态将显示为不稳定。