JUnit Test Assert


斷言 是測試的心臟,就是 判斷 預期的內容 是否與實際一致,就是手動測試的 精髓

1)、我們在使用一個斷言(中 那些方法,比如assertEquals等)可以靜態一次性導入 Assert類。
import static org.junit.Assert.*;

2)、 JUnit框架 用一組Assert 方法封裝了最常見的測試任務 ,這些Assert方法極大地簡化了單元測試的編寫
(我擦,這不就意味着一些復雜的測試任務 得你自己來寫方法,自己去new,來進行測試)

3)Assert類包含了一組靜態的測試方法,用於驗證期望值expected和實際值actual邏輯比對是否正確,即測試失敗,標志為未通過測試。

如果期望值和實際值比對失敗,Assert類就會拋出一個AssertionFailedError異常,Junit測試框架將這種錯誤歸入Fails並且加以記錄。

每一個Assert類所屬的方法都會被重載(OverLoaded),如果指定了一個String類型的傳參則該參數將被做為AssertionFailedError異常的標識信息,告訴測試人員該異常的具體信息。

4)、第一
assertEquals(expected, actual, tolerance) 方法里如果傳了三個參數,那么 最后一個參數 就是一個誤差范圍,即實際值在這個誤差范圍之內 測試就會通過

在使用AssertEquals方法的時候,如果比較的2個參數是double或者float類型的時候,(計算表示浮點型數據都有一定的偏差)

在第3個參數我們還可以傳入一個誤差范圍。如果實際值在(期望值-誤差范圍)和(期望值+誤差范圍)內,那么測試通過。

當進行帶有輸入誤差和截斷誤差的數學運算時,或者當斷言一個關於文件修改日期的條件時,這些重載方法就很有用。

第二
fail()
讓測試方法失敗

注意:上面的每一個方法,都有一個重載的方法,可以在前面加一個String類型的參數,表示如果驗證失敗的話,將用這個字符串作為失敗的結果報告。

比如: assertEquals("Current user Id should be 1", 1, currentUser.id());

當 currentUser.id() 的值不是1的時候,在結果報道里面將顯示"Current user Id should be 1",這樣可以讓測試結果更具有可讀性,更清楚錯誤的原因是什么。

5)、 關於JUnit單元測試框架下 基於注解的 測試用例 為什么“不需要寫 main方法” 就能運行呢?
main方法是程序的入口,JUnit直接運行我們的 某個基礎注解的方法, 是可行的,說明main方法躲在某個隱蔽的位置了。
在測試方法中,對測試方法所在的類添加Spring的 (Compent注解或者為該類的成員變量添加)Resource注解並沒有什么卵用,
即Spring根本不會來掃描這個測試類,更不會為這個類注入屬性值。為什么這么說呢?因為Spring是在測試類中由被@Before標注的方法所啟動的,
這時候,JVM已經將此測試類實例化了,而這並不是由Spring實例化的,Spring晚了一步,所以在Spring的容器中並沒有此類的實例。
那么Junit4真的有main方法嗎?沒錯,既然它能直接運行我們的方法,那它必然自己為JVM提供了程序入口。其實在org.junit.runner包下,有個JUnitCore.class,
其中就有一個 標准的main方法,這就是JUnit入口函數。如此看來,它其實和我們直接在自己的main方法中跑我們要測試的方法在本質上是一樣的。



地址: http://www.cnblogs.com/yepei/p/5649352.html JUnit4單元測試的 高級用法
6)、 ; 基於注解的 JUnit生命周期 與 Tomcat的生命周期的區別: 晚上 再來弄
7)、為什么 在@test注解下的 測試方法是 public void的,既不能用private、static修飾,也不能用其他的數據類型如List等。一旦修改 便運行時出錯 無法找到這個類。

8)、 345。

一、Suit------它可以一次生執行全面在多個類中的測試用例

