摘要:執(zhí)行順序,包含和兩種形式,剛好對應(yīng)各階段的初始化和清理另外和可以定義不同的組合,比如指定某個功能模塊,或者以提測版本號將測試類方法分組
1 執(zhí)行順序
suit -> class -> method,包含before和after兩種形式,剛好對應(yīng)各階段的初始化(setup)和清理(teardown)
另外test 和 groups可以定義不同的組合,比如指定某個功能模塊(package),或者以提測版本號將測試類/方法分組
import org.testng.Assert; import org.testng.annotations.*; public class App { private void log(String action) { final String FORMATTER = "===== %-20s ====="; System.out.println(String.format(FORMATTER, action)); } @BeforeSuite public void beforeSuit() { log("before suit"); } @AfterSuite public void afterSuit() { log("after suit"); } @BeforeClass public void beforeClass() { log("before class"); } @AfterClass public void afterClass() { log("after class"); } @BeforeMethod public void beforeMethod() { log("before method"); } @AfterMethod public void afterMethod() { log("after method"); } @Test public void testAdd() { log("test add"); Assert.assertEquals(4, 1 + 3); } } --------------------------------------------------- ===== before suit ===== ===== before class ===== ===== before method ===== ===== test add ===== ===== after method ===== ===== after class ===== ===== after suit =====
另外,除了@Test注解可以出現(xiàn)多次外,before/after + suit/test/class/method等也可以出現(xiàn)多次,不過貌似沒多大意義
2 @Test參數(shù) 2-1 enabled測試方法是否生效,默認(rèn)為true;如果不希望執(zhí)行,可以置為false
@Test(enabled = false)2-2 dependsOnMethods/dependsOnGroups
測試方法的上游依賴,如果依賴的對象執(zhí)行失敗,則該測試方法不執(zhí)行(skip)
public class App { private void log(String action) { final String FORMATTER = "===== %-20s ====="; System.out.println(String.format(FORMATTER, action)); } @Test(dependsOnMethods = {"upMethod"}) public void downMethod() { log("run down method"); Assert.assertEquals(2, 1+1); } @Test public void upMethod() { log("run up method"); Assert.assertEquals(3, 5/3); } } ------------------------------------------------ =============================================== Default Suite Total tests run: 2, Failures: 1, Skips: 1 ==============================================2-3 expectedExceptions
Assert無法實(shí)現(xiàn)異常的校驗(yàn),但無法避免異常的發(fā)生,或者希望人為地拋出異常,因此需要借助此參數(shù)
public class App { @Test(expectedExceptions = {java.lang.ArithmeticException.class}) public void testExcption() { int a = 5 / 0; } }2-4 dataProvider
方法引用的測試數(shù)據(jù),避免同一個方法書寫多次,可以設(shè)計為數(shù)據(jù)驅(qū)動
public class App { @DataProvider(name = "data") public Object[][] data() { return new Object[][] { {1, 1}, {2, 4}, {3, 9}, }; } @Test(dataProvider = "data") public void testSquare(int num, int expected) { int result = num * num; Assert.assertEquals(result, expected); } }3 @DataProvider
測試方法的數(shù)據(jù)提供者,必須返回Object[][]對象
包含2個參數(shù):
name,唯一命名,且測試方法的dataProvider與其一致;如果為空,默認(rèn)為方法名
parallel,默認(rèn)為false;在并行執(zhí)行不影響測試執(zhí)行時,設(shè)置為true可以提高任務(wù)的執(zhí)行效率
3-1 由其他類提供數(shù)據(jù)測試方法查找指定的dataProvider時,默認(rèn)是當(dāng)前類及其父類
如果數(shù)據(jù)由其他類提供,則需指定dataProviderClass,并且由@DataProvider注解的方法必須為static
public class App { @Test(dataProvider = "data", dataProviderClass = DataDriver.class) public void testSquare(int num, int expected) throws InterruptedException { int result = num * num; Assert.assertEquals(result, expected); } } class DataDriver { @DataProvider(name = "data", parallel = true) public static Object[][] data() { return new Object[][] { {1, 1}, {2, 4}, {3, 9}, }; } }3-2 帶參數(shù)的DataProvider
多個測試方法可以指定同一個DataProvider
DataProvider支持將Method作為第一個參數(shù),根據(jù)不同的方法讀取不同的數(shù)據(jù)文件,如Excel、Txt
public class App { @Test(dataProvider = "dp", dataProviderClass = DataDriver.class) public void test_1(String arg) { System.out.println("== run test-1"); Assert.assertTrue(arg != null); } @Test(dataProvider = "dp", dataProviderClass = DataDriver.class) public void test_2(String arg) { System.out.println("== run test-2"); Assert.assertTrue(arg != null); } } class DataDriver { @DataProvider(name = "dp") public static Object[][] data(Method method) { System.out.println(method.getName()); return new Object[][]{ {"java"}, }; } } ---------------------------------------------------- test_1 == run test-1 test_2 == run test-24 @Parameters
加載環(huán)境變量
比如在初始化時,根據(jù)提供的參數(shù)區(qū)分開發(fā)環(huán)境與測試環(huán)境
@Parameters(value = {"jdbcUrl"}) @BeforeSuite public void initSuit(String jdbcUrl) { String jdbcurl = jdbcUrl; }
那么parameter的值在哪設(shè)置呢? ——testng.xml
...
當(dāng)然與jenkins結(jié)合會更妙
Parameters are scoped. In testng.xml, you can declare them either under a5 @Factorytag or under . If two parameters have the same name, it"s the one defined in that has precedence. This is convenient if you need to specify a parameter applicable to all your tests and override its value only for certain tests.* test標(biāo)簽下的參數(shù)優(yōu)先級高于suit
動態(tài)創(chuàng)建測試類
拿官網(wǎng)例子來講:編寫一個方法實(shí)現(xiàn)多次訪問同一網(wǎng)頁
// 官網(wǎng)使用了parameter,然后需要在testng.xml中配置多個參數(shù)值,實(shí)屬麻煩 public class TestWebServer { @Test(parameters = { "number-of-times" }) public void accessPage(int numberOfTimes) { while (numberOfTimes-- > 0) { // access the web page } } }
那么使用@Factory將簡化配置
public class WebTest { private int m_numberOfTimes; public WebTest(int numberOfTimes) { m_numberOfTimes = numberOfTimes; } @Test public void testServer() { for (int i = 0; i < m_numberOfTimes; i++) { // access the web page } } } ----------------------------------------------------- public class WebTestFactory { @Factory public Object[] createInstances() { Object[] result = new Object[10]; for (int i = 0; i < 10; i++) { result[i] = new WebTest(i * 10); } return result; } }
通過@Factory動態(tài)創(chuàng)建測試類,返回Object[]對象 —— 包含一組測試類實(shí)例,框架會自動運(yùn)行每個實(shí)例下的測試方法
不過,雖然簡化了配置,但并不是指不用配置,需要在testng.xml中指定工廠類
但是細(xì)想一下,測試方法的參數(shù)化可以通過@DataProvider實(shí)現(xiàn)
我理解的二者區(qū)別如下:
@Factory實(shí)現(xiàn)測試類的動態(tài)創(chuàng)建,@DataProvider改變測試方法的實(shí)參
@Factory實(shí)例化的類及屬性對所有測試方法有效
@Factory和@DataProvider可以一起使用,花式組合數(shù)據(jù)
6 @Ignore應(yīng)用于測試類,忽略該類下所有的測試方法
相當(dāng)于@Test(enabled=false),不過是批量的
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/72498.html
摘要:類似于特別是,但它不是框架的擴(kuò)展相較于而言,功能更強(qiáng)大,使用起來更加方便,比較適合測試人員來進(jìn)行集成測試或是接口回歸測試。自帶生成的測試報告不太美觀,可以使用進(jìn)行美化。 TestNG是一個開源自動化測試框架,TestNG表示下一代(Next Generation的首字母)。 TestNG類似于JUnit(特別是JUnit 4),但它不是JUnit框架的擴(kuò)展,相較于Junit而言,功能更...
摘要:前言監(jiān)聽,捕捉的行為,并支持修改,用于定制化,如日志輸出自定義報告監(jiān)聽器如下,只支持注解轉(zhuǎn)換,支持,,等注解轉(zhuǎn)換,比第一代更全面,替代測試方法,并提供回調(diào)函數(shù),常用于權(quán)限校驗(yàn),監(jiān)聽形為,代增加上下文參數(shù),攔截器,調(diào)整測試方法的執(zhí)行順序,執(zhí)行 1 前言 監(jiān)聽(Listeners),捕捉Testng的行為,并支持修改,用于定制化,如日志輸出、自定義報告 監(jiān)聽器如下: IAnnotatio...
摘要:單元測試因?yàn)楣締卧獪y試覆蓋率需要達(dá)到,所以進(jìn)行單元測試用例編寫。測試的時候可以把每個判斷分支都走到。同這句代碼,可以通過如此一個對象,使用以上方法基本上可以編寫所有代碼的測試類。編寫測試一定程度上可以發(fā)現(xiàn)代碼錯誤,可以借此重構(gòu)代碼。 3.springboot單元測試因?yàn)楣締卧獪y試覆蓋率需要達(dá)到80%,所以進(jìn)行單元測試用例編寫。多模塊項(xiàng)目的因?yàn)闀?jīng)常調(diào)用其他服務(wù),而且避免數(shù)據(jù)庫操作對...
摘要:地址可以用來覆蓋掉來自于系統(tǒng)環(huán)境變量系統(tǒng)屬性的屬性。同時優(yōu)先級高于。利用它我們可以很方便的在測試代碼里微調(diào)模擬配置比如修改操作系統(tǒng)目錄分隔符數(shù)據(jù)源等。源代碼例子使用工具也可以和一起使用。源代碼見參考文檔 Github地址 @TestPropertySource可以用來覆蓋掉來自于系統(tǒng)環(huán)境變量、Java系統(tǒng)屬性、@PropertySource的屬性。 同時@TestPropertySou...
閱讀 3447·2021-11-24 09:39
閱讀 3213·2021-09-09 11:34
閱讀 3380·2021-09-07 09:58
閱讀 2446·2019-08-30 13:07
閱讀 3029·2019-08-29 15:09
閱讀 1745·2019-08-29 13:01
閱讀 2476·2019-08-26 12:18
閱讀 2126·2019-08-26 10:28