注意:由于无法从外部访问正在使用的服务器,因此我无法粘贴确切的框架和代码。因此,我将尝试用简单的单词和例子来解释我的问题。
概述-我创建了一个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集成时意识到了这个问题(否则一切都很好)。
答案 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构建状态将显示为不稳定。