Junit单元测试

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_35885488/article/details/83107383

软件测试

软件开发当中,无论大小项目都离不开测试,包括单元测试、回归测试、集成测试、安全测试、性能测试等等等等。测试是软件开发过程中不可忽视的核心重要环节

单元测试

单元测试就是来验证程序员写代码是否正确的有效手段,开发人员在完成一段核心代码或一个模块的开发后,需要编写对应的单元测试用例来进行功能验证。单元测试在日常开发当中编写单元测试是非常有必要的。
试想一下若然正在开发一个庞大的项目,若然编写的每个业务逻辑都靠部署到服务器运行程序通过前台界面点击来进行测试的话,第一:效率非常低下,不自动化,第二:若然某一天某处加入了新代码出现了bug,查找出错误要费很大的功夫

回归测试

回归测试搜索是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。自动回归测试将大幅降低系统测试、维护升级等阶段的成本。
在快速迭代开发中,新版本的连续发布使回归测试进行的更加频繁,而在极端编程方法中,更是要求每天都进行若干次回归测试。因此,通过选择正确的回归测试策略来改进回归测试的效率和有效性是非常有意义的。

什么是JUnit

JUnit是一个单元测试和回归测试框架,Junit测试是程序员测试,也是白盒测试,因为程序员知道被测试的软件如何完成功能和完成什么样的功能。
JUnit是java领域中的主流单元测试框架,已几近成为了单元测试的标准。

每个模块/功能,除了有该模块的源代码外,还要有对应的JUnit测试代码

单元测试:每完成一个功能代码,需编写对应JUnit代码进行测试

回归测试:在已有的某个功能上进行了代码修改,要保证其他全部JUnit测试通过,从而保证其他模块不受影响

举个栗子:

JUNIT配置

在Eclipse IDE/Intellij IDEA里,都已经集成好了JUnit插件,我们只需要配置好进行使用即可。
关于JUnit配置,这里按传统项目和Maven项目两个部分来分别讲述

传统项目

在[Java Build Path]中添加JUnit库包

Maven项目

在pom.xml中配置好jar包依赖

传统项目配置方式(eclipse)

在maven项目的pom.xml文件中添加依赖

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
</dependency>

测试用例

假如有一个源代码类"Calculation"实现了加法和减法2个方法,现在需要给它做测试。

在Eclipse的包资源管理器(Package Explorer)中的“Calculation”类中弹出菜单,选择 new → other → JUnit Test Case

在弹出的对话框中,进行相应的选择,如下图所示

制定待测试的类的存放位置、名称

待测试的方法

在自动生成的测试方法上,加上了@Test这个标注,标识为需要测试。然后修改验证测试代码见下图,使用assertEquals来判断是否与预期匹配

执行JUnit测试用例有几种方法,可以在项目上、类上、方法上点右键弹出Run As -> JUnit Test

执行JUnit测试用例后的结果在Junit视图下可以清晰看到:如果结果是绿色的,则表示执行结果与预期一致,测试通过

执行JUnit测试用例后的结果在Junit视图下可以清晰看到:如果结果是红色的,则表示执行结果与预期不符,测试不通过。可以找到打叉的用例,点击查询详细错误日志

JUnit4使用-与JUnit3的对比

相比JUnit3来说,JUnit4采用注解方式,已经不会霸道的要求你必须继承自TestCase了,而且测试方法也不必以test开头了,只要以@Test注解描述即可。其他的注解:

@Before:使用了该注解的方法在每个测试方法执行之前都要执行一次。

@After:使用了该注解的方法在每个测试方法执行之后要执行一次。

注意:@Before和@After标示的方法只能各有一个。这个相当于取代了JUnit以前版本中的setUp和tearDown方法,当然你还可以继续叫这个名字,不过JUnit不会霸道的要求你这么做了。

@BeforeClass:使用了该注解后,在整个测试类执行前只会执行一次,且必须为static void

@AfterClass:使用了该注解后,在整个测试类执行完成后只会执行一次,且必须为static void

注意@Before与@BeforeClass区别,前者是每个测试方法都会执行一次,后者是整个类只会执行一次。 @After与@AfterClass也同理。

@Test(timeout=xxx)
该注解传入了一个时间(毫秒)给测试方法,如果测试方法在指定的时间之内没有运行完,则测试也失败。

@ignore:该注解标记的测试方法在测试中会被忽略。

@Test(expected=*.class): 通过@Test注解中的expected属性,可以设置预期抛出的异常类型。如果抛出的是预期的异常则测试通过。

JUnit 的测试用例总是由 Runner 去执行,JUnit 提供了 @RunWith 这个测试类的 Annotation, 可来指定自定义的 Runner。如果未指定特别的  Runner,那么会采用默认的 Runner,可能不同的环境,如 Eclipse,控制台下会有不同的默认 Runner。

以上的例子是使用new出来的待测试类进行测试,使用JUnit默认Runner即可。但在实际项目中,我们的代码并非new出来的实例,而是通过spring注入的,故需要spring的支撑。
这时候需要使用到@RunWith(SpringJUnit4ClassRunner.class) ,它有助你加载 Spring 的配置文件,及与 Spring 相关的事物。

1、通过@RunWith(SpringJUnit4ClassRunner.class) 来指定执行器。
2、通过@ContextConfiguration(locations = {“”}) 来加载spring配置。
3、然后就可以直接使用@Resource注解来从spring注入对应bean实例了

JUnit4使用-打包测试

通过前面的介绍我们可以感觉到,在一个项目中,只写一个测试类是不可能的,我们会写出很多很多个测试类。可是这些测试类必须一个一个的执行,也是比较麻烦的事情。鉴于此,JUnit为我们提供了打包测试的功能,将所有需要运行的测试类集中起来,一次性的运行完毕,大大的方便了我们的测试工作。具体代码如下:
 
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
 
@RunWith(Suite.class)
@Suite.SuiteClasses(…{
CalculatorTest.class,
SquareTest.class
})
 
public class AllCalculatorTests …{}
 
大家可以看到,这个功能也需要使用一个特殊的Runner,因此我们需要向@RunWith标注传递一个参数Suite.class。同时,我们还需要另外一个标注@Suite.SuiteClasses,来表明这个类是一个打包测试类。我们把需要打包的类作为参数传递给该标注就可以了。有了这两个标注之后,就已经完整的表达了所有的含义,因此下面的类已经无关紧要,随便起一个类名,内容全部为空既可。

展开阅读全文

没有更多推荐了,返回首页