什么是Junit?

Junit是xUnit的一个子集,在c++,paython,java语言中测试框架的名字都不相同
xUnit是一套基于测试驱动开发的测试框架
其中的断言机制:将程序预期的结果与程序运行的最终结果进行比对,确保对结果的可预知性
java所用的测试工具是Junit

使用 JUnit 需要导入 JUnit 包。官方网站:https://junit.org/junit5/
在不同编译器下的导包过程不一样,这里以 Maven 为例

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

测试流程

创建测试文件

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

目标代码:

package com.imooc.util;

public class Calculate {
public int add(int a,int b) {
return a + b;
} public int subtract(int a, int b) {
return a - b;
} public int multiply(int a,int b) {
return a * b;
} public int divide(int a ,int b) {
return a / b;
}
}

创建测试代码

右键选中需要测试的目标代码,创建 JUnit Test Case 测试用例。



测试代码:

package com.imooc.util;

import static org.junit.Assert.*;

import org.junit.Test;

public class CalculateTest {

    /*
* 1.测试方法上必须使用@Test进行修饰
* 2.测试方法必须使用public void 进行修饰,不能带任何的参数
* 3.新建一个源代码目录来存放我们的测试代码
* 4.测试类的包应该和被测试类保持一致
* 5.测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖
* 6.测试类使用Test作为类名的后缀(不是必须)
* 7.测试方法使用test作为方法名的前缀(不是必须)
*/
@Test
public void testAdd() {
assertEquals(6, new Calculate().add(3,3));
} @Test
public void testSubtract() {
assertEquals(3, new Calculate().subtract(5,2));
} @Test
public void testMultiply() {
assertEquals(4, new Calculate().multiply(2, 2));
} @Test
public void testDivide() {
assertEquals(3, new Calculate().divide(6, 2));
}
}


注意:

  1. Failure 一般由单元测试使用的断言方法判断失败所引起的,这表示在测试点发现了问题,即 程序输出的结果和我们预期的不一样。
  2. error 是由代码异常引起的,它可以产生于测试代码本身的错误,也可以是被测试代码中的一个隐藏 bug。
  3. 测试用例不说用来证明你是对的,而是用来证明你没有错

注释

演示代码:

package com.imooc.util;

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test; public class JunitFlowTest { /*
* 1.@BeforeClass修饰的方法会在所有方法被调用前被执行,
* 而且该方法是静态的,所以当测试类被加载后接着就会运行它,
* 而且在内存中它只会存在一份实例,它比较适合加载配置文件。
* 2.@AfterClass所修饰的方法通常用来对资源的清理,如关闭数据库的连接
* 3.@Before和@After会在每个测试方法的前后各执行一次。
*
*/
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("this is beforeClass...");
} @AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("this is afterClass...");
} @Before
public void setUp() throws Exception {
System.out.println("this is before...");
} @After
public void tearDown() throws Exception {
System.out.println("this is after");
} @Test
public void test1() {
System.out.println("this is test1...");
} @Test
public void test2(){
System.out.println("this is test2...");
} }

运行结果:

隐藏的固定代码:

  1. @BeforeClass 修饰的方法会在所有方法被调用前被执行,而且该方法是静态的,所以当测试类被加载后接着就会运行它,而且在内存中它只会存在一份实例,它比较适合加载配置文件以及一些只用加载一次的东西。
  2. @AfterClass 所修饰的方法通常用来堆资源的清理,如关闭数据库的连接
  3. @Before@After 会在每个测试方法的前后各执行一次。

    这些都是固定代码,运行时一定会被执行


常用注释:

  • @Test:将一个普通的方法修饰成为一个测试方法

    • @Test(expected=XX.class)
    • @Test(timeout=毫秒)

-@BeforeClass:它会在所有的方法运行前被执行,static 修饰
-@AfterClass:它会在所有的方法运行结束后被执行,static 修饰

  • @Before:会在每一个测试方法被运行前执行一次
  • @After:会在每一个测试方法运行后被执行一次
  • @Ignore:所修饰的测试方法会被测试运行器忽略
  • @RunWith:可以更改测试运行器(如想自定义测试运行器可继承 org.junit.runner.Runner)
    可以配合测试套件使用。

测试套件

测试套件:可以组织测试类一起运行。

  1. 写一个作为测试套件的入口类,这个类里不包含其他的方法
  2. 更改测试运行器为 @RunWith(Suite.class)
  3. 将要测试的类作为数组传入到 @Suite.SuiteClasses({A,B,...})

演示代码:

package com.imooc.util;

import static org.junit.Assert.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite; @RunWith(Suite.class)
@Suite.SuiteClasses({TaskTest1.class,TaskTest2.class,TaskTest3.class})
public class SuiteTest {
/*
* 1.测试套件就是组织测试类一起运行的
*
* 写一个作为测试套件的入口类,这个类里不包含其他的方法
* 更改测试运行器Suite.class
* 将要测试的类作为数组传入到Suite.SuiteClasses({})
*/
}

这段代码可以将 TaskTest1、2、3 同时运行测试。从而达到测试套件的效果。

参数化设置

  1. 更改默认的测试运行器为 @RunWith(Parameterized.class)
  2. 声明变量来存放预期值和结果值
  3. 声明一个返回值为 Collection<> 的公共静态方法,并使用 @Parameters 进行修饰
  4. 为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值
  5. 编写测试方法,使用变量

演示代码:

package com.imooc.util;

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;
import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class)
public class ParameterTest {
/*
* 1.更改默认的测试运行器为RunWith(Parameterized.class)
* 2.声明变量来存放预期值 和结果值
* 3.声明一个返回值 为Collection的公共静态方法,并使用@Parameters进行修饰
* 4.为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值
*/
int expected = 0;//预期值
int input1 = 0;//输入值1
int input2 = 0;//输入值2 @Parameters //可以将返回的参数依次放入构造方法中进行测试
public static Collection<Object[]> t() {
return Arrays.asList(new Object[][]{
{3,1,2},//预期值,输入值1,输入值2
{4,2,2}
}) ;
} public ParameterTest(int expected,int input1,int input2) {
this.expected = expected;
this.input1 = input1;
this.input2 = input2;
} @Test
public void testAdd() {
assertEquals(expected, new Calculate().add(input1, input2));
} }

在 Spring 中进行测试

Spring 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>
<bean id="date" class="java.util.Date"/>
</beans>

Spring 测试代码

package com.imooc.conform;

import java.util.Date;

import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringTest { private static ApplicationContext context = null;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
context = new ClassPathXmlApplicationContext("applicationContext.xml");
} @Test
public void test() {
Date date = (Date) context.getBean("date");
System.out.println(date);
}
}

【JUnit测试】总结的更多相关文章

  1. 复利计算器(软件工程)及Junit测试———郭志豪

    计算:1.本金为100万,利率或者投资回报率为3%,投资年限为30年,那么,30年后所获得的利息收入:按复利计算公式来计算就是:1,000,000×(1+3%)^30 客户提出: 2.如果按照单利计算 ...

  2. Junit测试框架 Tips

    关于Junit测试框架使用的几点总结: 1.Junit中的测试注解: @Test →每个测试方法前都需要添加该注解,这样才能使你的测试方法交给Junit去执行. @Before →在每个测试方法执行前 ...

  3. junit测试,使用classpath和file 加载文件的区别

    用junit测试发现一个问题,怎么加载配置文件?一直都出现这样的错误 ERROR: org.springframework.test.context.TestContextManager - Caug ...

  4. Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法

    一.单元测试的目的 简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期修改后(不论是增加新功能,修改bug),都可以做到重新测试的工作.以减少我们在发布的时候出现更过甚至 ...

  5. 单元测试实战 - Junit测试

    一.对加法函数进行测试 1.实例化被测单元(方法):类名 实例名=new 类名([参数]) 2.调用被测单元,对比预期值和输出值(实际值): 在没有junit测试工具的情况下,我们要进行如下的测试代码 ...

  6. Android Junit测试框架

    对应用进行单元测试: 使用Junit测试框架,是正规Android开发的必用技术.在Junit中可以得到组件,可以模拟发送事件和检测程序处理的正确性. 1.配置指令集和函数库: (1)配置指令集,指定 ...

  7. 在Eclipse中生成接口的JUnit测试类

    在Spring相关应用中,我们经常使用“接口” + “实现类” 的形式,为了方便,使用Eclipse自动生成Junit测试类. 1. 类名-new-Other-java-Junit-Junit Tes ...

  8. Struts2+Spring+Mybatis+Junit 测试

    Struts2+Spring+Mybatis+Junit 测试 博客分类: HtmlUnit Junit Spring 测试 Mybatis  package com.action.kioskmoni ...

  9. Junit测试打印详细的log日志,可以看到sql

    Junit测试打印详细的log日志,可以看到sql 在log4j.xml的日志配置文件中,把日志级别从info级别调整到debug级别: <?xml version="1.0" ...

  10. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

随机推荐

  1. Windows下6款实用软件(强烈推荐!)

    Windows下6款实用软件 1.notepads Notepads作为一款编辑器,美观.轻量,功能强大,支持多标签页.Markdown.日常文本编辑.查看,Notepads轻松胜任,如果厌烦了Win ...

  2. CF #640 (div4)

    CF640 div4 草 迟到半个月的补题 真正的懒狗 再懒就无了 D. Alice, Bob and Candies 题意:n个数字,奇数时间从左侧删数字,偶数时间从右侧删数字,每次删的数字之和必须 ...

  3. cookie和session及token

    cookie,session傻傻分不清楚? 做了这么多年测试,还是分不清什么是cookie,什么是session?很正常,很多初级开发工程师可能到现在都搞不清什么是session,cookie相对来说 ...

  4. 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  5. C++多种方法枚举串口号

    部分方式没结果,思路应该是没错. //7. std::cout << "M8: SetupDiGetClassDevs " << std::endl; // ...

  6. Android 伤敌一千自损八百之萤石摄像头集成(一)

    最近忙着修改萤石摄像头C3型号开头的设备添加 本来不是很复杂的事情. , 现在我感觉我入魔了 总感觉这是个小人 螺丝口是眼睛 插入SD卡的事鼻子嘴 接信号的事手 怎么看怎么像愤怒的小人 总结,先看一下 ...

  7. Python中的错误和异常

    前言 错误是程序中的问题,由于这些问题而导致程序停止执行.另一方面,当某些内部事件发生时,会引发异常,从而改变程序的正常流程. python中会发生两种类型的错误. 语法错误 逻辑错误(异常) 语法错 ...

  8. wsl环境下配置ubuntu16.04

    wsl环境下配置ubuntu16.04 在公司同事的安利下,终于给自己用了8年的老笔记本(戴尔XPS L502X)换上了固态硬盘(WD500G,SATA3接口) 当然,系统重装了一遍,所有的软件也都没 ...

  9. sublime 搜索时忽略文件夹

    如上图:添加 "folder_exclude_patterns": ["要忽略的文件夹"]

  10. gulp之demo

    1.安装gulp cnpm install -g gulp; 2.然后还需要在当前目录安装gulp,具体不详,只知道安装了之后会在当前目录下的node_modules下多一个gulp文件夹 cnpm ...