二、Parameterized (參數化的)------在普通的單元測試中被@Test注解標注的測試方法只能是public void的,且不能有任何輸入參數。而這時常會給我們造成困擾,因為有時候我們需要為測試方法輸入參數,甚至是批量指定多個待測參數。這時Parameterized這個Runner就能滿足我們的要求

三、Category(分類)------繼承自Suit,更強大,它可以讓我們對測試類中被測試的方法進行分類執行,例如Person對象具有一些屬性,這些屬性擁有get/set方法,同時還有一些普通方法。我們可以將獲取屬性的get方法和普通方法進行分類測試

四、Theories------雖意為原理或推測的意思,但我在這里以更直觀的方式表述它:提供一組參數的排列組合值作為待沒方法的輸入參數。同時注意到在使用Theories這個Runner的時候,我們的待測方法可以擁有輸入參數,而這在其它的Runner中的測試方法是不成的

五、有了上面幾個 JUnit運行器的使用,基本大部分測試需求都鞥得到解決。 小部分的可以用:Junit4提供的Rule/Assume/Assert等

第一、 其中使用Rule可以為單元測試指定測試規則,下面展示了這些可用的Rule:

Verifier: 驗證測試執行結果的正確性。

ErrorCollector: 收集測試方法中出現的錯誤信息,測試不會中斷,如果有錯誤發生測試結束后會標記失敗。

ExpectedException: 提供靈活的異常驗證功能。

Timeout: 用於測試超時的Rule。

ExternalResource: 外部資源管理。

TemporaryFolder: 在JUnit的測試執行前后,創建和刪除新的臨時目錄。

TestWatcher: 監視測試方法生命周期的各個階段。

TestName: 在測試方法執行過程中提供獲取測試名字的能力。

第二、Assume表示假設,但它實際上 是對沒有方法的 參數進行合法性校檢的 ,如果校檢不合格則直接拋出異常,而不執行測試
Assume提供的校檢規則如下:
assumetrue
assumeNotNull
assummeThat
assumeNotException
舉個例子: (通過以下代碼 也可以看到,要使用參數,你得使用@theory 注解)
@Theory
public void printAge(String name,int age){
Assume.assumeTrue(age>0); //如果桉樹 age<=0,會拋出 AssumetionViolatedException異常
System.out.Println(String.format("sdkjskdjlhfa",name,age))
}

第三、 Assert是Junit提供的斷言,與Assume不同,Assert是對測試結果的校驗,它提供的檢驗規則如下:

AssertTrue、AssertFalse:結果的true、false。

AssertThat:使用Matcher做自定義的校驗。

AssertEquals、AssertNotEquals:判斷兩個對象是否相等。

AssertNull、AssertNotNull:判斷對象是否為空。

AssertSame:判斷兩個對象是否為同一個,不同於equals這里是使用“==”判斷。

AssertArrayEquals:判斷兩個數組是否相等。

9)、Action類 主要定義了一些模擬用戶的鼠標 mouse,以及鍵盤keyBoard操作。 我們可以使用perform() 方法進行執行

第一、 一些前面沒用過的 Action類的鍵盤和鼠標事件:
clickAndHold() 在當前鼠標位置 點擊 (不釋放)

contextClick() 在當前鼠標位置執行上下文點擊

doubleClick() 在當前鼠標位置執行雙擊

dragAndDrog(source,target) 在源位置的位置執行點擊並保持,移動到目標元素的位置,然后釋放鼠標
參數: source-element(源元素) 用來模擬按鈕
target-element(目標元素)移動至目標元US 並釋放鼠標

dragAndDropBy(source,x-offset,y-offset) 同理上,將鼠標在源元素點擊 通過橫移豎移 到指定的目標的元素 釋放鼠標

keyDown(modifier_key) Performs a modifier key press.(就是可以按下像Shift、Ctrl等修飾鍵)

keyUp(修飾符_key) Performs a key release(釋放鍵盤上的 按鍵)

moveByOffset(x-offset,y-offset) Moves the mouse from its current position (or 0,0) by the given offset
(將鍵盤移動到指定的 橫豎偏移位置)

