2013-03-11 269 views
0

如果斷言失敗,我該如何在TestNG中繼續執行測試?我如何在TestNG的HTML報告中報告失敗?在TestNG中處理斷言

當我運行下面的代碼,有效之後,該行執行,但在報告中斷言失敗未列出:

@Test 
public void googleSearch(){ 
    driver.get("http://www.google.co.in/"); 
    System.out.println(" ---------- Start -------------"); 

    try { 
     Assert.assertTrue(driver.findElement(By.xpath("xyz")).isDisplayed(), "unable to find the link"); 
    } catch (Throwable t) { 
     System.out.println("Error"); 
    } 
    System.out.println(" ---------- End -------------"); 
} 

回答

1

如果趕上Asse田,TestNG的還看不出來。

+0

如果我刪除了try catch塊,斷言失敗後的下一步將不會執行 – 2013-03-12 08:23:41

+1

然後重新推出自己。 – 2013-03-15 18:19:23

0

在您的測試設計中,您最好儘量避免在測試失敗後繼續測試,而不是捕捉斷言錯誤。

  • 如果您需要關閉,斷開或以其他方式釋放測試使用的資源,請在@AfterMethod中執行此操作。
  • 如果你想測試多個獨立的東西,並驗證他們哪些通過,哪些失敗,把它們放入單獨的測試。如果您有多個共享類似設置的測試(例如,導航到應用程序中的某個點),請將設置移至@BeforeMethod。
  • 如果您正在測試多個相互依賴的條件,則應在遇到第一個故障時立即退出測試。由於依賴性,否則在後面的聲明中可能會看到錯誤的否定。

在您的例子:

@BeforeMethod 
public void openPage() { 
    driver.get("http://www.google.co.in/"); 
    System.out.println(" ---------- Start -------------"); 
} 

@Test 
public void googleSearchThis(){ 
    Assert.assertTrue(driver.findElement(By.xpath("xyz")).isDisplayed(), "unable to find the link"); 
} 

@Test 
public void googleSearchThat(){ 
    // assert for other things you want to test on the same page 
} 

@AfterMethod 
public void closePage() { 
    System.out.println(" ---------- End -------------"); 
} 
+0

當測試失敗時,afterMethod()將不會運行 – mac 2015-06-19 18:46:26

2

您可以使用此代碼在catch塊: -

org.testng.Assert.fail("expected and actual result do not match"); 

讓我們舉例如下代碼: -

String expectedtitle="xyz"; 
String actualtitle="xywz"; 
try { 
    Assert.assertEquals(expectedtitle, actualtitle); 
} catch(Throwable t) {    
    org.testng.Assert.fail("expected and actual result do not match");  
} 
+0

歡迎使用S.O.你應該發佈一些關於你的答案的代碼。 – 2013-08-10 15:12:18

1

同意,在失敗後繼續進行測試並不是最佳實踐。在* Methods()之後使用。

但是,特別是對於測試(配置)記錄的開始和結束,不要在測試類中完成它 - 創建一個偵聽器,並從偵聽器執行日誌記錄。

你可以擴展TestListenerAdapter和執行它規定了所有方法:

http://testng.org/javadoc/org/testng/TestListenerAdapter.html

public class YourTestResultMonitor extends TestListenerAdapter { 
    *snip* 
} 
0

我建議使用軟斷言,它們提供了TestNG的本地

package automation.tests; 

import org.testng.asserts.Assertion; 
import org.testng.asserts.SoftAssert; 

public class MyTest { 
    private Assertion hardAssert = new Assertion(); 
    private SoftAssert softAssert = new SoftAssert(); 
} 

@Test 
public void testForSoftAssertionFailure() { 
    softAssert.assertTrue(false); 
    softAssert.assertEquals(1, 2); 
    softAssert.assertAll(); 
} 
0

既然你發現錯誤,這不會失敗。我重新創建了以下情況。這並沒有失敗。但是Throwable被拋出。打印出Error

public class TNG { 
    WebDriver driver; 

    @Test 
    public void googleSearch(){ 
     System.setProperty("webdriver.chrome.driver", "path to web driver"); 
     driver = new ChromeDriver(); 
     driver.get("http://www.google.co.in/"); 
     System.out.println(" ---------- Start -------------");  
    try { 
     Assert.assertTrue(driver.findElement(By.xpath("xyz")).isDisplayed(), "unable to find the link"); 

    } catch (Throwable t) { 
     System.out.println("Error"); 
    } 
    System.out.println(" ---------- End -------------"); 
    } 

    @Test 
    public void anotherTest(){ 
     System.out.println("another test"); 
    } 
} 

以下是執行測試的結果。

another test 
Starting ChromeDriver 2.30.477700 (0057494ad8732195794a7b32078424f92a5fce41) on port 43423 
Only local connections are allowed. 
Jul 20, 2017 5:55:33 PM org.openqa.selenium.remote.ProtocolHandshake createSession 
INFO: Detected dialect: OSS 
---------- Start ------------- 
Error 
---------- End ------------- 
PASSED: anotherTest 
PASSED: googleSearch 

=============================================== 
Default test 
Tests run: 2, Failures: 0, Skips: 0 
=============================================== 


=============================================== 
Default suite 
Total tests run: 2, Failures: 0, Skips: 0 
=============================================== 

如果要繼續執行測試,即使一些測試失敗了,你可以簡單的寫有@Test註釋一樣,我創建了anotherTest()方法的方法。但是你不能保證測試執行的順序。 在這裏上面anotherTest()已經被執行了。