基于Selenium的测试自动化中的TestNG断言指南
在断言的帮助下,测试执行预计将抛出一个异常,或在不满足共同条件时停止执行。
我们都知道,测试是SDLC的重要组成部分,它可以手动或自动进行。无论我们采用哪种测试类型,在测试时知道我们在哪里得到应用阻断是至关重要的。在手动测试应用程序时,由于涉及到人的接触,学习应用程序阻止因素变得有点容易。
然而,当通过自动化测试一个应用程序时,我们应该明确地采用一种策略,我们可以验证预期结果是否符合实际结果。
这就是自动化中断言出现的地方。在断言的帮助下,测试执行预计会抛出一个异常,或在不满足共同条件时停止执行。因此,当实际结果与预期结果不同时,断言在采取适当措施方面发挥了重要作用。
什么是TestNG的断言?
无论任何编程语言,每个测试自动化框架,如TestNG,JUnit,NUnit,Nightwatch等,都提供一个断言机制,以验证测试场景的结果。例如,在基于Selenium的测试自动化框架中,TestNG断言将是强调自动化测试案例通过或失败的主要来源。
TestNG提供了一个Assert类,它有多种方法来提出断言。要使用TestNG断言,必须在你的java类中导入必要的包:org.testng.Assert
TestNG中断言的语法。
下面是TestNG断言的通用语法。
Assert.methodName(actual, expected);
- Assert这是TestNG框架中内置的一个类。
- methodName:这是Assert类方法的名称
- actual: 这是断言方法的第一个参数,其中传递了用户从被测程序中得到的值。
- expected这是断言方法的第二个参数,用户在其中传递预期值。
让我们快速浏览一下测试断言发挥重要作用的实时例子。考虑到登录页面的例子,因为登录是一个标准模块,任何应用程序的其他测试案例都高度依赖于此。在testng中使用断言来验证登录场景,以下是步骤。
- 打开登录页面
- 输入用户名和密码
- 点击提交
- 断言登录系统后的登陆页面的标题
在上述场景中,断言将应用于登陆页面的标题,即成功登录到应用程序后的页面。在Selenium的帮助下,你可以在登录后获取当前页面的标题,并应用TestNG断言来验证获取的标题是否与测试脚本中硬编码的预期标题一致。
TestNG中断言的类型
Testng 中有两种类型的断言。
- 硬断言每当有问题的断言被应用,并且断言语句失败,testng中的报告会立即抛出一个异常,终止同一测试用例的进一步执行,并继续执行测试套件中的下一个测试用例。一旦有问题的断言条件失败,测试用例就被标记为失败。
使用Selenium测试问题断言的例子。
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class TestLogin {
WebDriver driver;
@BeforeTest
public void setup() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://www.pcloudy.com/");
}
@Test(priority=0)
public void testPCloudyLogin(){
WebElement loginHeader = driver.findElement(By.xpath("//a[text()='Login']"));
loginHeader.click();
WebElement username = driver.findElement(By.id("userId"));
username.sendKeys("ramit.dhamija@gmail.com");
WebElement password = driver.findElement(By.name("password"));
password.sendKeys("ramit9876");
WebElement loginButton = driver.findElement(By.id("loginSubmitBtn"));
loginButton.click();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
String expectedTitle = "Mobile App Testing, Continuous Testing Cloud, Mobile Testing Tools | pCloudy";
String actualTitle = driver.getTitle();
Assert.assertEquals(actualTitle,expectedTitle, "pCloudy Login Test Failed");
}
@AfterTest
public void tearDown() {
if(driver!=null)
{
driver.quit();
}
}
}
- 软断言这些与复杂的断言相反,即使断言条件失败,testng也会继续进行测试用例的下一个步骤。
为了在testng中实现软断言,我们使用SoftAssert类和它的assertAll()方法来抛出在测试用例执行期间收集的所有异常。软断言执行断言。如果一个条件未能满足,它不会立即抛出一个异常;相反,它继续执行同一测试案例的以下语句,直到assertAll()方法被调用,抛出所有捕获的异常。
软断言先前讨论的登录测试用例的测试脚本。
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import org.testng.asserts.SoftAssert;
import io.github.bonigarcia.wdm.WebDriverManager;
public class TestLogin {
WebDriver driver;
SoftAssert softassert;
@BeforeTest
public void setup() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
softassert = new SoftAssert();
driver.manage().window().maximize();
driver.get("https://www.pcloudy.com/");
}
@Test(priority=0)
public void testPCloudyLogin(){
WebElement loginHeader = driver.findElement(By.xpath("//a[text()='Login']"));
loginHeader.click();
WebElement username = driver.findElement(By.id("userId"));
username.sendKeys("ramit.dhamija@gmail.com");
WebElement password = driver.findElement(By.name("password"));
password.sendKeys("ramit9876");
WebElement loginButton = driver.findElement(By.id("loginSubmitBtn"));
loginButton.click();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
String expectedTitle = "Mobile App Testing, Continuous Testing Cloud, Mobile Testing Tools | pCloudy";
String actualTitle = driver.getTitle();
softassert.assertEquals(actualTitle,expectedTitle, "pCloudy Login Test Failed");
System.out.println("Soft Assertion statement is executed");
softassert.assertAll();
}
@AfterTest
public void tearDown() {
if(driver!=null)
{
driver.quit();
}
}
}
什么时候使用硬断言和软断言?
我们现在知道了硬断言和软断言,让我们以不同的方式进一步讨论这个问题。
TestNG断言方法
所有测试NG的断言方法都以同样的方式工作,以验证测试方法。然而,不同的断言方法可以接受其他参数;因此,测试NG的断言必须根据需求明智地选择,因为测试NG的断言是提供测试案例的最终结果。
下面我们将讨论testng框架中最常用的断言。
- Assert.assertEqual(String actual, String expected这个断言方法接受两个参数,即实际值和预期值,以验证确切的字符串是否等于预期字符串。如果这两个字符串不相等,就会抛出断言异常。
- Assert.assertEqual(String actual, String expected, String message)。 这个断言方法与上面讨论的断言方法类似;唯一的区别是这个方法可以多接受一个字符串参数作为消息。如果断言条件没有得到满足,断言错误和这里传递的消息一起被抛出。
- Assert.assertEquals(boolean actual, boolean expected):这 个断言方法接受两个布尔值并验证两者是否相等。
- Assert.assertTrue(condition)。 这个断言方法用于断言参数中传递的条件是否返回真实。如果条件返回错误,就会抛出断言错误。
- Assert.assertTrue(condition, message):这 个断言方法与前面讨论的断言方法类似;唯一不同的是,这个方法可以多接受一个字符串参数作为消息。如果断言条件被传递为false,断言错误就会连同这里传递的消息一起抛出。
- Assert.assertFalse(condition):这 个断言方法断言在一个参数中传递的条件是否返回错误。如果条件返回为真,就会抛出断言错误。
- Assert.assertFalse(condition, message):这 个断言方法与前面讨论的断言方法类似;唯一不同的是,这个方法可以接受多一个字符串参数作为消息。如果断言的条件被传递为真,断言的错误就会连同这里传递的消息一起被抛出。
- Assert.assertNull(condition):这 个断言方法断言在一个参数中传递的条件是否返回null。如果条件没有返回null,就会抛出断言错误。
- Assert.assertNotNull(condition)。 这个断言方法断言在一个参数中传递的条件是否返回除null以外的值。如果条件返回null,就会抛出断言错误。
结论
断言是任何测试方法的核心部分;因此,了解断言在测试中的使用情况对于开发一个高效和强大的测试自动化套件非常重要。上面讨论的测试ng的断言最常用于验证测试方法。测试中还有很多断言,你可以在testng断言的官方文件中找到。
测试自动化 TestNG断言(软件开发) 测试 Selenium
经Ramit Dhamija许可发表于DZone。点击这里查看原文。
评论