1

如果断言失败,如何继续在 TestNG 中执行测试?如何在 TestNG 的 HTML 报告中报告失败?

当我运行以下代码时,断言后的行被执行,但在报告中未列出断言失败:

@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 -------------");
}
4

6 回答 6

3

您可以在 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");      
}
于 2013-08-10T14:54:03.073 回答
1

如果你捕捉到 AssertionError,TestNG 就看不到它。

于 2013-03-11T16:27:17.277 回答
1

同意,失败后继续测试不是最佳实践。使用 after*Methods() 的东西。

但是,专门针对测试(配置)开始和结束的日志记录,根本不要在测试类中进行 - 创建一个侦听器,并从侦听器进行日志记录。

您可以扩展 TestListenerAdapter 并实现它规定的所有方法:

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

public class YourTestResultMonitor extends TestListenerAdapter {
    *snip*
}
于 2015-06-19T18:52:14.227 回答
1

我建议使用 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();
}
于 2017-03-08T14:24:22.900 回答
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 -------------");
}
于 2013-03-21T16:08:50.227 回答
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() 已首先执行。

于 2017-07-20T12:40:54.053 回答