zoukankan      html  css  js  c++  java
  • 如何开始用Junit进行单元测试

        近段时间,公司预备推动单元测试以提高转测代码的质量,借鉴学习一些测试大佬的经验自己试了一把,小测我在此写下初写单元测试的心得,希望能和大家交流交流单元测试技术!

    一、概述

    1、 单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。

    2、一般认为,在结构化程序时代,单元测试所说的单元是指函数,在当今的面向对象时代,单元测试所说的单元是指类。以我的实践来看,以类作为测试单位,复杂度高,可操作性较差,因此仍然主张以函数作为单元测试的测试单位

    3、有一种看法是,只测试类的接口(公有函数),不测试其他函数,从面向对象角度来看,确实有其道理,但是,测试的目的是找错并最终排错,因此,只要是包含错误的可能性较大的函数都要测试,跟函数是否私有没有关系

    二、单元测试设计思想

    1、单元测试可以借鉴类似功能测试的思想来进行设计

    2、一个待测试类当作一个功能块,待测试类当中的方法当作一个小的功能点,

         单元测试就理解为对这个待测试方法进行场景设计,编写代码,查看执行各场景结果和场景覆盖率

    3、单元测试场景设计可以采用因果分析的方法,将各个参数的组合当作各条件组合,将输入参数后执行方法的结果当作是各条件组合后的结果

    三、单元测试设计(采用因果分析法)

    1、确定待测试模块即建立测试类

    Game类及对应的Game测试类

    package test.testDemo;
    
    public class Game {
        
        public String winGame(int num1,int num2) {
            int num=num1-num2;
            String txt=null;
            if(num>0) {
                txt="夺奖成功!"; 
            }else if(num==0) {
                txt="安慰奖!";
            }else {
                txt="夺奖失败!";
            }
            return txt;
        } 
    
    }
    View Code
    package test.testDemo;
    
    import static org.junit.Assert.*;
    
    import org.junit.Test;
    
    public class GameTest {
    
        @Test
        public void testWinGame() {
            fail("Not yet implemented");
        }
    
    }
    View Code

    2、分析因果条件列出场景并进行用例设计

    3、单元测试用例编写

    3.1 参数化

    3.1.1 引入待测试类,定义参数

    3.1.2 引入注解@RunWith(Parameterized.class)参数化测试类

    3.1.3 编写需用到的参数的构造函数

    3.1.4 编写参数数据初始化方法

    package test.testDemo;
    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)参数化测试类
    @RunWith(Parameterized.class)
    public class GameTest {
        //引入待测试类,定义参数
        private Game game=new Game();
        
        private int num1;
        
        private int num2;
        
        private String expected;
    
        //编写需用到的参数的构造函数
        public GameTest(int num1, int num2,String expected) {
            super();
            this.num1 = num1;
            this.num2 = num2;
            this.expected=expected;
        }
        
        //编写参数数据初始化方法
        @Parameters
        public static Collection<Object[]> data(){
            return Arrays.asList(new Object[][] {{2,1,"夺奖成功!"},{2,2,"安慰奖!"},{1,2,"夺奖失败!"}});
        }
        
        @Test
        public void testWinGame() {
            
        }
    
    }
    View Code

    3.2 编写单元测试方法

    @Test
        public void testWinGame() {
            String txt=game.winGame(num1, num2);
            Assert.assertEquals(expected, txt);
        }
    View Code

    四、执行单元测试用例,检查覆盖率,覆盖率需eclipse中安装EclEmma插件

    1、选中测试类》右键选中Coverage As》Junit Test

    2、执行结果如下

  • 相关阅读:
    html中点击 checkbox (radio也可以) 隐藏tr 或 展现tr
    Innodb 索引结构了解 Innodb Index Structure
    linux 逐级显示文件命令tree
    MySQL 3.23 中文参考手册
    枚举进程for in
    Delphi中WebBrowser拦截网页Alert对话框消息(转)
    Remote Inject
    Delphi Union 使用
    Class TRTLCriticalSection
    让程序只运行一个实例
  • 原文地址:https://www.cnblogs.com/liwu/p/9901518.html
Copyright © 2011-2022 走看看