zoukankan      html  css  js  c++  java
  • Spring Boot 入门之单元测试篇(五)

    博客地址:http://www.moonxy.com

    一、前言

    JUnit 是一个由 Java 语言编写的开源的回归测试(回归测试是指重复以前全部或部分的相同测试)框架,由Erich Gamma 和 Kent Beck 创建,用于编写和运行可重复的测试,它是用于单元测试框架体系 xUnit 的一个实例。所谓单元测试也就是白盒测试。JUnit 是 Java 开发使用最为广泛的框架。Spring Boot 在 JUnit 基础上提供了一些实用程序和注解,用来帮助我们测试应用程序。

    二、JUnit 测试

    2.1 基本功能

    JUnit 3.x 版本通过对测试方法的命名(test+方法名)来确定是否是一个测试,且所有的测试类必须继承 TestCase。

    JUnit 4.x 版本全面引入了注解来执行我们编写的测试,JUnit 中有两个重要的类(Assume 和 Asset),以及其他一些重要的注解(BeforeClass、AfterClass、After、Before、Test 和 Ignore 等)。其中,BeforeClass 和 AfterClass 在每个类加载的开始和结束时运行,需要设置 static 方法;而 Before 和 After 则在每个测试方法开始之前和结束之后运行;Test 为一个测试用例;Ignore 表示跳过某个测试用例,可以对测试用例选择执行。

    package lucene.file.search.tester;
    
    import static org.junit.Assert.assertEquals;
    
    import org.junit.After;
    import org.junit.AfterClass;
    import org.junit.Before;
    import org.junit.BeforeClass;
    import org.junit.Test;
    
    public class JunitTest {
        
        @BeforeClass
        public static void beforeClassTest(){
            System.out.println("beforeClassTest start......");
        }
        
        @Before
        public void beforeTest(){
            System.out.println("beforeTest start......");
        }
        
        @Test
        public void test1(){
            int num1 = 5;
            int num2 = 6;
            System.out.println("test1");
            assertEquals("equals or not :",1,num2-num1);
        }
        
        @Test
        public void test2(){
            int num1 = 5;
            int num2 = 8;
            System.out.println("test2");
            assertEquals("equals or not :",2,num2-num1);
        }
        
        @After
        public void afterTest(){
            System.out.println("afterTest start......");
        }
        
        @AfterClass
        public static void afterClassTest(){
            System.out.println("afterClassTest start......");
        }
    }

    运行结果如下:

    控制台 Console 输出为:

    beforeClassTest start......
    beforeTest start......
    test1
    afterTest start......
    beforeTest start......
    test2
    afterTest start......
    afterClassTest start......

    JUnit 测试结果展示为:

    2.2 Assert

    上面代码中,我们使用了JUnit 的 Assert 类提供的 assert 方法,我们可以在测试类中静态地导入这些方法,主要包括:

    assertEquals("message",A,B),判断 A 对象和 B 对象是否相等,这个判断在比较两个对象时调用了 equals() 方法;

    assertSame("message",A,B),判断 A 对象与 B 对象是否相同,之前的 assert 方法是检查 A 与 B 是否有相同的值(使用了 equals 方法),而 assertSame 方法则是检查 A 与 B 是否为同一个对象(使用的是 == 操作符);

    assertTrue("message",A),判断 A 条件是否为真;

    assertFalse("message",A),判断 A 条件是否为假;

    assertNotNull("message",A),判断 A 条件是否不为 Null;

    assertArrayEquals("message",A),判断 A 数组与 B 数组是否相等。

    2.3 Suite

    JUnit 设计 Suite 的目的是一次性运行一个或多个测试用例,Suite 是一个容器,用来把几个测试类归在一起,并把它们作为一个集合来运行,测试运行器会启动 Suite,而运行哪个测试类由 Suite 决定。如下:

    package lucene.file.search.tester;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    
    @RunWith(Suite.class)
    @SuiteClasses({TestSuite1.class, TestSuite2.class})
    public class JunitTest {
        // 此类为空,但依然可以运行JUnit测试,运行时,它会将TestSuite1.class和TestSuite2.class中的所有测试用例都执行一遍
    }

    三、Spring Boot 单元测试

    Spring Boot 使用一系列注解来增强单元测试以支持 Spring Boot 测试。通常 Spring Boot 单元测试结构如下:

    @RunWith(SpringRunner.class)
    @SpringBootTest(classes=SpringbootApplication.class)
    public class UserRepositoryTest {
    
        @Autowired
        private UserService userService;
    
        @Test
        public void testService() {
            // 测试内容
        }
        
    }

    其中,@RunWith 是 JUnit 标准的一个注解,用来告诉 JUnit 单元测试框架不要使用内置的方式进行单元测试,而应使用 RunWith 指明的类来提供单元测试,所有的 Spring 单元测试总是使用 SpringRunner.class。

    @SpringBootTest 用于 Spring Boot 应用测试,它默认会根据包名逐级网上找,当测试类和主程序在同一个包下时,可以不用配置 classes,Spring 会一直找到 Spring Boot 主程序,也就是通过类注解是否包含@SpringBootApplication 来判断是否是主程序,并在单元测试的时候启动该类来创建 Spring 上下文环境。但当测试类和主程序不在同一个包下时,需要添加 classes,指定主程序启动类,如 classes=SpringbootApplication.class。

    具体测试用例可以参考本博客的文章:Spring Boot 入门之持久层篇(三)

    注意:Spring 单元测试并不会在每个单元测试方法前都启动一个全新的 Spring 上下文,因为这样太耗时。Spring 单元测试会缓存上下文环境,以提供给每个单元测试方法。如果某个单元测试方法改变了上下文,比如更改了 Bean 定义,你需要在此单元测试方法上加上 @DirtiesContext 以提示 Spring 重新加载 Spring 上下文。

  • 相关阅读:
    springboot文件上传: 单个文件上传 和 多个文件上传
    Eclipse:很不错的插件-devStyle,将你的eclipse变成idea风格
    springboot项目搭建:结构和入门程序
    POJ 3169 Layout 差分约束系统
    POJ 3723 Conscription 最小生成树
    POJ 3255 Roadblocks 次短路
    UVA 11367 Full Tank? 最短路
    UVA 10269 Adventure of Super Mario 最短路
    UVA 10603 Fill 最短路
    POJ 2431 Expedition 优先队列
  • 原文地址:https://www.cnblogs.com/cnjavahome/p/8417198.html
Copyright © 2011-2022 走看看