junit初探

由于公司规模不大,所以测试方面一直不是很正规,都是做完一个功能,稍微测试一下,没有做单元测试,所以自然也没有接触过类似于junit这类测试的工具。

今天有空研究了一下junit,顾名思义,这是给java用的单元测试工具。经过一番研究,大概知道它是一个什么样的东东。

1.之前我们在写代码的时候,在运行的时候其实就是包含了测试这个工作,我们的做法是写一个main方法,作为我们的程序入口,然后执行我们的程序,根据执行的结果跟我们的预期结果的对比,来确定程序是否有错误。

2.上述是程序测试的最朴素的雏形,其实junit的原理大致也是如上,只不过它是封装好的工具,用起来方便许多,在一个junit测试类中,我们可以写很多个测试方法,这些方法你都可以当成是main方法,而这些测试方法之间互不影响,他们都负责测试一个个单元(可以是一个方法),而每个测试类又是一个单元。这样的好处就是我们不必运行整个项目来做一个测试,而只是测试一部分,等所有这些小的部分都测试完成以后,我们再测试一个更大的模块。

3.测试所生成的class文件,在打包的时候不会生成到war包中。因为他并不是逻辑代码。

接下来在已有项目中做一个单元测试的demo。话不多说,直接写操作方法。

1.我的是maven项目,首先在pom.xml文件中引入相关jar包。

    <!-- 测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

2.选定要做测试的类,这边我选定了一个Service类做测试,右键---new--Junit Test Case

3.接下来这一步,会让你选择将这个测试类放在哪里,我们要选择放在src/test/java这个文件夹下面。然后eclipse默认会给这个测试类的包跟被测试的类的包是一样的。类名称在原类的后面加上Test。

4.点击完成以后,我们就可以得到一个测试类了。此时项目的结构如下图。

5.我们打开AdminServiceTest类,此时里面有对应于AdminService类的测试方法,但是需要我们去填充。大概的样子就是下面这样(下面这个测试类不是我们上文的AdminServiceTest,是我新建的另一个类)

 

 6.现在我们来填充这些方法,这边需要注意的一个问题是,我们是基于spring的web项目,有些方法要跑起来必须得初始化整个spring容器,过去我自己写main方法测试的时候,大概是这样来做的。

 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

AdminService adminService=(AdminService) context.getBean("adminService");

用上面的代码先获取spring容器,然后再从容器中拿到相应的bean,然后就可以操作了。

但是spring的测试模块可以采用注解的方式让我们省去这个步骤,具体代码如下。

package com.xdx.service;

import java.util.List;

import javax.annotation.Resource;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.xdx.entity.TAdmin;
import com.xdx.util.MD5;
import com.xdx.util.ParamModel;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:ApplicationContext.xml"})
public class AdminServiceTest extends
        AbstractTransactionalJUnit4SpringContextTests {
    @Resource(name = "adminService")
    private AdminService adminService;

    @Test
    public void testGetAdminByPm() {
        ParamModel pm = new ParamModel();
        pm.setAdminName("xdx");
        List<TAdmin> adminList = adminService.getAdminByPm(pm);
        System.out.println(adminList);
    }

    @Test
    public void testGetAdminSizeByPm() {
        int ex_size = 1;
        ParamModel pm = new ParamModel();
        pm.setAdminName("xdx");
        int ac_size = adminService.getAdminSizeByPm(pm);
        Assert.assertEquals("计算数目有错", ex_size, ac_size);
    }

    @Test
    @Rollback(true)
    // 事务自动回滚,默认是true。可以不写
    public void testSaveAdmin() {
        TAdmin admin = new TAdmin();
        admin.setAdminName("test");
        admin.setRealName("测试用户");
        admin.setPassword(MD5.cell32("123456"));
        int ac_result = adminService.saveAdmin(1, admin);
        int ex_result = 1;
        Assert.assertEquals("插入出错", ex_result, ac_result);
    }

    @Test
    public void testDeleteAdmin() {
        int adminId=5;
        int ex_result=1;
        int ac_result=adminService.deleteAdmin(adminId);
        Assert.assertEquals("删除出错", ex_result, ac_result);
    }

    @Test
    public void testGetAdminById() {
        int adminId = 1;
        TAdmin admin = adminService.getAdminById(adminId);
        System.out.println("testGetAdminById:" + admin);
    }

    @Test
    public void testGetAdminByName() {
        String adminName = "xdx";
        TAdmin admin = adminService.getAdminByName(adminName);
        System.out.println(admin);
    }

}

其中ContextConfiguration这个注解,我猜测其让我们在执行测试代码之前,加载了spring容器,这样我们就可以获取容器中的adminService对象,从而对其代码进行测试了。

PS:这边还有一个注意的是,对于涉及到增,删,改的操作,测试代码会自动回滚数据操作,也就是说,它只负责测试代码对不对,而不会真正改变数据库的东西。除非你在方法上注解 @Rollback(false).

