• 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,就可以查看测试结果了。

    以下是测试结果。

     PSS:junit的基础知识,可以戳这里

    还有这里

  • 相关阅读:
    剑指Offer:数组中的逆序对
    Java高并发教程:Java NIO简介
    Java高并发教程:高并发IO的底层原理
    算法相关——Java排序算法之希尔排序(五)
    Materialized View模式
    Java技术——Java中的static关键字解析
    算法相关——Java排序算法之插入排序(四)
    Android Studio 2.2新增布局——ConstraintLayout完全解析
    公平锁与非公平锁
    Java线程和多线程(十五)——线程的活性
  • 原文地址:https://www.cnblogs.com/roy-blog/p/7412293.html
Copyright © 2020-2023  润新知