JUnit中用於Selenium測試的中實踐

自動化測試通過允許他們自動化重複性的任務來幫助簡化軟件測試人員的生活,而開源測試自動化框架(如Selenium)使用戶能夠大規模自動化Web測試體驗。 但是,如果您無法驗證測試用例是否通過,則自動化測試有什麼用?

這是斷言的體現,因此您可以跟蹤執行Selenium測試的自動化腳本後遇到了多少測試失敗或成功。今天,我要告訴你如何在JUnit的斷言,不同類型的斷言在JUnit是由例子。

什麼是斷言?爲什麼要使用它們?

斷言,不論放在硒測試使用的工具和框架的自動化測試的一個組成部分。在測試中使用斷言來驗證或檢查操作/功能的結果是否與執行測試後預期的結果相同。簡而言之,它們用於驗證測試案例通過或失敗的狀態。

當我們運行要自動化的測試用例/場景時,找出通過或失敗的場景對於瞭解自動化腳本的執行是否符合預期至關重要。

爲此,我們必須提供某種斷言,因此,在操作結束時,我們的代碼將在JUnit或任何其他測試自動化框架中進行比較和斷言,以評估我們得到的結果是否符合預期。

如果實際結果與預期結果相同,則可以將該斷言標記爲通過,如果不滿足,則可以將該斷言標記爲失敗。

當滿足測試腳本中的所有斷言時,僅將一個測試用例視爲通過。可以使用JUnit框架的預定義方法來處理Selenium Java中的斷言。

硒測試有2種主要的斷言類型,即硬斷言和軟斷言。

  • 硬斷言–如果斷言條件與預期結果不匹配,當我們希望測試腳本立即停止時,將使用硬斷言。由於斷言條件未能達到預期的結果,因此將遇到斷言錯誤,並且正在執行的測試用例將標記爲“失敗”。
  • 軟斷言–即使不滿足斷言條件,測試腳本的執行也不會停止。同樣,在軟斷言的情況下,當斷言條件將無法滿足預期結果時,也不會引發任何錯誤,並且測試腳本的執行將繼續到下一個測試用例步驟。

話雖如此,現在該通過示例深入研究JUnit中的各種斷言了。

JUnit中用於硒測試的斷言類型

JUnit中的聲明方法由類“ org.junit.Assert ” 提供,該類擴展了“ java.lang.Object ”類。現在,我們將通過示例研究在JUnit中聲明的不同方法。

assertEquals()

JUnit assertEquals()方法將預期結果與實際結果的相等性進行比較。當我們提供的預期結果與執行操作後得到的Selenium測試腳本的實際結果不匹配時,它將引發斷言錯誤。這導致在該行本身終止測試腳本的執行。

句法:

Assert.assertEquals(String expected, String actual);
Assert.assertEquals(String message, String expected, String actual);

這是一個JUnit assertEquals示例,可以幫助您更好地理解過程。

package com.test;

