单元测试--JUnit4了解一下(eclipse环境)

简介:

参考自:
偏头痛杨的为什么我们要写单元测试用例?
junit4入门视频
junit4备忘录
先来看一下目录:

1. JUnit是什么?
2. 为什么用JUnit?
3. 测试驱动开发是什么?
4. 在eclipse中为项目添加Junit环境
5. 创建单元测试类实例
6. 常用JUnit4注解
7. 测试失败的两种情况
8. 断言
9. JUnit测试套件的使用
10. JUnit参数化设置

最后 本来 JUnit4要结合Web项目才更实用,可是吧 我还是没接触到,现在也只是简单介绍一下
下面内容只要有java基础和eclipse的使用能力就可以参考

学新知识的三个必问:

JUnit是什么?
为什么用JUnit?
JUnit怎么用?

JUnit是什么?

JUnit是单元测试的基础单元测试框架。
那又什么是单元测试呢?

每编写完一个函数之后,都应该对这个函数的方方面面进行测试,
这样的测试我们称之为单元测试。

单元测试是代码正确性验证的工具。需要编写代码才能进行测试的一种测试方法。

为什么用JUnit?

使用单元测试能够帮助我们减少在开发过程中的错误,把Bug扼杀在萌芽之中,
有利于代码的后期维护和检查。
做好了单元测试可以缩短开发周期,提高代码质量。主要用于中大型项目
而JUnit是单元测试的基本单元测试框架
对复杂的单元测试情况则要借助第三方框架和技术,这里就不多介绍了。

简单举例:

当你项目编译,打包,启动项目后发现没有启动相关权限,然后手动开启,然后  
又发现有个bug,然后断点调试,修改后又编译,打包,启动项目, 
这个时候又发现自己修改错了,又得从头来过。这个时候是不是要炸了,  
反正是我就原地螺旋爆炸,  效率低不说,还不利于维护。

总结:
通过写单元测试用例的方式,把问题暴露在没有这一堆前置步骤的时候
这样会节省我们大量的前置步骤时间。
开发人员实现某个功能或者修补了某个bug,如果有相应的单元测试支持的话,
开发人员可以马上通过运行单元测试来验证之前完成的代码是否正确,

粗浅理解:

JUnit可以不用main就可以启动单元测试用例,  
查看指定的方法是否跟预期的一样。

有句话说的好:

测试用例不是用来证明你(的逻辑)是对的,  
而是用来证明你(的断言)没有错。

上面什么意思?

答:测试用例只是用来达到想要的预期结果,但对代码逻辑错误无能为力。

你也可以说测试用例只看结果 不看过程

测试驱动开发:

“码未动,测试先行。”这是极限编程中倡导的一种编程模式,为什么要这样呢?
因为我们在编写单元测试的过程中,其实就是在设计我们的代码将要处理哪些问题。
单元测试写的好,就代表你的代码写的好。
而且你会根据单元测试的一些预先设想的情况去编写代码,
就不会盲目的添加一个属性、添加一个方法了。

好了进入正题 前面bb了好多,其实也是参考了别人的原话来的,如果想看的话 参考开头贴出的几个地址,因为我也是从上面总结的。

要是没理解 那我再来总结一遍

以前我们要是测试一段代码是否正确怎么做呢?
反正我是System.out.println() 或者断点才可以查看代码的结果 不只是我   
相信大家都是这么过来的吧。
现在介绍一个新的方法就是`JUnit`来测试代码。

JUnit是一个Java语言的单元测试框架。
至于JUnit4还是JUnit5这个选择还是得看你自己,前者已经统治了10余年,后者刚出来没多久还在测试阶段,网上的资料也很多都是围绕JUnit4的。
junit4基本用注解实现.
有人会问 什么是注解?
我也是直接百度百科搜的:
也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

这里也就介绍JUnit4了。

在eclipse中为项目添加Junit环境:

右键Java项目,在build path中“add library”,添加Junit 然后选择Junit4
最后会显示这样:
这里写图片描述

首先创建一个你需要检测的类 然后写正常方法

再创建单元测试类实例:

  1. 右键要src 选择Source Folder,创建来源于src的文件夹 最好是test名字,因为是用来存放单元测试类的。(注意 :文件是在src文件夹下哦)
  2. 然后右击创建的文件夹选择“new”,创建Junit test case(测试类实例)
    这里写图片描述

3. 然后自己添加一个测试方法:
这里写图片描述
项目或者包或者测试方法右击 run as ->JUnit Text
显示:
这里写图片描述
第二个有x是因为fail fail方法是指测试失败 删掉就好了
这里写图片描述

其中:

Runs: 运行的测试单元方法数  是指@Test数量
Errors:抛出异常的测试方法计数器
Failures:失败的测试方法计数器