7.我们在这个类上右键,run as junit Test,就可以查看测试结果了。

以下是测试结果。

 

时间: 2024-10-28 19:09:51

junit初探的相关文章

Think in Java 笔记_Chapter20_2_Annocation和Junit

/2015年04月05日12:13:43 基于Annotation和Reflection的Junit初探: package cn.seven.shengsiyuan.annocation.junitan; import org.junit.Test; public class JunitSource { //疑问就是为甚这边不写main方法,方法不被调用就可以直接执行呢??-反射 @Test public void Hello() { System.out.println("hello worl

ST lab1——Junit和覆盖测试的初探

实验名称: 软件测试第一次实验 实验目的: 了解Junit,Hamcrest,Eclemma这些intelij idea插件或开发包的使用 实验内容: 写一个java程序,判断一个给定三边的三角形是等边三角形.等腰三角形.还是非等边三角形,并用Junit,Hamcrest,Eclemma进行功能测试和覆盖性测试. 实验步骤: 1)  下载Junit,Hamcrest,Eclemma对应的软件开发包 这里我使用的是junit-4.12.jar和hamcrest-all-1.3.jar 2)  为i

Android单元测试初探——Instrumentation(转载)

学习Android有一段时间了,虽然前段时间对软件测试有了一些了解,不过接触android的单元测试却是头一次.这几天在物流大赛上也用了不少时间,所以对于android的单元测试没有太深入的研究,所以先写个基本入门吧! 首先,我们来了解一下android的测试类的层次结构: 可以看出android中的测试方法主要有AndroidTextCase和InstrumentationTextCase.在这篇文章中,我将介绍Instrumentation这种测试方法,那么什么是Instrumentatio

Redis的Keyspace notifications功能初探

本文出处:http://blog.csdn.net/chaijunkun/article/details/27361453,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在原始出处查看此文. 最近在做一套系统,其中要求若干个Worker服务器将心跳信息都上报给中央服务器.当一定时间中央服务器没有得到心跳信息时则认为该Worker失效了,发出告警. 满足这种需求的解决方法多种多样,我开始想到了memcache,上报一次心跳信息就刷新一次缓存,当缓存内心跳信息对象超时被

JVM初探- 使用堆外内存减少Full GC

JVM初探-使用堆外内存减少Full GC 标签 : JVM 问题: 大部分主流互联网企业线上Server JVM选用了CMS收集器(如Taobao.LinkedIn.Vdian), 虽然CMS可与用户线程并发GC以降低STW时间, 但它也并非十分完美, 尤其是当出现Concurrent Mode Failure由并行GC转入串行时, 将导致非常长时间的Stop The World(详细可参考JVM初探- 内存分配.GC原理与垃圾收集器). 解决: 由GCIH可以联想到: 将长期存活的对象(如L

Gradle初探

(一):创建一个Gradle项目 1. 环境准备 1.1. 先上Gradle官网下载最新版的程序,地址:https://gradle.org/gradle-download/. 1.2. 配置环境变量 GRADLE_HOME:值为gradle根目录路径,并在PATH中添加 "%GRADLE_HOME%\bin" 1.3. 配置IDE工具的Gradle环境 这里我使用IDEA进行创建(eclipse应该也有对应的gradle插件). 首先在IDEA的settings中找到Gradle选项

Spring初探:概念认知与特点分析

Spring初探 1. Spring是什么? Spring 是一个开源的轻量级 Java SE( Java 标准版本)/Java EE( Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发.在传统应用程序开发中,一个完整的应用是由一组相互协作的对象组成的.所以开发一个应用除了要开发业务逻辑之外,最多的是关注使这些对象协作来完成所需功能的同时,实现低耦合.高内聚.所以,业务逻辑开发是不可避免的.如果有个框架可以帮我们来创建对象及管理这些对象之间的依赖关系,能通过配置方式来创建对象

单元测试Junit

###<center> 单元测试Junit </center>###- - -1.**单元测试**:> ==单元测试==是软件之中对于最小的功能模块的的测试,其可以对最基本的软件构成单元来测试.> 需要注意的是:> >**测试用例是用来达到测试想要的预期结果,而不能测试出程序的逻辑错误**. 2.**JUnit**:>1.**Junit是基于断言机制的**.是用于编写可复用测试集的简单框架,是xUnit的一个子集.xUnit是一套基于测试驱动开发的测试

进阶之初探nodeJS

一.前言 在"初探nodeJS"随笔中,我们对于node有了一个大致地了解,并在最后也通过一个示例,了解了如何快速地开启一个简单的服务器. 今儿,再次看了该篇随笔,发现该随笔理论知识稍多,适合初级入门node,固萌生一个想法--想在该篇随笔中,通过一步步编写一个稍大一点的node示例,让我们在整体上更加全面地了解node. so,该篇随笔是建立在"初探nodeJS"之上的,固取名为"进阶之初探nodeJS". 好了,侃了这多,那么我们即将实现一个