2016-05-14 103 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

你會問爲什麼這是一種不好的風格?因爲只有在一種測試方法中有許多行時,才需要指出行號。只有在生成文件的情況下,它纔是不錯的風格。在生成的文件中,您可以生成行號並將其插入到消息中。 – 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」); (Alert_text,「Hi .. is alert message!」,「Alert Is InCorrect2」); s_assert.assertEquals (Alert_text,「Hi .. is alert message!」,「Alert is InCorrect3」); s_assert.assertEquals (Alert_text,「Hi .. is alert message!」,「Alert is InCorrect4」); s_assert.assertEquals s_assert.assertall();

執行失敗它指向(s_assert.assertall();)線後,平均一次顯示了軟斷言失敗.... 警報InCorrect2 警報InCorrect3

請檢查輸出消息。

+0

它是否顯示失敗軟聲明的行數? –

+0

它顯示哪個軟斷言失敗,其消息「Alert Is InCorrect2」; –