按照上一篇的計劃,這一篇給小夥伴們分享一下測試方法。html
測試方法是能夠帶有參數的。每一個測試方法均可以帶有任意數量的參數,而且能夠經過使用TestNG的@Parameters向方法傳遞正確的參數。java
設置方式有兩種方法:使用testng.xml或者Data Providers 。mysql
這種方法讓咱們在testng.xml文件中,定義簡單的參數,而後在源碼文件引用這些參數。正則表達式
1.若是隻使用相對簡單的參數,能夠在 testng.xml文件中指定:sql
package hongge; import org.testng.annotations.Test; import static org.testng.Assert.assertEquals; import hongge.TestSum; /** * @author 北京-宏哥 * * java自動化測試交流羣:694280102 * * Java自動化測試框架-03 - TestNG之Test Method篇 * * 2019年10月23日 */ @Parameters({ "first-name" }) @Test public void testSingleString(String firstName) { System.out.println("Invoked testString " + firstName); assert "Cedric".equals(firstName); }
在這段代碼中,咱們讓 firstName 參數可以接到XML文件中叫作 first-name 參數的值。這個XML參數被定義在 testng.xml:數據庫
相似的,它也能夠用在 @Before/After 和 @Factory 註解上:數組
此次有兩個Java參數 ds 和 driver 會分別接收到來自屬性datasource 和 jdbc-driver 所指定的值。微信
2.參數也能夠經過 Optional 註釋來聲明:框架
若是在你的testng.xml文件中沒有找到"db",你的測試方法就會使用 @Optional 中的值:"MySQL"。ide
3.@Parameters 能夠被放置到以下位置:
(1)在任何已經被 @Test, @Before/After 或 @Factory 註解過的地方。
(2)在測試類中至多被放到一個構造函數籤。這樣,TestNG才能在須要的時候使用 testng.xml 中特定的參數來實例化這個類。這個特性能夠被用做初始化某些類中的值,以便稍後會被類中其餘的方法所使用。
注意:
XML中的參數會按照Java參數在註解中出現的順序被映射過去,而且若是數量不匹配,TestNG會報錯。
參數是有做用範圍的。在testng.xml 中,你便可以在<suite> 標籤下聲明,也能夠在 <test>下聲明。若是兩個參數都有相同的名字,那麼,定義在<test> 中的有優先權。這在你須要覆蓋某些測試中特定參數的值時,會很是方便。
在testng.xml 中指定參數可能會有以下的不足:
1.若是你壓根不用 testng.xml.
2.你須要傳遞複雜的參數,或者從Java中建立參數(複雜對象,對象從屬性文件或者數據庫中讀取的etc...)或者在testng.xml中指定參數可能不夠
這樣的話,你就可使用Data Provider來給須要的測試提供參數。所謂數據提供者,就是一個能返回對象數組的數組的方法,而且這個方法被@DataProvider註解標註:
DataProvider的定義以下:
package hongge; import org.testng.annotations.Test; import static org.testng.Assert.assertEquals; import hongge.TestSum; /** * @author 北京-宏哥 * * java自動化測試交流羣:694280102 * * Java自動化測試框架-03 - TestNG之Test Method篇 * * 2019年10月23日 */ @DataProvider(name = "range-provider") public Object[][] rangeData() { int lower = 5; int upper = 10; return new Object[][] { { lower-1, lower, upper, false }, { lower, lower, upper, true }, { lower+1, lower, upper, true }, { upper, lower, upper, true}, { upper+1, lower, upper, false }, }; }
調用DataProvider的方式以下:
package hongge; import org.testng.annotations.Test; import static org.testng.Assert.assertEquals; import hongge.TestSum; /** * @author 北京-宏哥 * * java自動化測試交流羣:694280102 * * Java自動化測試框架-03 - TestNG之Test Method篇 * * 2019年10月23日 */ @Test(dataProvider = "range-provider") public void testIsBetween(int n, int lower,int upper, boolean expected){ println("Received " + n + " " + lower + "-"+ upper + " expected: " + expected); Assert.assertEquals(expected, isBetween(n, lower, upper)); }
被@Test標註的方法經過dataProvider屬性指明其數據提供商。這個名字必須與@DataProvider(name="...")中的名字相一致。
DataProvider返回的是一個Object的二維數組,二維數組中的每一個一維數組都會傳遞給調用函數,做爲參數使用。運行的時候,會發現, @Test標識的test method被執行的次數和object[][]包含的一維數組的個數是一致的,而@Test標識的函數的參數個數,也和object內一維數組內的元素數是一致的。
運行後的輸出結果以下:
Received 4 5-10expected: false
Received 5 5-10expected: true
Received 6 5-10expected: true
Received 10 5-10expected: true
Received 11 5-10expected: false
===============================================
Parameter Suite
Total tests run: 5,Failures: 0, Skips: 0
===============================================
默認的狀況下,數據提供者會查找當前的測試類或者測試類的基類。若是你但願它可以被其餘的類所使用,那麼就要將其指定爲static,而且經過 dataProviderClass 屬性指定要使用的類:
package hongge; import org.testng.annotations.Test; import static org.testng.Assert.assertEquals; import hongge.TestSum; /** * @author 北京-宏哥 * * java自動化測試交流羣:694280102 * * Java自動化測試框架-03 - TestNG之Test Method篇 * * 2019年10月23日 */ public static class StaticProvider { @DataProvider(name = "create") public static Object[][] createData() { return new Object[][] { new Object[] { new Integer(42) } } } } public class MyTest { @Test(dataProvider = "create", dataProviderClass = StaticProvider.class) public void test(Integer n) { // ... } }
Data Provider方法能夠返回以下兩種類型中的一種:
1.含有多個對象的數組 (Object[][]),其中第一個下標指明瞭測試方法要調用的次數,第二個下標則徹底與測試方法中的參數類型和個數相匹配。上面的例子已經說明。
2.另一個是迭代器 Iterator<Object[]>。兩者的區別是迭代器容許你延遲建立本身的測試數據。TestNG會調用迭代器,以後測試方法會一個接一個的調用由迭代器返回的值。在你須要傳遞不少參數組給測試組的時候,這樣你無須提早建立一堆值。
下面是使用JDK5 的例子 (注意 JDK 1.4的例子不適用泛型):
若是你聲明的 @DataProvider 使用 java.lang.reflect.Method 做爲第一個參數,TestNG 會把當前的測試方法當成參數傳給第一個參數。這一點在你的多個測試方法使用相同的@DataProvider的時候,而且你想要依據具體的測試方法返回不一樣的值時,特別有用。
例如,下面的代碼它內部的 @DataProvider 中的測試方法的名字:
因此會顯示:
test1
test2
Data provider能夠經過屬性 parallel實現並行運行:
使用XML文件運行的data provider享有相同的線程池,默認的大小是10.你能夠經過修改該在 <suite> 標籤中的值來更改:
<suitename="Suite1" data-provider-thread-count="20" > ...
若是你須要讓指定的幾個data provider運行在不一樣的線程中,那麼就必須經過不一樣的xml文件來運行。
優勢:值在testng.xml中指定,這方便修改,不須要從新編譯代碼 ;
缺點:你須要一個testng.xml文件,值不可以動態算出
優勢:能夠想測試方法傳遞任何有效的Java類型這種方法很是靈活,值能夠經過Java代碼動態算出,或者任何存儲機制中取得
缺點:這種方法須要實現某些邏輯,以返回正確的對象
有些時候,須要按照特定順序調用測試方法。
1.確保在進行更多的方法測試以前,有必定數量的測試方法已經成功完成。
2.在初始化測試的時候,同時但願這個初始化方法也是一個測試方法( @Before/After 不會出如今最後生成的報告中)。
爲此,你可使用 @Test 中的 dependsOnMethods 或 dependsOnGroups 屬性。
這兩種依賴:
1.Harddependencies(硬依賴)。全部的被依賴方法必須成功運行。只要有一個出問題,測試就不會被調用,而且在報告中被標記爲SKIP。
2.Softdependencies(軟依賴)。 即使是有些依賴方法失敗了,也同樣運行。若是你只是須要保證你的測試方法按照順序執行,而不關心他們的依賴方法是否成功。那麼這種機制就很是有用。能夠經過添加 "alwaysRun=true" 到 @Test 來實現軟依賴。
硬依賴的例子:
此例中,method1() 依賴於方法 serverStartedOk(),從而保證 serverStartedOk() 老是先運行。
也可讓若干方法依賴於組:
本例中,method1()依賴於匹配正則表達式"init.*"的組,由此保證了serverStartedOk()和initEnvironment()老是先於method1()被調用。
注意:正如前面所說的那樣,在相同組中的調用但是在誇測試中不保證順序的。
若是你使用硬依賴,而且被依賴方法失敗(alwaysRun=false,即默認是硬依賴),依賴方法則不是被標記爲FAIL而是SKIP。被跳過的方法會被在最後的報告中標記出來(HTML既不用紅色也不是綠色所表示),主要是被跳過的方法不是必然失敗,因此被標出來作以區別。
不管dependsOnGroups仍是dependsOnMethods均可以接受正則表達式做爲參數。對於dependsOnMethods,若是被依賴的方法有多個重載,那麼全部的重載方法都會被調用。若是你只但願使用這些重載中的一個,那麼就應該使用dependsOnGroups。
一般 @Test 也能夠用來標註類,而不只僅是方法:
處於類級的 @Test 會使得類中全部的public方法成爲測試方法,而無論他們是否已經被標註。固然,你仍然能夠用 @Test 註解重複標註測試方法,特別是要爲其添加一些特別的屬性時。
例如:
上例中 test1() 和 test2() 都被處理,不過在此之上 test2() 如今還屬於組 "g1"。
嘿嘿!今天就分享到這裏。下一篇計劃是測試方法(Factory),但願小夥伴們和童鞋們喜歡和繼續關注宏哥!
有問題加入java自動化測試交流羣:694280102
我的公衆號 微信羣 (微信羣已滿100,能夠加宏哥的微信拉你進羣,請備註:進羣)
您的確定就是我進步的動力。若是你感受還不錯,就請鼓勵一下吧!記得點波 推薦 哦!!!(點擊右邊的小球便可!(^__^) 嘻嘻……)