moveToElement(toElement) Moves the mouse to the middle of the element
(將鼠標移動到 元素的中間)

release() 釋放 按住的 鼠標左鍵

sendKeys(onElement,charsequence) 在元素上發送一連串按鍵。

第二、使用以上方法 可以進行 組合操作,比如復制某個地段、對一個元素進行拖放等
Action dragAndDrop = builder.clickAndHold(someElement) .moveToElement(otherElement) .release(otherElement) .build().perform();

 

登錄的簡單測試:

package com.xiaoxiao.bean.xiaomenghan;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class ALogin {
     public static WebDriver driver;
      public static String  baseURL="http://192.168.1.21:8080/sanxin.web3/a/Login.html";
    
    @Parameters("browser")
    @BeforeClass
    public void beforeTest(String browser) throws InterruptedException{
        if (browser.equalsIgnoreCase("firefox")) {
            System.setProperty("webdriver.firefox.marionette", "c:\\Program Files (x86)\\Mozilla Firefox\\gexkodriver.exe");
            driver=new FirefoxDriver();
            Thread.sleep(3000);
            System.out.println("成功啟動了火狐瀏覽器");
        }else if (browser.equalsIgnoreCase("chrome")) {
            System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
            driver=new ChromeDriver();
            Thread.sleep(3000);
            System.out.println("成功啟動了谷歌瀏覽器"+"開始進行測試");
        }
        driver.get(baseURL);  //放在if else語句塊外面更好
    }
    
    @DataProvider(name="Authentication") 
    public static Object[][] Authenticals(){
        return new Object[][]{{"139180782","12346"},{"1391807882","1234="},{"139180782","1234"},{"13918078822","123456"}}; //如何讓它執行兩個登陸名,就是連續登陸兩次
    }
    
    @Test(dataProvider="Authentication")
    public void Login(String username,String userpassword) throws InterruptedException{
       driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
       driver.findElement(By.id("username")).sendKeys(username);   //輸入框  輸入用戶名
       Thread.sleep(1000);
       driver.findElement(By.id("userpassword")).sendKeys(userpassword); //在輸入框 輸入密碼
       Thread.sleep(1000);
       driver.findElement(By.id("subbtn")).click();  //點擊"提交"按鈕
       Thread.sleep(1000);
       
       try {
        Assert.assertEquals(driver.findElement(By.xpath(".//*[text()='退出']")).getText(), "退出");
        System.out.println("測試 完美通過,成功登錄到三鑫油馬后台管理系統");
    } catch (Throwable e) {
        System.out.println("這是一個多么失敗的測試");
    }
       Thread.sleep(1000);
    }
    
    @AfterTest
    public void afterTest(){
        driver.close();
    }
}

XML文件如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<!-- parallel 就是並行平行的意思,如果將其參數值 改為 tests,打開的兩個瀏覽器同時進行 平行測試.為none就是瀏覽器一個一個地來-->

-<suite parallel="false" name="Suite">

<!-- 此處設置了火狐瀏覽器 <test name="FirefoxTest"> <parameter name="browser" value="firefox"></parameter> <parameter name="username" value="13918078822"></parameter> <parameter name="userpassword" value="123456"></parameter> <classes> <class name="com.xiaoxiao.SanXinTestNG2.TestMultiBrowser"></class> </classes> </test> -->


<!-- 此處設置了 谷歌瀏覽器 -->



-<test name="ChromeTest">

<parameter name="browser" value="chrome"/>

<parameter name="username" value="13918078822"/>

<parameter name="userpassword" value="123456"/>


-<classes>

<class name="com.xiaoxiao.SanXinTestNG2.TestMultiBrowser"/>

</classes>

</test>

</suite>

輸入用戶名和密碼的過程封裝起來,直接將需要輸入的用戶名和密碼通過二維數組表示出來,便於修改,便於進行登錄模塊的測試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM