2016-05-14 15 views
1

Selenium、Java、TestNGを使用してテストを記述しています。私は単体テストで多くのソフトアサーションを使用することがあります。失敗した場合、TestNGの記者は、発生したコードの行を表示しません。それを示すようにする方法はありますか?私はFailure Exceptionでレポートをクリックしたときに実際にそれがs_assert.assertAll();に私を取るが、私のような、特定の行に撮影する必要があります。s_assert.assertEquals(Alert_text, "Hi.. is alert message!", "Alert Is InCorrect");TestNGレポートの作成方法ソフトアサーションが失敗した行を表示する

+0

私はこのように(非常に悪いスタイルですが)あなたの仕事を "スペア"にするべきではなく、良いメッセージを作成するべきだと思います。あなたのアサーションが本当にあまりにも鈍く、賢明なメッセージを書くのと似ている場合、メソッドの開始時にInteger dullAssertNumを作成し、すべての鈍的アサートに "assert" +(dullAssertNum ++)。toStringを含めます。 – Gangnus

+0

なぜそれは悪いスタイルですか? 1つのテストメソッドにたくさんの行がある場合にのみ、行番号を指定する必要があるためです。そして、生成されたファイルの場合にのみ悪いスタイルではありません。生成されたファイルでは、行番号を生成してメッセージに挿入することができます。 – Gangnus

答えて

0

カスタムソフトアサーション(私は検証それを命名している)の下の実装が何をすべきあなたが求めているもの。

import org.testng.annotations.Test; 
import org.testng.asserts.Assertion; 
import org.testng.asserts.IAssert; 
import org.testng.collections.Maps; 

import java.util.Arrays; 
import java.util.Map; 

public class SoftAssertExample { 
    private Verifier verifier = new Verifier(); 

    @Test 
    public void testMethod() { 
     verifier.assertEquals(false, true); 
     verifier.assertTrue(true); 
     verifier.assertAll(); 
    } 

    /** 
    * A simple soft assertion mechanism that also captures the stacktrace to help pin point the source 
    * of failure. 
    */ 
    public static class Verifier extends Assertion { 
     private final Map<AssertionError, IAssert<?>> m_errors = Maps.newLinkedHashMap(); 

     @Override 
     protected void doAssert(IAssert<?> a) { 
      onBeforeAssert(a); 
      try { 
       a.doAssert(); 
       onAssertSuccess(a); 
      } catch (AssertionError ex) { 
       onAssertFailure(a, ex); 
       m_errors.put(ex, a); 
      } finally { 
       onAfterAssert(a); 
      } 
     } 

     public void assertAll() { 
      if (! m_errors.isEmpty()) { 
       StringBuilder sb = new StringBuilder("The following asserts failed:"); 
       boolean first = true; 
       for (Map.Entry<AssertionError, IAssert<?>> ae : m_errors.entrySet()) { 
        if (first) { 
         first = false; 
        } else { 
         sb.append(","); 
        } 
        sb.append("\n\t"); 
        sb.append(ae.getKey().getMessage()); 
        sb.append("\nStack Trace :"); 
        sb.append(Arrays.toString(ae.getKey().getStackTrace()).replaceAll(",", "\n")); 
       } 
       throw new AssertionError(sb.toString()); 
      } 
     } 
    } 
} 
0

例コード: s_assert.assertEquals(Alert_text、 "!こんにちは..警告メッセージである"、 "アラートですInCorrect1"); s_assert.assertEquals(Alert_text、 "Hi ..は警告メッセージです!"、 "Alert Is InCorrect2"); s_assert.assertEquals(Alert_text、 "Hi ..警告メッセージです!"、 "Alert Is InCorrect3"); s_assert.assertEquals(Alert_text、 "Hi ..警告メッセージです!"、 "Alert Is InCorrect4"); s_assert.assertall();

実行は、それが指す失敗した後(s_assert.assertall();)ライン、それはソフトアサートが失敗したメッセージを示していた時間を意味.... アラートですInCorrect2 アラートですInCorrect3

出力を確認してください。

+0

これは失敗したソフトアサートの回線番号を表示しますか。 –

+0

は、どのソフトアサートが失敗したか、およびそのメッセージ "Alert Is InCorrect2"を表示します。 –

関連する問題