zoukankan      html  css  js  c++  java
  • Junit 单元测试基本使用方法

    1、Junit是什么?

    JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。 JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。 
    JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。

    2、Junit有什么用?

    我们知道 Junit 是一个单元测试框架,那么使用 Junit 能让我们快速的完成单元测试。

    通常我们写完代码想要测试这段代码的正确性,那么必须新建一个类,然后创建一个 main() 方法,然后编写测试代码。如果需要测试的代码很多呢?那么要么就会建很多main() 方法来测试,要么将其全部写在一个 main() 方法里面。这也会大大的增加测试的复杂度,降低程序员的测试积极性。而 Junit 能很好的解决这个问题,简化单元测试,写一点测一点,在编写以后的代码中如果发现问题可以较快的追踪到问题的原因,减小回归错误的纠错难度。

    3、Junit相比平常的测试方法有什么优点?

    1、在实现自动单元测试的情况下可以大大的提高开发的效率。

    2、减小回归错误的纠错难度。

    3、减少回归错误造成的时间消耗。

    4、Junit的用法

    一、首先下载 Junit jar 包

    Junit 4.11

    二、下载完成之后,在项目中将 下载的 jar 包添加啊进去。

    三、下面编写测试类

    package com.nf147.bookstore_ssm.Test;
    
    public class Calculator {
        /**
         * 传入两个参数,求和
         * @param a
         * @param b
         * @return
         */
        public int add(int a, int b){
            return a + b;
        }
    
        /**
         * 传入两个参数,求差
         * @param a
         * @param b
         * @return
         */
        public int sub(int a, int b){
            return a - b;
        }
    }

    1、不用Junit:

    package com.nf147.bookstore_ssm.Test;
    public class CalculatorTest {
     
        public static void main(String[] args) {
            Calculator c = new Calculator();
            //测试 add()方法
            int result = c.add(1, 2);
            if(result == 3){
                System.out.println("add()方法正确");
            }
             
            //测试 sub()方法
            int result2 = c.sub(2, 1);
            if(result2 == 1){
                System.out.println("sub()方法正确");
            }
             
        }
    }

     2、使用Junit:

    package com.nf147.bookstore_ssm.Test;
    
    import org.testng.Assert;
    import org.testng.annotations.Test;
    
    public class Main {
    
        @Test
        //测试add方法
        public void TestAdd(){
            Calculator c = new Calculator();
            int result = c.add(1,2);
            Assert.assertEquals(result,3);
        }
    
        @Test
        //测试sub方法
        public void TestSub(){
            Calculator c = new Calculator();
            int result = c.sub(2,1);
            Assert.assertEquals(result,1);
        }
    }

     从上面两种方法中,我们可以看出,不使用Junit 要把代码写入Main里面,这里只有两个方法,如果有十几个方法,代码就会很乱,如果出错了也很难寻找错误所在地。

     接下来我们就运行测试类检查我们的代码

    如果运行成功,代码没有错误,我们会出现1、1、0、0,而且颜色是为绿色的

    如果运行失败,会出现1、0、1、0,颜色为红色,并且会告诉你错误的地方在哪,方便我们去修改代码

    那么由上面可以看到,使用 Junit 不需要创建 main() 方法,而且每个测试方法一一对应,逻辑特别清晰。可能有读者会问,这样写代码量也并不会减少啊,那么你接着往下看:

    介绍 Junit 的几种类似于 @Test 的注解:

      1.@Test: 测试方法

        a)(expected=XXException.class)如果程序的异常和XXException.class一样,则测试通过
        b)(timeout=100)如果程序的执行能在100毫秒之内完成,则测试通过

      2.@Ignore: 被忽略的测试方法:加上之后,暂时不运行此段代码

      3.@Before: 每一个测试方法之前运行

      4.@After: 每一个测试方法之后运行

      5.@BeforeClass: 方法必须必须要是静态方法(static 声明),所有测试开始之前运行,注意区分@before,是所有测试方法

      6.@AfterClass: 方法必须要是静态方法(static 声明),所有测试结束之后运行,注意区分 @After

    那么上面的例子,我们可以看到,每个 @Test 方法中都有 Calculator c = new Calculator();即类的实例化,那么我们可以将其放入到 @Before 中

    package com.nf147.bookstore_ssm.Test;
    
    import org.junit.*;
    import org.testng.Assert;
    
    public class Main {
        Calculator c = null;
    
        @Before
        public void testClass(){
            c = new Calculator();
        }
    
        @Test
        //测试add方法
        public void TestAdd(){
            int result = c.add(1,2);
            System.out.println("加法");
            Assert.assertEquals(result,3);
        }
    
        @Test
        //测试sub方法
        public void TestSub(){
            int result = c.sub(2,1);
            Assert.assertEquals(result,1);
        }
    }
    

    同理:别的注解用法我们用一个类来看:

    package com.nf147.bookstore_ssm.Test;
    
    import org.junit.*;
    
    public class JunitTest {
        public JunitTest() {
            System.out.println("构造函数");
        }
    
        @Before
        public void befor(){
            System.out.println("@Before");
        }
    
        @BeforeClass
        public static void beforeClass(){
            System.out.println("@BeforeClass");
        }
    
        @Test
        public void test(){
            System.out.println("@Test");
        }
    
        @Ignore
        public void ignore(){
            System.out.println("@Ignore");
        }
    
        @After
        public void after(){
            System.out.println("@After");
        }
    
        @AfterClass
        public static void afterClass(){
            System.out.println("@AfterClass");
        }
    }
    

    注意:编写测试类的原则: 

        ①测试方法上必须使用@Test进行修饰

            ②测试方法必须使用public void 进行修饰,不能带任何的参数

            ③新建一个源代码目录来存放我们的测试代码,即将测试代码和项目业务代码分开

            ④测试类所在的包名应该和被测试类所在的包名保持一致

            ⑤测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖

            ⑥测试类使用Test作为类名的后缀(不是必须)

            ⑦测试方法使用test作为方法名的前缀(不是必须)

  • 相关阅读:
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第4章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第3章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第1,2章 读书笔记(待更新)
    Tkinter的Message组件
    Git 实操/配置/实践
    mysq5.7.32-win安装步骤
    行为型模式之模板方法
    结构型模式之组合模式
    结构型模式之享元模式
    结构型模式之外观模式
  • 原文地址:https://www.cnblogs.com/Qi1007/p/9720724.html
Copyright © 2011-2022 走看看