51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2337|回复: 1
打印 上一主题 下一主题

[转贴] 史上最全JUnit4核心学习和使用、思维导图

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-21 16:34:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前言

最近公司项目走向规范化开发,在后端开发中的一个重要工具就是JUnit4,保证了团队开发中,每一个人写的方法、接口、模块等,都是没有错的(抛开业务逻辑,并不是保证是对的!单元测试保证你测试的模块和你的预期是一致的),团队开发的效率和自身debug的效率也大大提高,虽然看上去,增加写单元测试代码的时间,但是,在整个项目的开发中,它会极大的缩短你处理异常、查找BUG的时间,相信我,快来使用JUnit4进行单元测试。
本文涵盖JUnit4的绝大多数知识点,核心。此文章是总结性质文章,用来加深JUnit理解和使用,共勉。

初识JUnit

真的非常简单,好用
下面例子的意思是,add()方法在传入参数1、参数2后,返回的结果是不是和A值相同,如果相同,true,反之,false。此方法是可以单独运行的,测试通过,控制台显示一个绿条提示,不通过,红条提示。

  1. 这是一个最简单的测试例子
  2. import static org.junit.framework.assertEqual;
  3. import org.junit.Test;
  4. public Class DemoTest{
  5.     @Test  
  6.     public void testAdd(){  
  7.         assertEquals(“预期的值A”, add(参数1, 参数2));  
  8.     }
  9. }
复制代码

引用架包
  • 视情况选择需要的版本。

1.maven项目直接在pom.xml文件中引入依赖

  1. <dependency>  
  2.       <groupId>junit</groupId>  
  3.       <artifactId>junit</artifactId>  
  4.       <version>4.12</version>  
  5.        <scope>test</scope>  
  6. </dependency>
复制代码

2.非maven项目下载jar包

JUnit的核心注解


JUnit 4 常用的几个annotation 介绍

★ @Before:初始化方法,在任何一个测试执行之前必须执行的代码;

★ @After:释放资源,在任何测试执行之后需要进行的收尾工作。在每个测试方法执行之后执行一次,该annotation只能修饰public void 方法;

★ @Test:测试方法,表明这是一个测试方法。在Junit中将会自动被执行。该annotation只你呢个修饰public void 方法。对于方法的声明也有如下要求:名字可以随便取,没有任何限制,但是返回值必须为void,而且不能有任何参数。如果违反这些规定,会在运行时抛出一个异常。至于方法内该写些什么,那就要看你需要测试些什么了;在这里可以测试期望异常和超时时间,如 @Test(timeout = 100):我们给测试函数设定一个执行时间,超过了这个时间(100毫秒),它们就会被系统强行终止,并且系统还会向你汇报该函数结束的原因是因为超时,这样你就可以发现这些Bug了。

★ @Ignore:忽略的测试方法,标注的含义就是“某些方法尚未完成,暂不参与此次测试”;这样的话测试结果就会提示你有几个测试被忽略,而不是失败。一旦你完成了相应函数,只需要把@Ignore标注删去,就可以进行正常的测试。

★ @BeforeClass:针对所有测试,只执行一次,且必须为public static void;

★ @AfterClass:针对所有测试,将会在所有测试方法执行结束后执行一次,且必须为public static void;


所以一个Junit 4 的单元测试用例执行顺序为:@BeforeClass –> @Before –> @Test –> @After –> @AfterClass;每一个测试方法的调用顺序为:@Before –> @Test –> @After。


思维导图

详情

额外内容

@Test的属性

1.@Test(timeout=1)设置超时时间,以s为单位,超出报错。

2.@Test(expected= 异常类型IndexOutOfBoundsException.class) 有一个预期的异常时,不报错

对测试方法注意


1.测试方法上必须使用@Test进行修饰

2.测试方法必须使用public void修饰,不带任何参数

3.新建一个源码目录(如test)来存放我们的测试代码

4.测试类的包应该和被测试类保持一致

5.建议测试类使用Test作为类名的后缀,测试方法使用test作为方法名的前缀

凡是项目中集成了Spring框架的,由于bean实列都交给spring 管理(xml配置文件),要做单元测试就比较苦难,junit4 单元测试非常方便。


常用断言,包含相同的方法的重载方法


Assert.方法名( ),方法名有很多,用法一样,简单高效。

项目中包含Spring框架进行bean的管理,单元测试核心要点。


一、加入依赖包

使用Spring的测试框架需要加入以下依赖包:

JUnit 4 (官方下载:http://www.junit.org/

Spring Test (Spring框架中的test包)

Spring 相关其他依赖包(不再赘述了,就是context等包)


二、创建测试源目录和包

在此,推荐创建一个和src平级的源文件目录,因为src内的类都是为日后产品准备的,而此处的类仅仅用于测试。而包的名称可以和src中的目录同名,这样由于在test源目录(source file),所以不会有冲突,而且名称又一模一样,更方便检索。


三、创建测试类

创建一个测试用的类,推荐名称为 “被测试类名称 + Test”。


四、关于单元测试时,事物回滚的核心

测试类应继承与 AbstractJUnit4SpringContextTests 或 AbstractTransactionalJUnit4SpringContextTests

对于 AbstractJUnit4springcontextTests 和 AbstractTransactionalJUnit4SpringContextTests 类的选择:如果再你的测试类中,需要用到事务管理(比如要在测试结果出来之后回滚测试内容),就可以使用AbstractTransactionalJUnit4SpringTests类。事务管理的使用方法和正常使用Spring事务管理是一样的。再此需要注意的是,如果想要使用声明式事务管理,即使用AbstractTransactionalJUnitSpringContextTests类,请在applicationContext.xml文件中加入transactionManager bean:

  1. <bean id="transactionManager"
  2. class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  3.     <property name="dataSource" ref="dataSource" />
  4. </bean>
复制代码

五、配置测试类
添加如下内容在class前,用于配置applicationContext.xml文件的位置,回去读取Spring管理的bean,这样就可以通过依赖注入的方式来使用实例了。
  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @ContextConfiguration(locations={"classpath:/config/applicationContext-*.xml"})
复制代码

六、创建测试方法
创建测试用方法,推荐名称为 “被测方法名称+ Test”。
测试方法上方加入 @Test

七、 通过JUnit 4 执行
右键方法名,选择则“Run As”→“JUnit Test”即可,或者选择运行整个Class文件

八、JUnit属于白盒测试的一种。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1
回复

使用道具 举报

  • TA的每日心情
    慵懒
    2019-3-22 12:17
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    2#
    发表于 2019-3-22 12:12:17 | 只看该作者
    我之前学的开发,Junit做的这种单元测试基本上还是开发搞定的吧?
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-23 07:29 , Processed in 0.067076 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表