2018年1月25日 星期四

基本的 Annotation (JUnit4 一)

官網連結,左下有很多連結,JavaDocs 是 API

※設定

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

※會依賴 hamcrest-core 1.3,此包可以使用 Matcher,這樣子 assertThat 方法就可以使用了

※JUnit 不可以用在多執行緒,main 執行緒一跑完,其他的執行緒也沒了,解決方法如下:
1.可以在主執行緒寫 sleep 睡久一點,超過其他執行緒的時間就可以了

2.使用 join,讓其他執行緒先跑完,如「執行緒名稱」.join(),就會先執行完該執行緒才會執行其他執行緒,如果有 5 個執行緒,那5個都得這樣做

3.使用 CountDownLatch 類別, 裡面有 await 和 countDown 方法

可看 JUnitCore 裡的 main 方法,使用的是 System.exit



※@BeforeClass、@Before、@AfterClass、@After、@Test、@Ignore

@BeforeClass
public static void start1() {
    System.err.println("class之前執行1");
}
    
@BeforeClass
public static void start2() {
    System.err.println("class之前執行2");
}
    
@Before
public void begin1() {
    System.out.println("方法之前執行1");
}
    
@Before
public void begin2() {
    System.out.println("方法之前執行2");
}
    
@After
public void end1() {
    System.out.println("方法之後執行1");
}
    
@After
public void end2() {
    System.out.println("方法之後執行2\r\n");
}
    
@AfterClass
public static void theEnd1() {
    System.err.println("class之後執行1");
}
    
@AfterClass
public static void theEnd2() {
    System.err.println("class之後執行2");
}
    
@Test
public void bruceTest1() {
    System.out.println("測試1");
}
    
@Test
public void bruceTest2() {
    System.out.println("測試2");
}
    
@Ignore
@Test
public void bruceTest3() {
    System.out.println("測試3");
}

※結果(注意執行順序):
class之前執行2
class之前執行1
方法之前執行2
方法之前執行1
測試1
方法之後執行1
方法之後執行2

方法之前執行2
方法之前執行1
測試2
方法之後執行1
方法之後執行2

class之後執行1
class之後執行2

※@BeforeClass、@AfterClass 一定要 static,錯誤會提示

※@BeforeClass、@AfterClass、@Before、@After、@Test,都只能寫在方法上,而且都沒有參數,也沒有回傳值,也都只能是 public

※@Test 才會執行,但如果又加上 @Ignore 就會忽略

※寫@Ignore 和不寫@Test 的差別如下圖:
紅框會發現有 skipped,此行表示執行了 3 個@Test 的方法,但有一個忽略了,第二個紅框有可以發現圖示是白色的;如果不寫@Test,那就什麼都沒有



※@Test、@Ignore 的參數

@Test(expected = ArithmeticException.class)
public void bruceTest1() {
    System.out.println(1 / 0);
}
    
@Test(timeout = 1000)
public void bruceTest2() {
    try {
        Thread.sleep(1100);
        System.out.println("哈哈哈");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
    
@Ignore("忽略理由")
@Test
public void bruceTest3() {
    System.out.println("測試3");
}

※@Ignore 可以寫在方法或類別上,忽略方法或忽略整個類別,參數可以寫忽略的理由

※@Test 的屬性 timeout 的單位是毫秒,如果超過這個時間就會報錯

※@Test 的屬性 expected 是預期會出現的 Exception,如果不出現就會報錯

沒有留言:

張貼留言