Junit常用註解
阿新 • • 發佈:2018-12-09
Junit常用註解
0x01 摘要
本文簡要說下junit裡面常用註解的含義和使用,還會總結一些常用的Assert判斷語句。
0x02 常用Junit註解
2.1 @Test
用在方法上,定義該方法是測試方法。
注意:測試方法必須是public void
,但可以拋異常,不過一般不這麼做。
例子:
@Test (timeout = 30000)
public void testRMAppSubmitInvalidResourceRequest() throws Exception {
asContext.setResource(Resources.createResource (
YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_MB + 1));
// submit an app
try {
appMonitor.submitApplication(asContext, "test");
Assert.fail("Application submission should fail because resource" +
" request is invalid.");
} catch (YarnException e) {
// Exception is expected
// TODO Change this to assert the expected exception type - post YARN-142
// sub-task related to specialized exceptions.
Assert.assertTrue("The thrown exception is not" +
" InvalidResourceRequestException",
e.getMessage().contains("Invalid resource request" ));
}
}
2.2 @BeforeClass
2.2.1 含義
用來修飾所有@Test
方法之前只會執行一次的方法。
注意:需用public static void
修飾。
2.2.2 用途
當你的測試中多個方法都會用到的一些公共方法可以抽取到用@BeforeClass
修飾的方法彙總,如建立資料庫驅動等。
2.2.3 示例
@BeforeClass
public static void loadDriver(){
try {
Class.forName("org.apache.phoenix.queryserver.client.Driver");
} catch (ClassNotFoundException e) {
logger.error("an exception happened while load driver:", e);
}
}
2.3 @AfterClass
2.3.1 含義
@AfterClass
和前面提到的@BeforeClass
類似,但是在所有@Test
方法之後執行一次。
注意:需用public static void
修飾。
2.3.2 用途
一般他被來處理一些資源清理工作,如關閉資料庫連線等。
2.3.3 示例
@AfterClass
public static void closeConnections(){
for(Connection conn : connectionList){
try {
conn.close();
} catch (SQLException e) {
logger.error("an exception happened while close connection:", e);
}
}
}
2.4 @Before
2.4.1 含義
@Before
與@BeforeClass
類似,他們最大區別在於@Before
會在每個@Test
方法執行之前都會執行一次。
注意:必須用public void
修飾,不能加static
。
2.4.2 用途
用於每個測試用例都需要的單獨的方法,比如獲取插入一條記錄到資料。
2.4.3 示例
@Before
public void setUp() {
long now = System.currentTimeMillis();
rmContext = mockRMContext(1, now - 10);
ResourceScheduler scheduler = mockResourceScheduler();
Configuration conf = new Configuration();
ApplicationMasterService masterService =
new ApplicationMasterService(rmContext, scheduler);
appMonitor = new TestRMAppManager(rmContext,
new ClientToAMTokenSecretManagerInRM(), scheduler, masterService,
new ApplicationACLsManager(conf), conf);
appId = MockApps.newAppID(1);
RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(null);
asContext =
recordFactory.newRecordInstance(ApplicationSubmissionContext.class);
asContext.setApplicationId(appId);
asContext.setAMContainerSpec(mockContainerLaunchContext(recordFactory));
asContext.setResource(mockResource());
setupDispatcher(rmContext, conf);
}
2.5 @After
2.5.1 含義
@After
與@AfterClass
類似,他們最大區別在於@After
會在每個@Test
方法執行之後都會執行一次。
注意:必須用public void
修飾,不能加static
。
2.5.2 用途
可以用來清理每個@Test
用@Before
建立的單獨資源、恢復測試初始狀態等。
2.5.3 示例
@After
public void tearDown() {
setAppEventType(RMAppEventType.KILL);
((Service)rmContext.getDispatcher()).stop();
}
2.6 @Runwith
2.6.1 含義
首先要分清幾個概念:測試方法、測試類、測試集、測試執行器:
- 其中測試方法就是用
@Test
註解的一些函式 - 測試類是包含一個或多個測試方法的一個
Test.java
檔案 - 測試集是一個
suite
,可能包含多個測試類 - 測試執行器則決定了用什麼方式偏好去執行這些測試集/類/方法
而@Runwith就是放在測試類名之前,用來確定這個類怎麼執行的。也可以不標註,會使用預設執行器。
常見的執行器有:
- @RunWith(Parameterized.class) 引數化執行器,配合@Parameters使用junit的引數化功能
- @RunWith(Suite.class)
@SuiteClasses({ATest.class,BTest.class,CTest.class})
測試集執行器配合使用測試集功能
- @RunWith(JUnit4.class)
junit4的預設執行器
- @RunWith(JUnit38ClassRunner.class)
用於相容junit3.8的執行器
- 一些其它執行器具備更多功能。例如@RunWith(SpringJUnit4ClassRunner.class)集成了spring的一些功能
2.7 @Parameters
用於使用引數化功能。