1. 單元測試的基本概念
-
單元(Unit):軟件系統的基本組成單位,可以是函數、模塊、方法或類。
-
單元測試(Unit Testing):對軟件單元進行的測試,驗證代碼的正確性、規范性、安全性和性能。
-
特點:
-
單元相互獨立,互不影響。
-
及時發現代碼缺陷,降低糾錯成本。
-
主要由程序員負責,測試員輔助。
-
可并行開展。
-
依據《軟件詳細規格說明書》。
-
以代碼覆蓋率作為評估標準。
-
需要開發輔助的測試程序。
-
2. 動態測試
-
驅動程序(Driver):模擬被測模塊的上級模塊,調用被測模塊并傳遞測試數據。
-
樁程序(Stub):模擬被測模塊調用的下層模塊,便于檢查接口。
-
示例:某程序將攝氏溫度轉換為華氏溫度,測試GUI模塊時需要配置驅動模塊和樁模塊。
3. 自動化單元測試框架JUnit
-
JUnit簡介:
-
針對Java語言的單元測試框架,1997年由Erich Gamma和Kent Beck開發。
-
JUnit4對測試框架體系結構進行了重大調整,與JUnit3有較大不同。
-
JUnit的設計思想被抽象為xUnit框架,已移植到多種語言和環境中。
-
-
技術特點:
-
簡化測試代碼編寫。
-
測試代碼與產品代碼分離。
-
測試代碼可自動運行。
-
提供豐富的斷言方法。
-
支持固化方法(資源分配和釋放)。
-
可將測試用例組織成測試套件。
-
支持文本和圖形運行界面。
-
4. JUnit的測試類和測試方法
-
測試類:包含測試代碼,定義一組測試方法。
-
測試方法:需滿足以下條件:
-
方法名用
@Test
注解修飾。 -
必須用
public void
修飾。 -
不帶任何參數。
-
-
示例:
java復制
@Test public void test01() throws Exception {isu = new InsuredPerson(20, 'M', false);int p = isu.premium();assertEquals(600, p); }
5. JUnit的斷言(Assertion)
-
常用斷言方法:
-
assertEquals(expected, actual)
:判斷預期結果與實際結果是否相同。 -
assertArrayEquals(expected, actuals)
:判斷數組是否相同。 -
assertSame(expected, actual)
:判斷是否引用相同對象。 -
assertTrue(condition)
:判斷條件是否為真。 -
assertNull(obj)
:判斷對象是否為空。 -
fail()
:直接指示測試失敗。
-
6. JUnit的固化方法(Fixture)
-
固化方法:用于分配和釋放資源。
-
@BeforeClass
:類構造固化方法,測試前調用一次。 -
@AfterClass
:類析構固化方法,測試后調用一次。 -
@Before
:構造固化方法,每次執行測試方法前調用。 -
@After
:析構固化方法,每次執行測試方法后調用。
-
-
示例:
java復制
@BeforeClass public static void setUpBeforeClass() throws Exception {System.out.println("setUpBeforeClass"); } @AfterClass public static void tearDownAfterClass() throws Exception {System.out.println("tearDownAfterClass"); } @Before public void setUp() throws Exception {System.out.println("setUp"); } @After public void tearDown() throws Exception {System.out.println("tearDown"); }
7. 參數化測試
-
參數化測試:將測試用例集組織在一個線性表中,JUnit框架遍歷線性表,每次取出一條測試用例作為參數實例化一個測試類對象。
-
參數化測試類的特征:
-
用
@RunWith(Parameterized.class)
注解修飾。 -
定義一個存儲測試用例的數據域集合。
-
定義一個以測試用例為參數的構造方法。
-
定義一個靜態方法(用
@Parameters
注解修飾),返回測試用例線性表。 -
定義至少一個測試方法。
-
8. 異常測試和超時測試
-
異常測試:通過
@Test(expected = 異常類.class)
指定預期異常。java復制
@Test(expected = Exception.class) public void test03() throws Exception {isu = new InsuredPerson(10, 'M', true);isu.premium(); }
-
超時測試:通過
@Test(timeout = 超時時限)
指定超時時間。java復制
@Test(timeout = 1000) public void test() throws Exception {isu = new InsuredPerson(10, 'M', true);isu.premium(); /* 假設premium中包含超時操作 */ }
9. 測試套件
-
測試套件(Test Suite):一種特殊的測試類,包含若干其他測試類,執行測試套件即成批地自動執行套件中的所有測試類。
-
特征:
-
用
@RunWith(Suite.class)
注解修飾。 -
用
@SuiteClasses({測試類1.class, 測試類2.class, ...})
指定測試套件中包含的測試類。 -
是一個空類,沒有定義任何數據域和方法。
-
10. 實驗練習提示
-
教學目標:掌握JUnit的初級和高級用法,包括參數化測試類和編寫測試套件。
-
主要內容:
-
初級:核心運行器、固化方法、斷言。
-
高級:異常測試、參數化運行器、測試套件運行器。
-
-
建議練習:
-
使用
@Test
注解的JUnit方法。 -
使用
assertEquals
斷言比較變量或對象。 -
使用
@Test(expected = Exception.class)
注解的JUnit方法。 -
使用
@RunWith(Parameterized.class)
和@Parameters
注解的JUnit方法。 -
使用測試套件
@RunWith(Suite.class)
和@SuiteClasses({})
。
-
總結
這份PPT詳細介紹了單元測試的基本概念、JUnit框架的特點和使用方法,以及如何設計和運行測試用例。通過學習這些內容,可以掌握如何使用JUnit進行自動化單元測試,提高代碼質量和測試效率。