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进行自动化单元测试,提高代码质量和测试效率。