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 アプリケーションでステータスをFailedTestLinkAPIResults.FAILEDに更新するにはどうすればよいですか (つまり、 status = )?

4

4 に答える 4

2

@after を使用して、テスト実行後にステータスを確認できます

@After
public void statusCheck() {
    if (status!=TestLinkAPIResults.PASSED) {
        status = TestLinkAPIResults.FAILED;
    }
}
于 2013-07-23T13:59:24.027 に答える
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 にヒットする可能性があり、テストが「エラー」になり、それ以上アサーションをチェックできなくなります。

たとえば、次のコードの 2 番目のアサーションは NullPointerException をスローします。テストは引き続き失敗しますが、最後のアサーションはチェックされず、テストは 1 つの失敗 (「NotNull」アサーション) と 1 つのエラー (NullPointerException) を示します。

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

PS - 私がこれを PoorlyWrittenUnitTest と名付けたのは、このコードを必要とするほとんどのテストが、単一のテスト メソッドで複数のテスト対象があり、テスト対象ごとに複数のアサーションが存在する非常に貧弱に記述されたレガシー テストであるためです。 2 つ以上のアサーションを含むテストは不適切に記述されていると見なします。

于 2014-07-31T21:00:11.980 に答える
0

アサートではできません。assertionerror をキャッチできるカスタム メソッドで assert をラップし、おそらく testlink の結果を更新して、テストケースのステータスを失敗としてマークする必要があります。また、新しい testng assertsを試してみることもできます。

于 2013-07-23T13:58:16.193 に答える