其中使用@Test标签标注测试方法
assertEquals测试2个参数是否相等。

测试方法通过@Test来标识,初始化方法通过@Before来标识,释放资源的方法通过@After来标识。

问题1:

可是上面这个run as方法 是全部都测试    
那有没有办法只测试其中的方法呢?
点击单元测试类,下面显示全部测试方法 ,选择要测试的方法   
然后run as即可

这里写图片描述

问题2:

如果手动添加单元测试类的测试方法那多累啊 万一有很多方法呢?
答:右击要测试的类 然后new -->other

这里写图片描述

选择 JUnit Test Case
然后 next

这里写图片描述

最后finsh

结果:
这里写图片描述

遇到这个问题:

这里写图片描述
重新创建一个项目就好了 不知道为什么……有知道的 可以告诉我一下,谢谢

常用JUnit4注解


@BeforeClass: public static void方法 是静态方法,当前测试类被加载后就执行,意思就是在所有的测试方法运行前被执行; 在内存中也只有一份实例,适合加载配置文件
@Before: public void方法,当前测试类,他会在所有方法运行结束后被执行; 可以用来创建一些测试数据。 无论用例成功or失败都会run这个

@Test: public void方法,将一个普通的方法修饰成为一个测试方法。具有两个参数(可选):

timeout: 该测试方法允许执行的最大时间长度。单位ms
@Test(timeout=5000)
执行超出时间无法通过(单位毫秒)会抛出error错误 但是程序也强制结束 
一般用于解决死循环问题

expected: 捕获抛出的异常。xx.class
@Test(expected=NullPointerException.class) 
出了指定异常才会通过,上面定义的异常可以是父类异常,方法中抛的异常只要是其子类都可以。


@AfterClass: public static void方法,与@BeforeClass组成一对,在当前测试类做完所有测试后执行的一个方法;通常用来对资源的清理,如数据库的关闭

@After:对应@Before
使用了该元数据的方法在每个测试方法执行之后要执行一次, 
如果希望每次运行测试方法之后运行指定的回收资源的方法。
无论用例成功or失败都会run这个

@Ignore: 所修饰的测试方法会被测试运行器忽略,需要写在@Test上面;
还可以加上点信息 如@Ignore("...")

@RunWith: 更改测试运行器,自定义运行器需要继承于org.junit.runner.Runner。 一般使用默认的就可以完成大部分工作



@Ignore
如果希望Junit忽略某个被测试的方法,可以使用@Ignore Annotaion来修饰.

@FixMethodOrder(MethodSorters.NAME_ASCENDING)   
junit测试用例,按文字顺序执行,修饰在类上。

可以选择创建测试用例的时候自动生成after等:
这里写图片描述
看一下样例:

    @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 {
        System.out.println("Before");
    }

    @After
    public void tearDown() throws Exception {
        System.out.println("After");
    }

    @Test
    public void test1() {
        System.out.println("test1");
    }
    @Test
    public void test2() {
        System.out.println("test2");
    }

输出:

BeforeClass
Before
test1
After
Before
test2
After
AfterClass

注意:

1. 测试方法上必须使用@Test进行修饰;
2. 测试方法必须使用public void 进行修饰,不能待任何的参数;
3. 新建一个源文件目录存放我们的测试代码
4. 测试单元中的每个方法必须可以独立测试,  
测试方法间不能有任何的依赖;
5. 测试类的包应该和被测试的包保持一致
测试类使用Test作为类名的后缀(可选);
测试方法使用test作为方法名的前缀(可选);

测试失败的两种情况:

  1. Failure一般是由单元测试使用的断言方法判断失败所引起的 这表示程序输出的结果和我们预期的不一样
  2. error是代码异常引发的,他可以产生于测试代码本身的错误,也可以产生于被测试代码中的一个隐藏的bug

那怎么看错误:
这里写图片描述

可以看Failure Trac 错误队列

断言

断言在org.junit.Assert类中,有一组以assert开头的方法用于断言测试,基本上涵盖了大部分需求。

回到开头讲的

    测试用例不是用来证明你(的逻辑)是对的,  
    而是用来证明你(的断言)没有错。

如果断言为真,测试通过,如果断言为假,测试失败。

就是我们用来测试程序是否和预期值结果一样的 static void 方法如:
assertEquals(expected, actual); 这是比较方法返回值和预期值的比较
来判断程序是否符合某个条件,
在举一下其他栗子:

assertTrue    真值断言
assertFalse    假植断言
assertEquals    相等断言
assertNotEquals    不等断言
assertNull    空值断言
assertNotNull    非空值断言
assertFail    断言失败

JUnit测试套件的使用--批量运行测试类

测试套件就是组织测试类一起运行 而不需要一次运行一个测试类
写一个作为测试套件的入口类,这个类不能包涵其他的方法
然后 更改测试运行器Suite.class
将要测试的类作为参数传入到Suite.SuiteClasses({})中

