目錄
- 1.Junit介紹
-
- 1.1 JUnit3與JUnit4的差別
- 1.2 JUnit中的注解
- 2.邏輯覆寫
-
- 2.1 邏輯覆寫中的不同覆寫标準
- 2.2 樣例代碼
- 2.3 設計測試用例
- 2.4 使用JUnit測試架構的測試代碼
1.Junit介紹
Junit是XUnit系列的一個單元測試架構,是用于Java下的,同理還有CppUnit,pyUnit。
1.1 JUnit3與JUnit4的差別
這裡使用的版本是JUnit4,與JUnit3相區分開來,簡單來說。在Junit3中,如果某個類是測試類,必須将其繼承類TestCase,如果某個方法是測試方法,必須讓這個方法以test開頭,如果希望指定某個測試方法運作之前運作某個初始化方法,這個方法的名稱必須是setUp,如果希望在某個測試方法運作之後運作某個釋放資源的方法,這個方法的名稱必須是tearDown。
在junit4中,測試方法通過@Test來辨別,初始化方法通過@Before來辨別,釋放資源的方法通過@After來辨別,但是為了讓junit4的測試類在junit3中也可以使用,習慣于把初始化方法命名為setUp,釋放資源的方法命名為tearDown。Test中的測試方法一般以Test來開始。其中辨別為Before注解的方法,每次運作測試類,都會執行辨別為@After與@Before的方法。
1.2 JUnit中的注解
注解就好像你可以在你的代碼中添加并且在方法或者類中應用的元标簽。
JUnit 中的這些注解為我們提供了測試方法的相關資訊,哪些方法将會在測試方法前後應用,哪些方法将會在所有方法前後應用,哪些方法将會在執行中被忽略。
JUnit 中的注解的清單以及他們的含義:
序号 | 注解 | 描述 |
---|---|---|
1 | @Test | 這個注解說明依附在 JUnit 的 public void 方法可以作為一個測試案例。 |
2 | @Before | 有些測試在運作前需要創造幾個相似的對象。在 public void 方法加該注解是因為該方法需要在 test 方法前運作。 |
3 | @After | 如果你将外部資源在 Before 方法中配置設定,那麼你需要在測試運作後釋放他們。在 public void 方法加該注解是因為該方法需要在 test 方法後運作。 |
4 | @BeforeClass | 在 public void 方法加該注解是因為該方法需要在類中所有方法前運作。 |
5 | @AfterClass | 它将會使方法在所有測試結束後執行。這個可以用來進行清理活動。 |
6 | @Ignore | 這個注解是用來忽略有關不需要執行的測試的。 |
2.邏輯覆寫
邏輯覆寫是白盒測試中動态測試中的一種典型方法,常用于單元測試。軟體測試的方法根據是否透明分為黑盒測試和白盒測試兩大類(灰盒測試這裡不做讨論),也就是白盒測試專注于過程性的測試,黑盒測試專注于結果功能的是否實作。其中白盒測試根據是否執行代碼可分為靜态測試和動态測試,這裡的邏輯覆寫就是一種典型的動态測試方法。那麼白盒測試中的靜态測試大家可想而知其實就是不運作代碼去檢查代碼中的bug了。
2.1 邏輯覆寫中的不同覆寫标準
邏輯覆寫可分為六種覆寫标準:其中為語句覆寫、判定覆寫、條件覆寫、條件判定覆寫、條件組合覆寫、路徑覆寫。其中覆寫的強度依據上面的順序依次增強。
判定覆寫:設計若幹測試用例,運作被測試程式,使得每一條可執行程式至少執行一次。
判定覆寫:設計若幹測試用例,運作被測程式,使程式中的每個判斷的每個條件的每個可能取值至少執行一次。
條件覆寫:設計足夠多的測試用例,運作被測程式,使程式中每個判斷的每個條件的每個可能取值至少執行一次。
判定條件覆寫:設計足夠多的測試用例,運作被測程式,使程式中每個判斷的每個條件的可能取值至少執行一次,并且每個可能得判斷結果也至少執行一次,即要求各個判斷的所有可能的取值組合至少執行一次。
條件組合覆寫:設計足夠多的測試用例,運作被測程式,使程式中每個判斷的所有可能的條件取值組合至少執行一次。
路徑覆寫:選取足夠多的測試資料,使程式的每條可能路徑都至少執行一次(如果程式圖中有環,則要求每個環至少經過一次)。
2.2 樣例代碼
//Example.java
public class Example {
public int logicTest(int x, int y) {
int magic = 0;
if( x > 0 && y > 0) {
magic = x + y + 10;
}else {
magic = x + y - 10;
}
if( magic < 0 ) {
magic = 0;
}
return magic;
}
}
//原創于CSDN部落格Credic1017使用者
2.3 設計測試用例
1.對于語句覆寫,我們隻需要一個測試用例就可滿足标準:
測試用例1:預期輸入x=1,y=1,預期輸出magic=12.
2.對于判定覆寫,我們需要第一個判斷和第二個判斷都分别取一次True和False。故這裡至少需要兩個測試用例來滿足判定覆寫:
測試用例2:預期輸入x=2,y=2,預期輸出magic=14(滿足第一個判斷為True,第二個判斷為False)
測試用例3:預期輸入x=3,y=-1,預期輸出magic=0(滿足第一個判斷為False,第二個判斷為True)
3.條件覆寫,我們這裡需要滿足6個條件,分别為:x>0,x≤0,y>0,y≤0,magic<0,magic≥0。易發現這裡至少兩個測試用例也可滿足條件覆寫标準。
測試用例4:預期輸入x=3,y=3,預期輸出magic=16(滿足條件x>0,y>0,magic≥0)
測試用例5:預期輸入x=0,y=0,預期輸出magic=0(滿足條件x≤0,y≤0,magic<0)
4.條件判定覆寫,這裡的話其實就是同時滿足判定覆寫和條件覆寫,具體可見上面關于條件判定覆寫的理論。這裡也隻需要兩個測試用例便可完成。
測試用例6:預期輸入x=4,y=4,預期輸出magic=18(滿足條件x>0,y>0,magic≥0,第一個判斷裡面為True,第二個判斷裡面為False)
測試用例7:預期輸入x=-1,y=0,預期輸出magic=-1(滿足條件x≤0,y≤0,magic<0,第一個判斷裡面為False,第二個判斷裡面為True)
5.條件組合覆寫,第一個判斷裡面可取TT、TF、FT、FF的一個組合情況,第二個判斷裡面可取T、F的一個情況,故這裡至少需要四個測試用例才能滿足。
測試用例8:預期輸入x=2,y=3,預期輸出magic=15
測試用例9:預期輸入x=2,y=-1,預期輸出magic=0
測試用例10:預期輸入x=-1,y=20,預期輸出magic=9
測試用例11:預期輸入x=-2,y=-3,預期輸出magic=0
6.路徑覆寫:這裡是對他的一個路徑進行一個覆寫,需要先畫出程式的控制流程圖,然後通過公式計算出路徑的條數。理論上的路徑條數有四條,但是有一條走不通,故這裡隻有三條路徑。
測試用例12:預期輸入x=2,y=4,預期輸出magic=16
測試用例13:預期輸入x=-30,y=10,預期輸出magic=0
測試用例14:預期輸入x=-10,y=30,預期輸出magic=10
2.4 使用JUnit測試架構的測試代碼
package logicTest;
import org.junit.Before;
import org.junit.Test;
import junit.framework.TestCase;
public class ExampleTest {
Example c = null;
@Before
public void beforeClass() {
c = new Example();
}
@Test
//語句覆寫
public void testStatementCoverage(){
int result = c.logicTest(1, 1);
TestCase.assertEquals(result, 12);
}
@Test
//判定覆寫
public void testDecisionCoverage(){
int result = c.logicTest(2, 2);
TestCase.assertEquals(result, 14);
result = c.logicTest(3, -1);
TestCase.assertEquals(result, 0);
}
@Test
//條件覆寫
public void testConditionCoverage() {
int result = c.logicTest(3, 3);
TestCase.assertEquals(result, 16);
result = c.logicTest(0, 0);
TestCase.assertEquals(result, 0);
}
@Test
//條件判定覆寫
public void testConditionalDecisionCoverage() {
int result = c.logicTest(4, 4);
TestCase.assertEquals(result, 18);
result = c.logicTest(-1, -1);
TestCase.assertEquals(result, 0);
}
@Test
//條件組合覆寫
public void testConditionCombinationCoverage() {
int result = c.logicTest(2, 3);
TestCase.assertEquals(result, 15);
result = c.logicTest(2, -1);
TestCase.assertEquals(result, 0);
result = c.logicTest(-1, 20);
TestCase.assertEquals(result, 9);
result = c.logicTest(-2, -3);
TestCase.assertEquals(result, 0);
}
@Test
//路徑覆寫
public void testPathCoverage() {
int result = c.logicTest(2, 4);
TestCase.assertEquals(result, 16);
result = c.logicTest(-30, 10);
TestCase.assertEquals(result, 0);
result = c.logicTest(-10, 30);
TestCase.assertEquals(result, 10);
}
}
//原創于CSDN部落格Credic1017使用者
下面是使用eclipse右鍵選擇運作方式選擇JUnit測試,得到的運作結果如下:(綠色代表運作通過,紅色代表運作未通過,故障次數代表測試用例出錯的次數,錯誤代表程式本身的錯誤個數,如果有故障存在可通過故障跟蹤來定位故障。)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLyIGNyIzNhNzN5Y2Y5EGN4MDZjRTZ1Q2NmZGNwAzN0Y2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
以上就是關于邏輯覆寫在eclipse中應用JUnit架構進行單元測試的一個總的流程,謹以此文記錄學習軟體測試邏輯覆寫測試過程中的一個心路曆程,如有錯誤歡迎指正!