版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
软件测试技术课程团队计算器的单元测试项目二
掌握常见动态白盒测试方法了解JUnit的历史和发展掌握JUnit的基本概念理解JUnit的注解和断言知识目标能够独立完成单元测试用例设计能够搭建JUnit测试环境编写和执行JUnit测试用例技能目标培养问题解决能力发展细致入微的工作习惯增强团队合作和沟通技能素质目标教学目标任务2-1单元测试用例设计任务2-2编写第一个JUnit单元测试用例LEARNING目录任务2-3实现简单计算器程序的JUnit单元测试什么是单元测试为什么要有单元测试1单元测试用例设计如何开展单元测试单元测试用例设计方法任务描述根据实训基本环境,分析被测代码,使用逻辑覆盖和独立路径覆盖完成测试用例设计。重点和难点重点:1.理解和掌握单元测试的基本概念、原理和方法。2.学会使用动态白盒测试技术(如语句覆盖、判定覆盖、条件覆盖、路径覆盖等)来设计单元测试用例。3.分析被测程序的逻辑结构,确定测试的重点和难点。难点:1.准确理解被测程序的逻辑和代码结构,特别是复杂的控制流和数据流。2.设计出能够全面覆盖程序内部逻辑和代码结构的测试用例。3.在有限的资源和时间内,优化测试用例,提高测试效率。知识链接1.单元测试的基本概念与原理。2.动态白盒测试的主要技术:语句覆盖、判定覆盖、条件覆盖、路径覆盖等。3.程序逻辑结构分析方法:控制流图、数据流图等。4.测试用例设计原则与技巧。任务完成步骤1.分析被测程序的逻辑结构和代码结构,理解其功能与需求。2.确定动态白盒测试的覆盖标准(如语句覆盖、判定覆盖等)。3.使用逻辑结构分析方法(如控制流图、数据流图)绘制程序流程图。4.根据覆盖标准和程序流程图设计测试用例,包括输入数据、预期输出和测试步骤。任务工单JUnitJMeterNmap单元测试是针对软件中的最小可测试单元进行检查和验证的一种测试方法。在面向对象的编程中,最小可测试单元通常指的是一个类或方法。单元测试的主要目的是确保每个单元的功能都是正确的,从而为整个软件的正确性打下基础。知识清单1什么是单元测试SeleniumAppium知识清单2为什么要有单元测试通过单元测试,可以在代码开发的早期阶段就发现潜在的问题,避免问题在后续开发过程中被放大或传播。早期发现问题单元测试能够促使开发者编写更加健壮、可维护的代码,因为它要求代码具备良好的结构和清晰的接口。提高代码质量通过自动化的单元测试,可以确保代码在不同环境和条件下的行为都是一致的,从而提高代码的可信度增强代码可信度单元测试的目的单元测试是唯一一次有保证能够代码覆盖率达到100%的测试知识清单3如何开展单元测试基本原则与最佳实践01隔离性原则只测试一个单元的功能,避免与其他单元产生依赖或交互。07及时修复失败的测试当测试失败时,应尽快定位并修复问题,以确保代码的正确性。02自动化原则能够自动执行,以便在代码修改或重构后能够迅速验证其正确性。06测试简单清晰避免在测试代码中引入复杂的逻辑或依赖。03断言验证使用断言方法来验证单元的行为是否符合预期。05有意义的测试用例确保测试用例能够覆盖各种正常和异常情况。04测试覆盖率尽量提高测试的覆盖率,即尽可能多的测试代码中的不同路径和条件。知识清单4单元测试用例设计方法(1)逻辑覆盖
语句覆盖语句覆盖就是设计若干测试用例运行被测程序,使得程序中每一可执行语至少执行一次。这里的“若干”,意味着使用测试用例越少越好。语句覆盖在测试中主要发现缺陷或错误语句。语句覆盖率=被评价到的语句数量/可执行的语句总数*100%语句覆盖的缺点:对程序执行逻辑的覆盖很低。 知识清单4单元测试用例设计方法(1)逻辑覆盖判定覆盖判定覆盖有时也称分支覆盖,就是指设计若干测试用例,运行被测程序,使得每个判定的取真分支和取假分支至少评价一次。判定路径覆盖率=被评价到的判定路径数量/判定路径的总数*100%判定覆盖的缺点:判定覆盖虽然把程序所有分支均覆盖到,但其主要对整个表达式最终取值进行度量,忽略了表达式内部的取值。
知识清单4单元测试用例设计方法(1)逻辑覆盖
条件覆盖条件覆盖是指设计足够多的测试用例,运行被测程序,使得每一判定语句中每个逻辑条件的可能取值至少满足一次。条件覆盖率=被评价到的条件取值的数量/条件取值的总数*100%条件覆盖的缺点:只考虑每个判定语句中的每个表达式,没有考虑各个条件分支(或者涉及不到全部分支),即不能够满足判定覆盖。 知识清单4单元测试用例设计方法(1)逻辑覆盖
条件/判定覆盖条件/判定覆盖是指设计足够多的测试用例,使得判定中每个条件的所有可能(真/假)至少出现一次,并且每个判定本身的判定结果也至少出现一次。条件/判定覆盖率=被评价到的条件取值和判定分支的数量/(条件取值点数+判定分支总数)*100%条件/判定覆盖的缺点:没有考虑单个判定对整体结果的影响,无法发现逻辑错误。 知识清单4单元测试用例设计方法(1)独立路径覆盖测试路径测试就是从一个程序的入口开始,执行所经历的各个语句的完整过程。从广义的角度讲,任何有关路径分析的测试都可以被称为路径测试。完成路径测试的理想情况是做到路径覆盖,对于比较简单的程序实现路径覆盖是可能做到的,但对于复杂性大的程序要做到所有路径覆盖(测试所有可执行路径)是不可能的。在不能做到所有路径覆盖的前提下,如果某一程序的每一个独立路径都被测试过,那么可以认为程序中的每个语句都已经检验过了,即达到了语句覆盖。这种测试方法就是通常所说的基本路径测试方法。
知识清单4单元测试用例设计方法(1)独立路径覆盖测试独立路径覆盖测试方法包括以下4个步骤。①画出程序控制流图:描述程序控制流的一种图示方法。控制流图有以下几个特点:
具有唯一入口结点,即源结点,表示程序段的开始语句。
具有唯一出口结点,即汇结点,表示程序段的结束语句。
结点由带有标号的圆圈表示,表示一个或多个无分支的源程序语句。
控制流线由带箭头的直线或弧表示,可称为边,代表控制流的方向。知识清单4单元测试用例设计方法(1)独立路径覆盖测试②计算程序的圈复杂度:从程序的环路复杂度可导出程序基本路径集合中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必需的测试用例数目的上界。
通过控制流图的区域个数来计算公式:V(G)=区域数程序的环路复杂性为控制流图的区域数(即封闭的区域数+1)。
通过控制流图的边数和结点数来计算公式:V(G)=e-n+2其中,e即edge,表示图中边的数目;n即node,表示结点个数。
通过控制流图中的判定结点个数来计算公式:V(G)=P+1其中,P表示判定结点的数目。所谓判定节点数,即有多个分支的节点。知识清单4单元测试用例设计方法(1)独立路径覆盖测试③导出独立路径:根据圈复杂度和程序结构设计获得独立路径。④准备测试用例:确保基本路径集中每一条路径的执行程序控制流图中只有两种图形符号,即每一个圆圈称为流图的一个结点,代表一条或多条无分支的语句或源程序语句;箭头称为边或连接,代表控制流。任何过程设计都要被翻译成控制流图,常见控制结构的控制流图如图所示。顺序结构
IF选择结构
While/Until循环结构
Case多分支结构任务实施对下面程序片段按照逻辑覆盖、独立路径覆盖方法编写测试用例。1.int
function(int
x,int
y,int
z)2.
{3.
if(y>1
&&
z==0)4.
{5.
x=(int)(x/y)6.
}7.
if(y==2
||
x>1)8.
{9.
x=x+110.
}11.return
x;12.}任务实施1.实现语句覆盖测试用例编写为了使每条语句都能够至少执行一次,我们可以构造以下测试用例:输入:x=4,y=2,z=0执行路径为:sacbed逻辑符号&&写成了||逻辑符号||写成了&&语句覆盖虽然可以测试执行语句是否被执行到,但却无法测试程序中存在的逻辑错误。因此,语句覆盖是一种弱覆盖。任务实施2.实现判定覆盖测试用例编写if(y>1
&&
z==0)记为P1if(y==2
||
x>1)记为P2逻辑符号&&写成了||逻辑符号||写成了&&判定覆盖仍然具有和语句覆盖一样无法发现逻辑判断符号“&&”误写了“||”的逻辑错误。判定覆盖仅仅判断判定语句执行的最终结果而忽略每个条件的取值,也属于弱覆盖。用例编号测试输入判断P1判断P2XYZTestCase1130TFTestCase2311FT任务实施3.实现条件覆盖测试用例编写if(y>1
&&
z==0)记为P1,
y>1记为C1,z==0记为C2if(y==2
||
x>1)记为P2,y==2记为C3,x>1记为C4从条件覆盖的测试用例可知,使用2个测试用例就达到了使每个逻辑条件取真值与取假值都至少出现了一次,但从测试用例的执行路径来看,条件分支覆盖的状态下仍旧不能满足判定覆盖,即没有覆盖bd这条路径。相比于语句覆盖与判定覆盖,条件覆盖达到了逻辑条件的最大覆盖率,但却不能保证判定覆盖。用例编号测试输入条件C1条件C2条件C3条件C4XYZTestCase1120TTTFTestCase2211FFFT任务实施4.实现条件/判定覆盖测试用例编写if(y>1
&&
z==0)记为P1,
y>1记为C1,z==0记为C2if(y==2
||
x>1)记为P2,y==2记为C3,x>1记为C4用例编号测试输入判定P1判定P2条件C1条件C2条件C3条件C4XYZTestCase1420TTTTTTTestCase2111FFFFFF条件/判定覆盖满足了判定覆盖准则和条件覆盖准则,弥补了二者的不足。但是条件/判定覆盖不一定比条件覆盖的逻辑更强。条件/判定覆盖的缺点是没有考虑条件的组合情况。任务实施5.实现独立路径测试用例编写(1)根据上述任务实施中的程序片段,绘制程序控制流图1.int
function(int
x,int
y,int
z)2.
{3.
if(y>1
&&
z==0)4.
{5.
x=(int)(x/y)6.
}7.
if(y==2
||
x>1)8.
{9.
x=x+110.
}11.return
x;12.}任务实施5.实现独立路径测试用例编写(2)计算环路复杂度V(G)=3(2个封闭区域+1个开放区域)(3)确定线性无关路径路径1:3.7.11路径2:1路径3:.11任务实施5.实现独立路径测试用例编写(4)设计测试用例编号输入数据预期输出覆盖路径1y=0,z=1,x=0x=0路径12y=3,z=0,x=1x=0路径23y=2,z=0,x=2x=2路径3任务拓展下述图形识别代码的功能是:输入3个整数A、B、C,分别作为三角形的3条边,通过程序判断这3条边是否能构成三角形。如果能构成三角形,则判断三角形的类型(如等边三角形、等腰三角形、一般三角形)。要求:输入的3个整数A、B、C必须满足条件:1≤A<200,1<B<200,1<C<200。请根据独立路径测试方法完成用例设计。1
INTABC //三角形的三边2
IF((A+B>C)&&(A+C>B)&&(B+C)>A)
//是否满足三角形成立条件3 IF((A==B)&&(B==C))
//等边三角形4 等边三角形5
ELSEIF((A==B)||(B==C)||(A==C))
//等腰三角形6 等腰三角形7 ELSE //一般三角形8 一般三角形9
ELSE10 不是三角形11
END任务拓展步骤1:导出程序控制流图对程序进行分析,程序流程图如图2-5,程序的执行路径如图2-6。图中数字是代码行号,当执行程序输入数据时,程序根据条件判断沿着不同的路径执行。任务拓展步骤2:求出程序环形复杂度根据程序环形复杂度的计算公式,求出程序路径集合中的独立路径数目。公式1:V(G)=11-9+2,其中11是控制流图G中边的数量,9是控制流图中结点的数目。公式2:V(G)=3+1,其中3是控制流图G中判断结点的数目。公式3:V(G)=4,其中4是控制流图G中区域的数目。注意:计算区域时应包括图外部的范围。步骤3:找出独立路径根据上面环形复杂度的计算结果,路径集合中有4条独立路径:path1:1→2→3→4→11path2:1→2→3→5→6→11path3:1→2→3→5→8→11path4:1→2→10→11任务拓展步骤4:设计测试用例 编号测试用例路径预期输出ABCtest1666path1等边三角形test2668path2等腰三角形test3345path3一般三角形test4336path4不构成三角形常见问题及解决方法问题描述:测试用例未能覆盖代码中的所有路径、分支和条件,导致某些代码未被测试。解决办法:(1)使用覆盖率工具:使用代码覆盖率分析工具来检查测试覆盖率,识别未覆盖的部分。(2)增加测试用例:根据覆盖率报告,设计并增加测试用例,确保所有路径、分支和条件都被覆盖。(3)代码审查:通过代码审查识别复杂逻辑和潜在的遗漏,并设计相应的测试用例。覆盖率不足01问题描述:代码逻辑复杂,包含多个嵌套条件和循环,难以设计全面的测试用例。解决办法:(1)分解问题:将复杂的代码逻辑分解为多个较小的单元,分别进行测试。(2)控制流图:绘制控制流图,帮助理清代码中的所有路径和分支,确保设计的测试用例覆盖所有情况。复杂代码逻辑02任务小结包含逻辑覆盖和独立路径测试方法,逻辑覆盖中包括:语句覆盖、判定覆盖、条件覆盖、条件/判定覆盖。通过控制流图的分析,清晰地理解了代码的逻辑结构,并学会了如何利用独立路径测试方法来设计和实现测试用例。掌握动态白盒测试的常见方法理解什么是单元测试,以及它为何在软件开发过程中占据重要地位。了解单元测试是确保代码质量和可靠性的关键步骤,能够帮助及早发现并修复潜在问题,减少后期维护成本。理解单元测试的基本概念与重要性为什么选择JUnitJUnit特点2编写第一个JUnit单元测试用例任务工单任务描述根据实训基本环境,完成JUnit测试环境搭建,并运行测试用例检验环境搭建是否成功。重点和难点重点:1.JUnit框架的基本概念和功能。2.确保测试用例运行正确,验证环境配置的有效性。难点:1.正确配置开发环境,使其能够识别和使用JUnit。2.排查和解决安装和配置过程中遇到的各种问题。知识链接1、JUnit的基本概念和功能。2、安装JDK,并配置好环境变量,选择并安装合适的IDE(如Eclipse、IntelliJIDEA),了解基本使用方法。3、从JUnit官方网站下载最新版本的JUnit库,在IDE中配置JUnit。任务完成步骤1.下载并安装JDK,配置JAVA_HOME和PATH环境变量。2.下载并安装Java开发环境(如Eclipse或IntelliJIDEA)。3.在Java开发环境中配置JUnit插件或添加JUnit库依赖。4.创建一个简单的Java项目,并编写一个包含至少一个方法的类。5.创建一个JUnit测试类,并编写针对上述类中方法的测试用例。6.运行JUnit测试用例,并查看测试结果。7.根据测试结果修改测试用例或代码,直到测试通过。JUnit是一个流行的Java编程语言的单元测试框架。它是由KentBeck和ErichGamma于1998年首次发布,其目的是提供一种简单的方法来编写和运行可重复的测试。JUnit是开源的,提供了一系列的API,可以帮助开发者编写和执行单元测试,并通过TDD(Test-DrivenDevelopment,测试驱动开发)来保证代码质量。JUnit不需要依赖任何IDE或者插件,只需要用Java编写测试类即可。随着时间的推移,JUnit已经成为Java开发中最广泛使用的测试框架之一。知识清单1为什么选择JUnit知识清单2为什么要有单元测试集成性
简单性JUnit提供了简单且易于理解的API,使得开发人员可以快速编写测试代码。JUnit可以与大多数流行的IDE(如IntelliJIDEA、Eclipse)和构建工具(如Maven、Gradle)无缝集成,使得测试执行更加便捷。自动化JUnit能够自动执行测试,并立即提供结果反馈,使得测试成为开发过程中的一个自然部分。测试套件可以将多个测试用例组织成一个测试套件,以便一起执行。断言机制JUnit提供了一套丰富的断言方法,用于验证代码的实际输出是否符合预期。任务实施Part1:安装Java:JUnit是一个测试框架,用于测试基于Java的应用程序。
因此,在安装JUnit之前确保计算机上安装了JavaDevelopmentKit(JDK)。Part2:安装IDE:选择并安装一个集成开发环境(IDE),如Eclipse,IntelliJIDEA或VisualStudioCode。这些IDE通常提供了对JUnit的良好支持。Part3:安装JUnit从JUnit官网上下载JUnit的最新版本。将下载好的jar包复制到项目的lib目录下,然后右键单击并选择BuildPath->AddLibraries,选择JUnit,即可将该jar包添加到项目中。1JUnit安装和配置任务实施1JUnit安装和配置任务实施步骤1:创建测试类。在Eclipse中创建一个新的Java项目,并新建一个测试类2编写第一个测试用例测试类的命名应该以Test结尾以示区别,例如:1.
public
class
CalculatorTest
{2.
//
TODO
测试用例代码3.
}任务实施步骤2:导入JUnit类库。在测试类的文件中,需要导入JUnit中的相关类库2编写第一个测试用例1.
import
org.junit.Test;2.
import
static
org.junit.Assert.*;步骤3:编写测试用例。在测试类中,可以编写多个测试方法,每个测试方法用@Test注解标记1.
public
class
CalculatorTest
{2.
@Test3.
public
void
testAdd()
{4.
Calculator
calculator
=
new
Calculator();5.
assertEquals(5,
calculator.add(2,
3));6.
assertEquals(7,
calculator.add(3,
4));7.
assertEquals(10,
calculator.add(5,
5));8.
}9.
}任务实施步骤4:运行测试。在完成测试用例的编写后,可以通过在Eclipse上右键单击测试类并选择RunAs->JUnitTest来运行测试用例。2编写第一个测试用例任务拓展JUnit的TestWatcher类可以监听测试的开始和结束,并在测试执行过程中执行相应的操作。可以通过继承TestWatcher类并重写相应的方法来实现自定义的监听器。1配置测试监听器(TestWatcher)1.
import
org.junit.rules.TestWatcher;2.
import
org.junit.runner.Description;3.
4.
public
class
CustomTestWatcher
extends
TestWatcher
{5.
@Override6.
protected
void
starting(Description
description)
{7.
System.out.println("Starting
test:
"
+
description.getMethodName());8.
}9.
10.
@Override11.
protected
void
finished(Description
description)
{12.
System.out.println("Finished
test:
"
+
description.getMethodName());13.
}14.
}任务拓展JUnit的@Rule注解可以创建自定义规则,可以通过创建一个类并添加@Rule注解来自定义测试规则。2自定义规则(@Rule)1.
import
org.junit.Rule;2.
import
org.junit.rules.ExternalResource;3.
4.
public
class
CustomRuleExample
{5.
@Rule6.
public
ExternalResource
resource
=
new
ExternalResource()
{7.
@Override8.
protected
void
before()
throws
Throwable
{9.
//
在测试方法执行前执行的操作10.
System.out.println("Before
test");11.
}12.
13.
@Override14.
protected
void
after()
{15.
//
在测试方法执行后执行的操作16.
System.out.println("After
test");17.
}18.
};19.
}任务拓展JUnit可以很容易地与其他测试工具集成,比如Mockito用于模拟对象、Hamcrest用于编写可读性更强的断言、PowerMock用于测试私有方法等,可以通过使用Maven或Gradle来配置这些工具的依赖项。3集成其他测试工具Maven配置示例:1.
<dependency>2.
<groupId>junit</groupId>3.
<artifactId>junit</artifactId>4.
<version>${junit.version}</version>5.
<scope>test</scope>6.
</dependency>7.
<dependency>8.
<groupId>org.mockito</groupId>9.
<artifactId>mockito-core</artifactId>10.
<version>${mockito.version}</version>11.
<scope>test</scope>12.
</dependency>常见问题及解决方法问题描述:编译或运行测试时,IDE或构建工具报告找不到JUnit库。解决办法:(1)Maven:在pom.xml中添加JUnit依赖:1.<dependency>2.
<groupId>junit</groupId>3.
<artifactId>junit</artifactId>4.
<version>4.13.2</version>5.
<scope>test</scope>6.</dependency>(2)Gradle:在build.gradle中添加JUnit依赖:1.testImplementation
'junit:junit:4.13.2'(3)手动添加:从Maven中央仓库或JUnit官方网站下载JUnitjar文件,并将其添加到项目的类路径中。找不到JUnit库01常见问题及解决方法问题描述:项目中可能存在多个不同版本的JUnit库,导致冲突。解决办法:(1)确保pom.xml或build.gradle中只包含一个JUnit依赖,并删除其他版本的依赖。(2)使用Maven的dependency:tree或Gradle的dependencies命令查看依赖树,确认JUnit版本一致。版本冲突02问题描述:由于网络问题或仓库配置问题,无法下载JUnit依赖。解决办法:(1)检查网络连接,确保可以访问Maven中央仓库或其他配置的仓库。(2)配置代理(如公司网络限制),使得Maven或Gradle可以通过代理访问外部仓库。(3)下载JUnitjar文件并手动添加到本地Maven仓库或直接添加到项目中。依赖下载失败03任务小结在本任务中,完成了JUnit的安装,掌握了JUnit用例设计与执行的基本步骤,能够在自己的Java项目中应用JUnit进行单元测试,为后续JUnit测试用例编写搭建了必需的测试环境。同时,也可以尝试将JUnit与其他测试工具和技术(如Mockito、PowerMock等)结合使用,以构建更强大、更灵活的测试体系。JUnit中的断言机制JUnit中的注解方法3实现简单计算器程序的JUnit单元测试任务描述根据实训基本环境,完成程序代码中各个类的JUnit测试用例编写,并运行测试用例验证关键业务逻辑的正确性。重点和难点重点:1.理解JUnit框架的基本概念和使用方法。2.掌握JUnit注解和断言方法的使用。3.编写覆盖全面的测试用例,验证关键业务逻辑的正确性。难点:1.设计有效的测试用例,确保测试的全面性和覆盖率。2.使用JUnit注解和断言方法编写结构清晰、逻辑严谨的测试用例。知识链接1.JUnit框架的基本概念和使用方法。2.JUnit注解的作用及用法。3.断言方法的使用场景。4.编写测试用例的规范和最佳实践。任务完成步骤1.分析待测试代码的需求和功能,明确测试目标和范围。2.根据测试用例设计原则和方法,设计并编写测试用例。3.在JUnit测试框架中创建测试类,并编写测试方法。4.在测试方法中编写测试断言,验证待测试代码的正确性。5.运行测试用例,并查看测试结果。如果测试失败,定位并修复问题。任务工单知识清单1JUnit中的断言机制(1)AssertEquals(expected,actual)AssertEquals()方法用于检查两个值是否相等,其中,expected表示期望值,actual表示实际值。如果expected和actual不相等,则抛出AssertionError。例:1.
import
static
org.junit.jupiter.api.Assertions.assertEquals;2.
3.
public
class
TestExample
{4.
@Test5.
public
void
testEquality()
{6.
assertEquals(5,
2
+
3,
"Optional
failure
message:
2
+
3
should
equal
5");7.
}8.
}知识清单1JUnit中的断言机制(2)AssertNotEquals(expected,actual)检查两个值是否不相等。如果相等,测试失败。例:1.
import
static
org.junit.jupiter.api.Assertions.assertNotEquals;2.
3.
public
class
TestExample
{4.
@Test5.
public
void
testNonEquality()
{6.
assertNotEquals(5,
2
+
2,
"Optional
failure
message:
2
+
2
should
not
equal
5");7.
}8.
}知识清单1JUnit中的断言机制(3)AssertTrue(condition)AssertTrue()方法用于检查一个条件是否为true,如果不为true,则抛出AssertionError。其中,condition表示需要检测的条件。如果condition不为true,则抛出AssertionError。例:1.
import
static
org.junit.jupiter.api.Assertions.assertTrue;2.
3.
public
class
TestExample
{4.
@Test5.
public
void
testCondition()
{6.
assertTrue(3
>
2,
"Optional
failure
message:
3
is
greater
than
2");7.
}8.
}知识清单1JUnit中的断言机制(4)AssertFalse(condition)AssertFalse()方法用于检查一个条件是否为false,如果不为false,则抛出AssertionError。其中,condition表示需要检测的条件。如果condition不为false,则抛出AssertionError。例:1.
import
static
org.junit.jupiter.api.Assertions.assertFalse;2.
3.
public
class
TestExample
{4.
@Test5.
public
void
testFalseCondition()
{6.
assertFalse(2
>
3,
"Optional
failure
message:
2
is
not
greater
than
3");7.
}8.
}知识清单1JUnit中的断言机制(5)AssertNull(object)assertNull()方法用于检查一个对象是否为null,如果不为null,则抛出AssertionError。其中,object表示需要检测的对象。如果object不为null,则抛出AssertionError。例:1.
import
static
org.junit.jupiter.api.Assertions.assertNull;2.
3.
public
class
TestExample
{4.
@Test5.
public
void
testNull()
{6.
Object
obj
=
null;7.
assertNull(obj,
"Optional
failure
message:
Object
should
be
null");8.
}9.
}知识清单1JUnit中的断言机制(6)AssertNotNull(object)AssertNotNull()方法用于检查一个对象是否不为null,如果为null,则抛出AssertionError。其中,object表示需要检测的对象。如果object为null,则抛出AssertionError。例:1.
import
static
org.junit.jupiter.api.Assertions.assertNotNull;2.
3.
public
class
TestExample
{4.
@Test5.
public
void
testNotNull()
{6.
Object
obj
=
new
Object();7.
assertNotNull(obj,
"Optional
failure
message:
Object
should
not
be
null");8.
}9.
}知识清单1JUnit中的断言机制(7)AssertThrows(exceptionClass,executable)检查代码块是否抛出了预期的异常。如果没有抛出预期的异常或没有抛出任何异常,测试失败。例:1.
import
static
org.junit.jupiter.api.Assertions.assertThrows;2.
3.
public
class
TestExample
{4.
@Test5.
public
void
testException()
{6.
assertThrows(NumberFormatException.class,
()
->
{7.
Integer.parseInt("one");8.
},
"Optional
failure
message:
Should
throw
NumberFormatException");9.
}10.
}知识清单2JUnit中的注解方法(1)@Test表明该方法是一个测试方法。JUnit将会执行标记了此注解的方法。例:1.
import
org.junit.jupiter.api.Test;2.
3.
public
class
CalculatorTests
{4.
@Test5.
void
testAddition()
{6.
assertEquals(5,
2
+
3,
"2
+
3
should
equal
5");7.
}8.
}知识清单2JUnit中的注解方法(2)@Before在每个单个测试执行之前执行。常用于测试数据的初始化。例:1.
import
org.junit.jupiter.api.BeforeEach;2.
import
org.junit.jupiter.api.Test;3.
4.
public
class
CalculatorTests
{5.
private
Calculator
calculator;6.
7.
@Before8.
void
setUp()
{9.
calculator
=
new
Calculator();10.
}11.
12.
@Test13.
void
testAddition()
{14.
assertEquals(5,
calculator.add(2,
3));15.
}16.
}知识清单2JUnit中的注解方法(3)@After在每个单个测试执行之后执行。常用于清理测试后的资源。例:1.
import
org.junit.jupiter.api.AfterEach;2.
import
org.junit.jupiter.api.Test;3.
4.
public
class
CalculatorTests
{5.
private
Calculator
calculator
=
new
Calculator();6.
7.
@After8.
void
tearDown()
{9.
calculator.clear();10.
}11.
12.
@Test13.
void
testAddition()
{14.
assertEquals(5,
calculator.add(2,
3));15.
}16.
}知识清单2JUnit中的注解方法(4)@Disabled标记测试方法或测试类为禁用,这意味着测试运行器将不会执行这些方法或类。例:1.
import
org.junit.jupiter.api.Disabled;2.
import
org.junit.jupiter.api.Test;3.
4.
public
class
CalculatorTests
{5.
@Test6.
@Disabled("Feature
under
development")7.
void
testFeatureUnderDevelopment()
{8.
//
This
test
will
not
run9.
}10.
}知识清单2JUnit中的注解方法(5)@ParameterizedTest用于声明参数化测试,与@ValueSource,@EnumSource,@CsvSource等其他注解结合使用,可以为测试方法提供多组参数。例:1.
import
org.junit.jupiter.params.ParameterizedTest;2.
import
org.vider.ValueSource;3.
4.
public
class
CalculatorTests
{5.
@ParameterizedTest6.
@ValueSource(ints
=
{1,
2,
3,
4})7.
void
testAdditionWithOne(int
number)
{8.
assertEquals(number
+
1,
1
+
number,
"1
+
number
should
equal
number
+
1");9.
}10.
}任务实施实现简单计算器程序的JUnit单元测试。一个简单计算器类,包含加、减、乘、除四个基本运算方法,能处理整数运算,并抛出异常以处理除数为零的情况,Java代码实现如下:1.
public
class
Calculator
{
2.
public
int
add(int
a,
int
b)
{
3.
return
a
+
b;
4.
}
5.
6.
public
int
subtract(int
a,
int
b)
{
7.
return
a
-
b;
8.
}
9.
10.
public
int
multiply(int
a,
int
b)
{
11.
return
a
*
b;
12.
}
13.
14.
public
int
divide(int
a,
int
b)
throws
ArithmeticException
{
15.
if
(b
==
0)
{
16.
throw
new
ArithmeticException("Division
by
zero");
17.
}
18.
return
a
/
b;
19.
}
20.
}任务实施计算器程序的JUnit单元测试步骤如下:1.创建项目。在IDE(如IntelliJIDEA或Eclipse)中创建一个新的Java项目,并添加JUnit依赖,编写上述简单计算器类2.编写JUnit测试用例。创建CalculatorTest类,针对上述简单计算器类编写JUnit测试用例,包含正常情况下的测试以及异常情况的测试。3.在IDE中运行JUnit测试,观察测试结果。根据测试结果分析代码的正确性和健壮性。任务实施1.
import
org.junit.jupiter.api.Assertions;
2.
import
org.junit.jupiter.api.Test;
3.
4.
public
class
CalculatorTest
{
5.
6.
private
Calculator
calculator
=
new
Calculator();
7.
8.
@Test
9.
public
void
testAdd()
{
10.
Assertions.assertEquals(5,
calculator.add(2,
3));
11.
}
12.
13.
@Test
14.
public
void
testSubtract()
{
15.
Assertions.assertEquals(-1,
calculator.subtract(2,
3));
16.
}
17.
18.
@Test
19.
public
void
testMultiply()
{
20.
Assertions.assertEquals(6,
calculator.multiply(2,
3));
21.
}
22.
23.
@Test
24.
public
void
testDivideNormal()
{
25.
Assertions.assertEquals(2,
calculator.divide(4,
2));
26.
}
27.
28.
@Test
29.
public
void
testDivideByZero()
{
30.
Assertions.assertThrows(ArithmeticException.class,
()
->
calculator.divide(4,
0));
31.
}
32.
}任务拓展实现银行账户管理系统的单元测试。
项目背景设计并实现一个简单的银行账户管理系统,然后使用JUnit编写并运行单元测试,以验证系统的各个组件功能是否正常工作。
功能需求银行账户管理系统支持以下基本功能:1.账户创建:允许用户创建一个新的银行账户。每个账户应包含账户ID、账户持有者姓名和初始余额。2.存款操作:允许用户向特定账户存入指定金额的钱。3.取款操作:允许用户从特定账户中取出指定金额的钱。必须检查账户余额,确保不允许透支。4.查看余额:允许用户查看任何特定账户的当前余额。
技术要求使用Java作为开发语言。使用JUnit来编写和执行单元测试。鼓励使用TDD(测试驱动开发)方法:即先写测试,后编写实现代码。任务拓展实现银行账户管理系统的单元测试。
实训任务1.设计类结构:创建一个BankAccount类,包含私有属性如accountNumber,ownerName,balance。在BankAccount类中实现deposit,withdraw,和getBalance方法。2.编写单元测试:为B
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 养殖企业五一活动方案策划(3篇)
- 设备监理师《设备监理投资》模拟试卷(完整版)
- 2026年陕西(中考)数学考试真题及参考答案
- 2026年山西省晋城市重点学校初一入学数学分班考试试题及答案
- 2026年四川中考数学考试试题(含答案)
- 2026年内蒙古公务员(行测)真题及参考答案
- 2026年黑龙江中小学教师招聘考试真题解析含答案
- 2026年山东小升初(数学)历年真题及答案
- 2026年西藏高考(英语)历年真题及答案
- 2026年黑龙江高考化学(真题)试卷附答案
- GB 47834-2026晶体硅光伏组件和逆变器能效限定值及能效等级
- 工程常见质量问题监理实施细则
- 2026年本溪市明山区事业编单位人员招聘考试备考试题及答案详解
- 2026年广西公需科目全套1卷《人工智能国家战略与政策通识》
- 2026年云南省中考语文试卷(含答案及解析)
- 2026年山东省医疗卫生事业单位招聘护士笔试试卷
- (2026年)内蒙古赤峰市公务员遴选考试题及答案
- 2026年PID控制器的原理与应用实例
- 教育强国建设三年行动计划(2025-2027年)
- 20S515 钢筋混凝土及砖砌排水检查井
- 预防住院患者跌倒集束化护理措施和核查
评论
0/150
提交评论