举个栗子 : 正常创建一个测试类

@RunWith(Suite.class)
@Suite.SuiteClasses({ssTestaa.class,ssTest11.class})
public class hah {


}
然后启动hah这个测试类就行了

效果图:
这里写图片描述

JUnit参数化设置--批量运行多组测试用例

很多时候,我们需要对一个测试,输入多组测试用例来验证代码的正确性。在junit4中,我们不需要编写n个测试方法。 只需要参数化设置

  1. 更改默认的测试运行器为RunWith(Parameterized.class)
  2. 声明变量存放预期值和结果值 (随便起名字,class中自己使用,expected/input1/input2);
  3. 声明一个返回值为Collection的公共静态方法,并使用@Parameters进行修饰
  4. 为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值

举个栗子:

package day1;

import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;



@RunWith(Parameterized.class)
public class ssText {
    int expected=0;
    int input1=0;
    int input2=0;
    
    @Parameterized.Parameters
    public static Collection<Object[]> params(){
        return Arrays.asList(new Object[][]{
                {3,2,1},
                {4,1,4}
        });
    }
    
    public ssText(int expected,int input1,int input2) {
        this.expected=expected;
        this.input1=input1;
        this.input2=input2;
    }
    @Test
    public void test() {
        assertEquals(expected, new ss().add(input1, input2));
    }

}

结果:
这里写图片描述

自己也是初学,难免有差错
如有问题,欢迎讨论,一起学习,一起进步。

目录
相关文章
|
3月前
|
消息中间件 测试技术
项目环境测试问题之规范执行器的异常处理如何解决
项目环境测试问题之规范执行器的异常处理如何解决
|
9天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
15天前
|
编解码 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(10-2):保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali——Liinux-Debian:就怕你学成黑客啦!)作者——LJS
保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali以及常见的报错及对应解决方案、常用Kali功能简便化以及详解如何具体实现
|
2月前
|
JavaScript 测试技术 Windows
vue配置webpack生产环境.env.production、测试环境.env.development(配置不同环境的打包访问地址)
本文介绍了如何使用vue-cli和webpack为Vue项目配置不同的生产和测试环境,包括修改`package.json`脚本、使用`cross-env`处理环境变量、创建不同环境的`.env`文件,并在`webpack.prod.conf.js`中使用`DefinePlugin`来应用这些环境变量。
93 2
vue配置webpack生产环境.env.production、测试环境.env.development(配置不同环境的打包访问地址)
|
1月前
|
分布式计算 Hadoop 大数据
大数据体系知识学习(一):PySpark和Hadoop环境的搭建与测试
这篇文章是关于大数据体系知识学习的,主要介绍了Apache Spark的基本概念、特点、组件,以及如何安装配置Java、PySpark和Hadoop环境。文章还提供了详细的安装步骤和测试代码,帮助读者搭建和测试大数据环境。
53 1
|
1月前
|
前端开发 测试技术 程序员
在工作中会涉及到的几个环境(概念补充) 办公环境、开发环境、测试环境、线下环境、线上环境/生产环境都是什么,他们之间的关系?
本文解释了在职场中可能会接触到的不同环境,包括办公环境、开发环境、测试环境和生产环境(线上环境),以及它们之间的关系和重要性。
62 1
ACE
|
2月前
|
SQL 分布式计算 数据处理
如何创建2024云栖Openlake测试项目和配置环境
2024年云栖大会,MaxCompute 多项重磅产品新功能邀测发布,新特性包括 支持OpenLake的湖仓一体2.0、Object Table支持SQL或MaxFrame处理非结构化数据、Delta Table增量表格式、基于增量物化视图的增量计算、MCQA2.0 SQL引擎查询加速等。其相关特性将在中国区 公共云 北京、上海、杭州、深圳Region 上线开放试用。本文以最佳实践的方式,帮助您创建MaxCompute和周边产品 在Openlake解决方案demo中需要准备的实例、项目和开发环境,并完成配置。欢迎您玩转云栖邀测demo,体验新功能。
ACE
521 7
|
2月前
|
Web App开发 Linux Python
linux上安装selenium环境及测试
该文章提供了在Linux CentOS上安装Selenium环境、Chrome浏览器及Chromedriver的详细步骤,并演示了如何以无头模式进行测试。
171 0
|
2月前
|
存储 监控 安全
在自动化测试环境中,如何确保测试数据的安全性和隐私性
在自动化测试环境中,如何确保测试数据的安全性和隐私性
|
3月前
|
测试技术
单元测试问题之使用TestMe时利用JUnit 5的参数化测试特性如何解决
单元测试问题之使用TestMe时利用JUnit 5的参数化测试特性如何解决
47 2

推荐镜像

更多