我们都知道测试是 SDLC 的主要部分,可以手动或自动执行。无论我们采用哪种测试类型,重要的是要知道我们在测试时究竟在哪里获得了应用程序阻止程序。在手动测试应用程序时,了解应用程序阻止程序变得有点容易,因为它涉及到人为接触。 

但是,当通过自动化测试应用程序时,我们应该明确采用一种策略,我们可以验证预期结果是否符合实际结果。

这就是自动化中的断言出现的地方。在断言的帮助下,预计测试执行会在不满足预期条件时抛出异常或停止执行。因此,当实际结果与预期结果不同时,断言对于采取相关步骤起着非常重要的作用。

TestNG 中的断言是什么?

无论使用哪种编程语言 TestNG、JUnit、NUnit、Nightwatch 等每个测试自动化框架都提供了一种断言机制来验证测试场景的最终结果。基于 Selenium测试自动化框架中,testng 断言将是突出显示自动化测试用例是通过还是失败的主要来源。

TestNG 提供了一个 Assert 类,该类具有多种引发断言的方法。要使用 TestNG 断言,在您的 java 类中导入所需的包很重要:org.testng.Assert

TestNG 中的断言语法:

下面是 testng 断言的通用语法:

Assert.methodName(实际,预期);

  • Assert :这是 TestNG 框架中内置的类
  • methodName :这是 Assert 类方法的名称
  • actual :这是 assert 方法的第一个参数,其中传递了用户从被测应用程序中获取的值
  • expected :这是用户传递期望值的 assert 方法的第二个参数

让我们快速看一下 testng 断言发挥重要作用的实时示例。将登录页面的示例视为登录是一个通用模块,任何应用程序的其他测试用例都高度依赖该模块。在 testng 中使用断言来验证登录场景,以下是步骤:

  1. 打开登录页面
  2. 输入用户名和密码
  3. 点击提交
  4. 登录系统后断言登陆页面的标题

在上述场景中,断言将应用于登录页面的标题,即成功登录应用程序后出现的页面。在Selenium 的帮助下,您可以在登录后获取当前页面的标题并应用 testng 断言来验证获取的标题是否与测试脚本中硬编码的预期标题匹配。

TestNG 中的断言类型

testng 中有两种类型的断言:

  1. 硬断言——每当应用硬断言并且断言语句失败时,testng 中的断言会立即抛出异常并终止同一测试用例的进一步执行,并继续执行测试套件中的下一个测试用例。一旦硬断言条件失败,测试用例就被标记为失败。

使用 Selenium 的 testng 硬断言示例:

导入 java.util.concurrent.TimeUnit;

导入 org.openqa.selenium.By;

导入 org.openqa.selenium.WebDriver;

导入 org.openqa.selenium.WebElement;

导入 org.openqa.selenium.chrome.ChromeDriver;

导入 org.testng.Assert;

导入 org.testng.annotations.AfterTest;

导入 org.testng.annotations.BeforeTest;

导入 org.testng.annotations.Test;

导入 io.github.bonigarcia.wdm.WebDriverManager;

公共类 TestLogin {

WebDriver 驱动程序;

    @BeforeTest

    公共无效设置(){

  WebDriverManager.chromedriver().setup();

  驱动程序 = 新的 ChromeDriver();

  driver.manage().window().maximize();

  driver.get("https://www.pcloudy.com/");

    }

    @Test(优先级=0)

    公共无效 testPCloudyLogin(){

  WebElement loginHeader = driver.findElement(By.xpath("//a[text()='Login']"));

  loginHeader.click();

 

  WebElement 用户名 = driver.findElement(By.id("userId"));

  username.sendKeys("ramit.dhamija@gmail.com");

  WebElement 密码 = driver.findElement(By.name("password"));

  密码.sendKeys("ramit9876");

  WebElement loginButton = driver.findElement(By.id("loginSubmitBtn"));

  loginButton.click();

    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

 

    String expectedTitle = "移动应用测试、持续测试云、移动测试工具 | pCloudy";

    String actualTitle = driver.getTitle();

    Assert.assertEquals(actualTitle,expectedTitle, "pCloudy 登录测试失败");

    }

   

    @AfterTest

    公共无效拆卸(){

 

  如果(司机!=空)

  {

  driver.quit();

  }

    }

}

  1. 软断言——这些与硬断言相反,即使断言条件失败,testng 也会继续测试用例的下一步。

为了在 testng 中实现软断言,我们使用 SoftAssert 类和它的方法 assertAll() 来抛出在测试用例执行期间收集的所有异常。软断言基本上执行断言,如果条件不满足,它不会立即抛出异常,而是继续执行同一测试用例的下一条语句,直到调用方法 assertAll() 以抛出所有捕获的异常。

测试脚本来软断言前面讨论的登录测试用例:

导入 java.util.concurrent.TimeUnit;

