0

在我下面的测试方法中,这个方法有多个断言。我希望它运行,以便如果所有断言都通过,那么它会将状态记录为“通过”(我们正在将 Test Link 与 Selenium 集成)

但是如果任何一个断言失败,那么 testNG 就会产生一个断言错误;在这种情况下,我无法在我的 TMT中将状态更新为“失败”,因为此方法的执行已停止,并且运行已继续执行下一个方法。

请提供一些帮助来解决这个问题。

Test(dataProvider = "User_login")
public void StatusForm_Verification(String uname, String pwd)
        throws InterruptedException {
    NavigateToLogin();
    Dashboard RD = LoginAs_user(uname, pwd);
    Thread.sleep(2000);

        if (Integer.parseInt(ReviewedStatuscount) >= 1) {

            Assert.assertEquals("true",
                    revui.Btn_SaveReview.getAttribute("disabled"));
            Assert.assertEquals("true",
                    revui.Btn_submitReview.getAttribute("disabled"));
            Assert.assertEquals("true",
                    revui.Btn_Needmoreinfo.getAttribute("disabled"));
            status = TestLinkAPIResults.PASSED;

        } else {
            throw new SkipException(
                    "Test Skipping - Reviewed count is Zero");
        }
    }

我的问题是:如果任何一个断言失败,那么我如何在 Testlink 应用程序中将状态更新为失败(即 status = TestLinkAPIResults.FAILED)?

4

4 回答 4

2

您可以使用 @after 并在测试执行后检查状态

@After
public void statusCheck() {
    if (status!=TestLinkAPIResults.PASSED) {
        status = TestLinkAPIResults.FAILED;
    }
}
于 2013-07-23T13:59:24.027 回答
1

如果您想一次测试所有断言,则必须在代码中添加 softAssert,这将在检查所有字段后为您提供最终结果。如果没有发生断言失败(假设名字错误无效),系统将在它之后抛出断言错误。

    SoftAssert softAssert = new SoftAssert();
    String ActualErrorMEssage = firstNameerrorXpath.getText;
    String ActualErrorMEssage2 = secondNameNameerrorXpath.getText;
    softAssert.assertEquals(ActualErrorMEssage,ExpectedErrorMEssage);
    softAssert.assertEquals(ActualErrorMEssage2,ExpectedErrorMEssage);
    softAssert.assertAll();
于 2018-12-14T04:21:48.420 回答
0

我喜欢使用的另一种方法(使用 JUnit,但这个想法也适用于 TestNG)是扩展基本的 PoorlyWrittenUnitTest 类。

下面的类允许单元测试做出多个断言而不会失败,直到测试完成。遇到的所有失败都将使用堆栈跟踪记录到 stderr,并且在测试完成后它将失败并显示一条消息,说明遇到了多少失败(或者如果遇到 0 个错误则通过)。

这样你就可以扩展这个类并像往常一样运行你的测试,尽可能多地进行断言,并且测试直到最后都不会失败(请参阅下面的一些警告)。这应该允许设置和检查您的设置,因为在调用该方法PASSED之前测试不会失败。@After

public abstract class AbstractPoorlyWrittenUnitTest
{
   private int m_assertionErrorCount = 0;

   @After
   public final void failTestIfErrorsEncountered ()
   {
      if( m_assertionErrorCount > 0 )
         Assert.fail( "Test error(s) encountered: " + m_assertionErrorCount );
   }

   protected final void assertTrue ( boolean condition )
   {
      try
      {
         Assert.assertTrue( condition );
      }
      catch( AssertionError failure )
      {
         logAssertionError( failure );
      }
   }

   protected final void assertFalse ( boolean condition )
   {
      try
      {
         Assert.assertFalse( condition );
      }
      catch( AssertionError failure )
      {
         logAssertionError( failure );
      }
   }

   protected final void assertEquals ( Object expected, Object actual )
   {
      try
      {
         Assert.assertEquals( expected, actual );
      }
      catch( AssertionError failure )
      {
         logAssertionError( failure );
      }
   }

   // include any other assertions you like to use (including message variants)

   private void logAssertionError ( @NotNull AssertionError failure )
   {
      System.err.println();
      ++m_assertionErrorCount;
      System.err.println( "Failure " + m_assertionErrorCount + ":" );
      failure.printStackTrace();
   }
}

注意事项:

如果您断言某些内容并继续进行,就好像断言是正确的一样,您可能会遇到 RuntimeException,这将导致测试“出错”,并且无法检查进一步的断言。

例如,以下代码中的第二个断言将抛出 NullPointerException。测试仍然会失败,但不会检查最后一个断言,并且测试将显示 1 个失败(“NotNull”断言)和 1 个错误(NullPointerException)。

Object myObject = null;
assertNotNull( myObject );
assertEquals( "Some text", myObject.toString() );
assertEquals( 4, 3 );

PS - 我将其命名为 PoorlyWrittenUnitTest 是因为我们大多数需要此代码的测试确实是写得很糟糕的遗留测试,在一个测试方法中测试了多个事物,每个被测试事物有多个断言,而且因为我交谈的大多数人认为具有超过 1 个断言的测试写得不好。

于 2014-07-31T21:00:11.980 回答
0

使用断言你不能。您需要将断言包装在可以捕获断言错误的自定义方法中,然后可能会更新测试链接结果,还将测试用例的状态标记为失败。您也可以尝试探索新的 testng 断言

于 2013-07-23T13:58:16.193 回答