第1章 Junit起步
学习目标
1、了解软件测试的分类与相关概念;
2、理解单元测试的好处;
3、掌握JUnit框架;
4、掌握简单编写测试用例(重点、难点)
前言:
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。
单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
1、测试的分类
(按照全生命周期的软件测试概念,测试对象应该包括软件设计开发的各个阶段的内容)
(1)按照开发阶段划分
单元测试、集成测试、系统测试、确认测试和验收测试
(2)按照测试实施组织划分
开发方测试、用户测试(β测试)、第三方测试
(3)按照测试技术划分
白盒测试、黑盒测试、灰盒测试。也可划分为静态测试和动态测试。
2、测试的相关概念
重要的相关概念
白盒测试:把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人员是公开的。
回归测试:软件或环境的修复或更正后的“再测试”,自动测试工具对这类测试尤其有用。
单元测试:是最小粒度的测试,以测试某个功能或代码块。一般由程序员来做,因为它需要知道内部程序设计和编码的细节。
JUnit :是一个开发源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言)。主要用于白盒测试,回归测试。
3、单元测试好处
(1)提高开发速度——测试是以自动化方式执行的,提升了测试代码的执行效率。
(2)提高软件代码质量——它使用小版本发布至集成,便于实现人员除错。同时引入重构概念,让代码更干净和富有弹性。
(3)提升系统的可信赖度——它是回归测试的一种。支持修复或更正后的“再测试”,可确保代码的正确性。
4、介绍Junit
4.1、Junit设计目标:
-
框架必须可以帮助我们编写有用的测试
-
框架必须帮助我们创建随着时间的过去依旧保持有用的测试
-
框架必须通过复用代码降代编写测试的成本
4.2Junit的特征
Junit是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言)。它包括以下特性:
-
1、用于测试期望结果的断言(Assertion)
-
2、用于共享共同测试数据的测试工具
-
3、用于方便的组织和运行测试的测试套件
-
4、图形和文本的测试运行器
适用对象:Junit可以用于程序开发人员或专业测试人员进行单元测试。
5、Junit3 的语法
在Junit3中,所有的测试类都必须extends TestCase;
在Junit3中,所有的测试方法必须以“test"开头;
测试方法三步骤
-
步骤1 构建对象
-
步骤2 调用被测试方法,并输入参数
-
步骤3、判断预期结果与真实结果是否一致
void setUp():每个测试方法执行之前,执行一次
void tearDown()每个测试方法执行之后,执行一次
6、Junit4 的语法
在Junit4中,有测试方法的类就是测试用例(testCase)
@Test声明的方法就是测试方法;
@Before:初始化方法,在任何一个测试执行之前必须执行的代码;
@ After:释放资源,在任何测试执行之后需要进行的收尾工作。跟3.x中的tearDown()方法具有相同功能
@BeforeClass:针对所有测试,在所有测试方法执行前执行一次,格式:@BeforeClass public static void method();
@AfterClass:针对所有测试,在所有测试方法执行结束后执行一次,格式:@AfterClass public static void method()
@Ignore:忽略的测试方法,标注的含义就是“某些方法尚未完成,暂不参与此次测试”
Junit 4 的单元测试用例执行顺序为:@BeforeClass –> @Before –> @Test –> @After –> @AfterClass;
每一个测试方法的调用顺序为:@Before –> @Test –> @After。
7、 Junit 3与4差异
8、简单学习内容实验
8.1开发工具
8.2环境设置
8.3 Junit3的基本语法及编写
1、新建Java项目“JunitTest2024_I”,并新建包lab1,包下创建类“Calculate”
package lab1; import sun.jvm.hotspot.utilities.IntArray; public class Calculate { public int add(int a,int b) { return a+b; } public int sub(int a,int b) { return a-b; } public int mul(int a,int b) { return a*b; } public int div(int a,int b) { return a/b; } }
2、创建源文件夹“test”,在其下创建包lab1,用Junit3创建类“Calculate”的测试用例“CalculateTestWithJunit3”
package lab1; import junit.framework.TestCase; import junit.framework.Assert; public class CalculateTestWithJunit3 extends TestCase { private Calculate cal; @Override public void setUp() throws Exception { super.setUp(); cal = new Calculate(); } @Override public void tearDown() throws Exception { super.tearDown(); } public void testAdd() { int result = cal.add(2, -3); Assert.assertEquals(-1, result); } public void testSub() { int result = cal.sub(5, 3); Assert.assertEquals(2, result); } public void testMul() { int result = cal.mul(4, 3); Assert.assertEquals(12, result); } public void testDiv() { int result = cal.div(10, 2); Assert.assertEquals(5, result); } }
运行结果:
8.4Junit4的基本语法及编写
package lab1; import static org.junit.Assert.assertEquals; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; public class CalculateTestWithJUnit4 { private Calculate cal; @BeforeClass public static void setUpBeforeClass() throws Exception { // 在所有测试方法之前执行一次,例如用于初始化全局资源 System.out.println("BeforeClass: 初始化全局资源"); } @AfterClass public static void tearDownAfterClass() throws Exception { // 在所有测试方法之后执行一次,例如用于清理全局资源 System.out.println("AfterClass: 清理全局资源"); } @Before public void setUp() throws Exception { // 在每个测试方法之前执行,例如用于初始化测试对象 cal = new Calculate(); System.out.println("Before: 初始化测试对象"); } @After public void tearDown() throws Exception { // 在每个测试方法之后执行,例如用于清理或释放资源 System.out.println("After: 释放测试资源"); } @Test public void testAdd() { int result = cal.add(2, 3); assertEquals(5, result); System.out.println("TestAdd: 运行testAdd"); } @Test public void testSub() { int result = cal.sub(5, 3); assertEquals(2, result); System.out.println("TestSub: 运行testSub"); } @Test public void testMul() { int result = cal.mul(2, 3); assertEquals(6, result); System.out.println("TestMul: 运行testMul"); } @Test public void testDiv() { int result = cal.div(6, 3); assertEquals(2, result); System.out.println("TestDiv: 运行testDiv"); } }
运行结果: