什么是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. git常用代码合集

    git常用代码合集 1. Git init:初始化一个仓库 2. Git add 文件名称:添加文件到Git暂存区 3. Git commit -m “message”:将Git暂存区的代码提交到Gi ...

  2. MQ消息队列(2)—— Java消息服务接口(JMS)

    一.理解JMS   1.什么是JMS?         JMS即Java消息服务(Java Message Service)应用程序接口,API是一个消息服务的标准或者说是规范,允许应用程序组件基于J ...

  3. python黑帽子之udp客户端

    将上文的TCP客户端简单修改便能得到UDP客户端 import socket target_host = "127.0.0.1" target_port = 80 client = ...

  4. 错误C2280 Union:尝试引用已删除的函数

    在编写Union共用体类型的时候,写了如下代码,在第5行出现错误: #include <iostream> #include <string> using namespace ...

  5. 深入理解JavaScript系列(2):揭秘命名函数表达式(转)

    前言 网上还没用发现有人对命名函数表达式进去重复深入的讨论,正因为如此,网上出现了各种各样的误解,本文将从原理和实践两个方面来探讨JavaScript关于命名函数表达式的优缺点. 简 单的说,命名函数 ...

  6. SecureCRT连接阿里云ECS服务器,经常掉线的解决方案

    1 使用SecureCRT远程连接后,Options > Session Options > Terminal(终端) > 勾选 “Send protocol NO-OP”

  7. 看源码,重新审视Spring Security中的角色(roles)是怎么回事

    在网上看见不少的博客.技术文章,发现大家对于Spring Security中的角色(roles)存在较大的误解,最大的误解就是没有搞清楚其中角色和权限的差别(好多人在学习Spring Security ...

  8. WSL配置高翔vslam环境配置流水账

    1 安装参考博文链接:https://www.cnblogs.com/dalaska/p/12802384.html 2 Ubuntu 16.04地址:https://www.microsoft.co ...

  9. Quartz.Net系列(九):Trigger之CronScheduleBuilder和Cron表达式详解

    1.使用 var scheduler =await StdSchedulerFactory.GetDefaultScheduler(); await scheduler.Start(); var jo ...

  10. Redis为何是单线程的

    以前一直有个误区,以为:高性能服务器 一定是 多线程来实现的 原因很简单因为误区二导致的: 多线程 一定比 单线程 效率高.其实不然. redis 核心就是 如果我的数据全都在内存里,我单线程的去操作 ...