import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class AssertionDemoClass {


    public static WebDriver driver;
    
    @BeforeClass
    public static void openBrowser()
    {
        System. setProperty("webdriver.chrome.driver", "D:\\AutomationPractice\\chromedriver_win32\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
    }
    
    @Test
    public void assertURL() {
        // TODO Auto-generated method stub
        driver.get("https://www.lambdatest.com/");
        
        String actualURL = driver.getCurrentUrl();
        System.out.println(actualURL);
        
        Assert.assertEquals("https://www.lambdatest.com/",actualURL);
        System.out.println("Test Passed");
    }
    
    @AfterClass
    public static void closeBrowser()
    {
        driver.close();
    }

}

在上面的代碼中,我們可以看到我們在JUnit assertEquals()方法中提供了兩個參數,它們是預期結果和實際結果。如果實際URL的值與Selenium測試腳本中提到的預期URL不匹配,則將引發斷言錯誤,並且程序的執行將在同一行(即斷言語句本身)處終止。

我們還可以將斷言錯誤消息作爲參數傳遞,如語法所示。

assertEquals爲浮點聲明

如果我們需要比較浮點類型(例如double或float),則在這種情況下,爲了避免舍入錯誤,我們必須提供可以稱爲delta的其他參數。
增量值可以評估爲:

Math.abs(預期–實際)=增量

如果由於四捨五入而導致期望值和實際值之間存在邊際差異,則可以認爲這些邊際差異相同,並且斷言應標記爲合格。因此,用戶給出的增量值決定了哪個裕度值應被認爲可以通過該聲明。

可以與float和double數據類型一起使用,請參考下面的語法

句法:

public static void assertEquals(float expected,float actual,float delta)
public static void assertEquals(double expected,double actual,double delta)

聲明用於浮點聲明的JUnit示例

@Test
    public void assertURL() {
        // TODO Auto-generated method stub      
        
        double actualDoubleValue= 2.999;
        double expectedDoubleValue = 3.000;
        
        Assert.assertEquals(expectedDoubleValue, actualDoubleValue, 0.001);
        
        System.out.println("Test Passed");      
        
    }

assertTrue()

如果您希望爲方法中調用的特定條件將參數值傳遞爲True,則可以使用.JUnit assertTrue()。您可以在兩種實際情況下使用JUnit assertTrue()。

  • 通過使用assertTrue方法將condition作爲布爾值參數傳遞給JUnit進行斷言。如果方法中給出的條件不是True,則拋出AssertionError(無消息)。

句法:

Assert.assertTrue(boolean assertCondition);

  • 通過在assertTrue()方法中同時傳遞兩個參數。其中,一個參數用於斷言錯誤消息,第二個參數用於指定需要應用斷言方法爲True的特定條件。如果方法中給定的條件不是True,則拋出AssertionError(帶有消息)。

句法:

Assert.assertTrue(String message, boolean assertCondition);

讓我們看一下assertTrue()的assert JUnit示例Selenium測試腳本:

package com.assertions.junit 1;

import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class AssertionDemo1 {

    public static WebDriver driver;
    
    @BeforeClass
    public static void openBrowser()
    {
        System. setProperty("webdriver.chrome.driver", "D:\\AutomationPractice\\chromedriver_win32\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
    }
    
    @Test
    public void assertURL() {
        driver.get("https://www.spicejet.com/");
        
        String actualURL = driver.getCurrentUrl();
        System.out.println(actualURL);
        
        String expectedURL="https://www.spicejet.com/";
        
        Assert.assertTrue("URL does not match",expectedURL.equals(actualURL));
        System.out.println("Test Passed");  
        
    }

    
    @AfterClass
    public static void closeBrowser()
    {
        driver.close();
    }
}

在上面的代碼中,我們可以看到在assertTrue()方法中提供了兩個參數,分別是斷言錯誤消息和布爾條件。如果條件不匹配或不成立,則將引發斷言錯誤,並且程序的執行將在同一行(即斷言語句本身)處終止。

如果我們不想提供斷言錯誤消息,那麼我們只需提供條件即可,如我們在上述語法中所見。

assertFalse()

與JUnit assertTrue相反,我們可以使用assertFalse()方法來驗證給定條件是否爲False。您也可以通過兩種方式聲明JUnit assertFalse。

  • 它以條件作爲參數,需要對其施加斷言。如果方法中給出的條件不爲False,則會引發AssertionError(無消息)。

語法:
Assert.assertFalse(boolean condition);

  • 與assertTrue相似,您也可以爲assertFalse傳遞兩個參數。一個確定斷言錯誤消息,另一個確定應用assertFalse的條件。如果方法中給定的條件不爲False,則會引發AssertionError(帶有消息)。

句法:
Assert.assertFalse(String message, boolean condition);

讓我們看一下assertFalse()的一個斷言JUnit示例Selenium測試腳本:

package com.assertions.junit 1;

import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class AssertionDemo1 {

    public static WebDriver driver;
    
    @BeforeClass
    public static void openBrowser()
    {
        System. setProperty("webdriver.chrome.driver", "D:\\AutomationPractice\\chromedriver_win32\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
    }
    
    @Test
    public void assertURL() {
        // TODO Auto-generated method stub
        driver.get("https://www.spicejet.com/");
        
        String actualURL = driver.getCurrentUrl();
        System.out.println(actualURL);
        
        String expectedURL="https://www.google.com/";
        
        Assert.assertFalse("URL does match",expectedURL.equals(actualURL));
        System.out.println("Test Passed");          
    }
    
    @AfterClass
    public static void closeBrowser()
    {
        driver.close();
    }
}

在上面的Selenium測試腳本中,我們可以看到在assertFalse()方法中提供了兩個參數,分別是斷言錯誤消息和布爾條件。如果條件確實匹配或不爲假,則將引發斷言錯誤,並且程序的執行將在同一行(即斷言語句本身)處終止。

如果我們不想提供斷言錯誤消息,那麼我們只需提供條件即可,如我們在上述語法中所見。

assertNull()

爲了驗證傳遞的對象是否包含null值,我們使用assertNull()方法,該方法有助於在對象不是null值的情況下顯示斷言錯誤。

句法:

Assert.assertNull(Object obj);
Assert.assertNull(String msg, Object obj);

讓我們看一下用於JUnit assertNull()的示例Selenium測試腳本:

package com.assertions.junit 1;

import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class AssertionDemo1 {

    public static WebDriver driver;
    
    
    //To open the browser before running test
    @BeforeClass
    public static void openBrowser()
    {
        System. setProperty("webdriver.chrome.driver", "D:\\AutomationPractice\\chromedriver_win32\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
    }
    
    @Test
    public void assertURL() {
        
        //Redirect to the URL 
        driver.get("https://www.spicejet.com/");
        
        String actualURL = driver.getCurrentUrl();
        System.out.println(actualURL);
        
        String expectedURL=null;
        
        //Assertion     
        //Assert.assertNull(“Not Null”,actualURL);
        //OR
        Assert.assertNull(“Not Null”,expectedURL);

        System.out.println("Test Passed");  
        
    }
    
    //To close the browser after running test
    @AfterClass
    public static void closeBrowser()
    {
        driver.close();
    }

}

在上面的代碼中,我們可以看到在assertNull()方法中提供了兩個參數,分別是斷言錯誤消息和對象。如果提供的對象不爲null,則將引發斷言錯誤,並且程序的執行將在同一行(即斷言語句本身)處終止。
如果我們不想提供斷言錯誤消息,那麼我們就可以提供一個對象,正如我們在上述語法中看到的那樣。

assertNotNull()

assertNotNull()方法檢查提供的對象是否不包含空值。我們可以在此方法中將對象作爲參數傳遞,如果傳遞的對象確實包含NULL值以及提供的斷言錯誤消息,則將獲得斷言錯誤。

句法:

Assert.assertNotNull(Object obj);
Assert.assertNotNull(String msg, Object obj);

讓我們來看一個assertNotNull()的assert JUnit示例Selenium測試腳本:

package com.assertions.junit 1;

import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class AssertionDemo1 {

    public static WebDriver driver;
    
    
    //To open the browser before running test
    @BeforeClass
    public static void openBrowser()
    {
        System. setProperty("webdriver.chrome.driver", "D:\\AutomationPractice\\chromedriver_win32\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
    }
    
    @Test
    public void assertURL() {
        
        //Redirect to the URL 
        driver.get("https://www.spicejet.com/");
        
        String actualURL = driver.getCurrentUrl();
        System.out.println(actualURL);
        
        String expectedURL="https://www.google.com/";
        
        //Assertion     
        Assert.assertNotNull("Null Object", actualURL);;
        System.out.println("Test Passed");  
        
    }
    
    //To close the browser after running test
    @AfterClass
    public static void closeBrowser()
    {
        driver.close();
    }

}

在上面的代碼中,我們可以看到在assertNotNull()方法中提供了兩個參數,分別是斷言錯誤消息和對象。如果提供的對象爲null,則僅引發斷言錯誤,並且程序的執行將在同一行(即斷言語句本身)處終止。

如果我們不想提供斷言錯誤消息,那麼我們只需提供一個對象即可,正如我們在上述語法中看到的那樣。

assertSame()

在執行Selenium測試時,您可能經常會遇到一種情況,您需要比較在方法中作爲參數傳遞的兩個不同對象,以評估它們是否引用了同一對象。在這裏可以使用JUnit assertSame()。如果兩個對象未引用同一對象,則會顯示斷言錯誤。另外,如果提供了錯誤消息,則我們將收到斷言錯誤消息,如以下語法所示。

Selenium測試腳本中JUnit assertSame()的語法:

Assert.assertSame(Object expected, Object actual);
Assert.assertSame(String message, Object expected, Object actual);

assertNotSame()

assertNotSame()方法驗證是否作爲參數傳遞的兩個對象不相等。如果兩個對象具有相同的引用,則將與我們提供的消息(如果有)一起引發斷言錯誤。
此方法要注意的另一件事是,它比較對象的引用而不是這些對象的值。

Selenium測試腳本中JUnit assertNotSame()的語法:

Assert.assertNotSame(Object expected, Object actual);
Assert.assertNotSame(String message, Object expected, Object actual);

assertArrayEquals()

assertArrayEquals()方法驗證我們作爲參數傳遞的兩個對象數組是否相等。如果兩個對象數組的值都爲null,則將它們視爲相等。
如果我們在方法中作爲參數傳遞的兩個對象數組都不相等,則此方法將引發聲明錯誤並提供消息。

Selenium測試腳本中JUnit assertArrayEquals()的語法:

Assert.assertArrayEquals(Object[] expected, Object[] actual);
Assert.assertArrayEquals(String message, Object[] expected, Object[] actual);

JUnit5與JUnit4之間的JUnit斷言之間的差異

JUnit Jupiter附帶了許多JUnit 4中已經存在的斷言方法,並且它添加了更多斷言方法,使其很適合與Java 8 Lambdas一起使用。在JUnit Jupiter中,斷言是類中的靜態方法org.junit.jupiter.api.Assertions

在Junit 4中,org.junit.Assert具有不同的斷言方法來驗證預期結果和結果。同樣,我們可以爲斷言錯誤消息提供額外的參數,作爲方法簽名中的FIRST參數。您可以使用以下語法或上面討論的每種方法來引用它們。

例:

public static void assertEquals(long expected, long actual);
public static void assertEquals(String message, long expected, long actual);

在JUnit 5中,org.junit.jupiter.Assertions包含大多數assert方法,包括其他assertThrows()和assertAll()方法。

JUnit 5斷言方法還具有重載方法,以支持在測試失敗的情況下傳遞要打印的錯誤消息

Junit 4 Junit 5
使用的類是'org.junit.Assert' 使用的類是'org.junit.jupiter.api.Assertions'
斷言錯誤消息是第一個參數,儘管它是可選的 斷言錯誤消息可以作爲最後一個參數傳遞,它也是可選的
新方法:無 新方法:assertAll()和assertThrows()

斷言JUnit5的新方法

現在,我們已經清楚地瞭解了在JUnit5與JUnit 4中聲明的方式的區別。我們現在將深入研究在JUnit5中聲明的最新方法。

assertAll()

將執行新添加的方法assertAll()來檢查所有斷言是否爲分組斷言。它有一個可選的標題參數,允許使用該方法assertAll()來識別一組斷言。在失敗時,斷言錯誤消息會顯示有關該組中使用的每個字段斷言的詳細信息。

讓我們來看一個帶有斷言的assertAll的assert JUnit示例:

package com.test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertSame;

import java.util.Arrays;
import java.util.List;

import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.jupiter.api.Assertions;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class AssertionDemoClass {

    public static WebDriver driver;
    
    @BeforeClass
    public static void openBrowser()
    {
        System. setProperty("webdriver.chrome.driver", "D:\\AutomationPractice\\chromedriver_win32\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
    }
    
    @Test
    public void assertURL() {
        // TODO Auto-generated method stub
        driver.get("https://www.spicejet.com/");
        
        
        String actualURL = driver.getCurrentUrl();
        System.out.println(actualURL);
        String expectedURL="https://www.spicejet.com/";
            
        String actualTitle =  driver.getTitle();
        System.out.println(actualTitle);
        String expectedTitle = "SpiceJet - Flight Booking for Domestic and International, Cheap Air Tickets";
        
        Assertions.assertAll( 
                () -> assertEquals(expectedURL, actualURL),
                () -> assertEquals(expectedTitle, actualTitle)
                );
        
        System.out.println("Test Passed");
    }
    
    @AfterClass
    public static void closeBrowser()
    {
        driver.close();
    }
}

assertThrows()

JUnit 5中另一個新添加的方法是替換JUnit 4中的ExpectedException Rule。現在,可以針對返回的Throwable類實例進行所有聲明,這將使測試腳本更具可讀性。作爲可執行文件,我們可以使用lambda或方法引用。

JUnit中的第三方斷言

JUnit Jupiter爲大多數測試方案提供了足夠的斷言功能,但是可能存在一些需要附加功能的方案,除了JUnit Jupiter所提供的功能之外,例如需要或需要匹配器。

對於這種情況,JUnit團隊建議使用第三方斷言庫,例如Hamcrest,AssertJ,Truth等。用戶可以在需要時使用這些第三方庫。

僅就一個斷言JUnit示例而言,爲了使斷言更具描述性和可讀性,我們可以使用匹配器和流利的API的組合。

而JUnit Jupiter(JUnit 5)的org.junit.jupiter.api.Assertions類不提供方法assertThat(),該方法可在JUnit 4的org.junit.Assert類中使用,該方法接受Hamcrest Matcher。這樣,您可以利用第三方斷言庫爲匹配器提供的內置支持。

總結一下

如果您要通過Selenium測試執行自動化,則斷言將扮演不可或缺的角色。它們通過評估通過Selenium測試腳本傳遞給對象的參數來幫助我們確定測試用例是否通過。

技術類文章精選

非技術文章精選

大咖風采

長按關注

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章