导入 org.openqa.selenium.By;

导入 org.openqa.selenium.WebDriver;

导入 org.openqa.selenium.WebElement;

导入 org.openqa.selenium.chrome.ChromeDriver;

导入 org.testng.annotations.AfterTest;

导入 org.testng.annotations.BeforeTest;

导入 org.testng.annotations.Test;

导入 org.testng.asserts.SoftAssert;

导入 io.github.bonigarcia.wdm.WebDriverManager;

公共类 TestLogin {

WebDriver 驱动程序;

软断言软断言;

    @BeforeTest

    公共无效设置(){

  WebDriverManager.chromedriver().setup();

  驱动程序 = 新的 ChromeDriver();

  软断言 = 新的软断言();

  driver.manage().window().maximize();

  driver.get("https://www.pcloudy.com/");

    }

    @Test(优先级=0)

    公共无效 testPCloudyLogin(){

  WebElement loginHeader = driver.findElement(By.xpath("//a[text()='Login']"));

  loginHeader.click();

 

  WebElement 用户名 = driver.findElement(By.id("userId"));

  username.sendKeys("ramit.dhamija@gmail.com");

  WebElement 密码 = driver.findElement(By.name("password"));

  密码.sendKeys("ramit9876");

  WebElement loginButton = driver.findElement(By.id("loginSubmitBtn"));

  loginButton.click();

    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

 

    String expectedTitle = "移动应用测试、持续测试云、移动测试工具 | pCloudy";

    String actualTitle = driver.getTitle();

    softassert.assertEquals(actualTitle,expectedTitle, "pCloudy 登录测试失败");

    System.out.println("软断言语句被执行");

 

    softassert.assertAll();

    }

   

    @AfterTest

    公共无效拆卸(){

 

  如果(司机!=空)

  {

  driver.quit();

  }

    }

}

何时使用硬断言和软断言?

正如我们现在了解的硬断言和软断言,让我们以不同的方式进一步讨论:

硬断言

软断言

用例:一旦断言条件不满足,就以异常终止测试用例执行。

用例:验证所有断言条件,在断言条件不满足时收集异常,并在调用 assertAll() 方法时抛出所有异常。

何时使用:最好使用硬断言的场景将是登录测试场景,如果登录测试失败,则测试用例执行必须终止并出现异常,因为不登录系统就没有进一步移动的意义。

何时使用:软断言最好用于测试用例的测试语句不相互依赖的情况。例如,如果您正在验证一个表单,其中有多个要验证的字段,因此建议对所有字段进行软断言,然后在测试用例结束时调用 assertAll() 以抛出所有异常。

TestNG 断言方法

可能所有的 testng 断言方法都以相同的方式工作以验证测试方法。但是,不同的断言方法可以接受不同的参数,因此,必须根据需求明智地选择 testng 中的断言,因为 testng 断言是提供测试用例最终结果的断言。

下面我们将讨论 testng 框架中大多数常用的断言:

  1. Assert.assertEqual(String actual, String expected):这个断言方法接受两个参数,即实际值和期望值来验证实际字符串是否等于预期字符串。如果两个字符串不相等,则抛出断言异常。
  2. Assert.assertEqual(String actual, String expected, String message):这种断言方法与上面讨论的断言方法类似,唯一的区别是该方法可以多接受一个字符串参数作为消息。如果不满足断言条件,则会抛出断言错误以及此处传递的消息。
  3. Assert.assertEquals(boolean actual, boolean expected):此断言方法接受两个布尔值并验证两者是否相等。
  4. Assert.assertTrue(condition):该断言方法用于断言传入参数的条件是否返回真。如果条件返回 false,则抛出断言错误。
  5. Assert.assertTrue(condition, message):这个断言方法和前面讨论的断言方法类似,唯一的区别是这个方法可以多接受一个字符串参数作为消息。如果断言条件被传递为假,则断言错误与此处传递的消息一起被抛出。
  6. Assert.assertFalse(condition):该断言方法用于断言传入参数的条件是否返回false。如果条件返回 true,则抛出断言错误。
  7. Assert.assertFalse(condition, message):这个断言方法和上一个讨论的断言方法类似,唯一的区别是这个方法可以多接受一个字符串参数作为消息。如果断言条件作为 true 传递,则会抛出断言错误以及此处传递的消息。
  8. Assert.assertNull(condition):该断言方法用于断言传入参数的条件是否返回null。如果条件不返回 null,则抛出断言错误。
  9. Assert.assertNotNull(condition):该断言方法用于断言参数中传入的条件是否返回null以外的值。如果条件返回 null,则抛出断言错误。

结论

断言是任何测试方法的核心部分,因此了解 testng 中断言的用例对于开发高效且健壮的测试自动化套件非常重要。上面讨论的 testng 断言最常用于验证测试方法。testng 中还有更多的断言,你可以在testng 断言官方文档中找到。