• 菜鸟学Java(二十一)——怎样更好的进行单元測试——JUnit


    測试在软件生命周期中的重要性,不用我多说想必大家也都很清楚。软件測试有许多分类,从測试的方法上可分为:黑盒測试、白盒測试、静态測试、动态測试等;从软件开发的过程分为:单元測试、集成測试、确认測试、验收、回归等。


    在众多的分类中,与开发者关系最紧密的莫过于单元測试了。像其它种类的測试基本上都是由专门的測试人员来完毕,仅仅有单元測试是全然由开发者来完毕的。那么今天我们就来说说什么是单元測试,为什么要进行单元測试,以及如更好的何进行单元測试。


    什么是单元測试?

    单元測试(unit testing),是指对软件中的最小可測试单元进行检查和验证。比方我们能够測试一个类,或者一个类中的一个方法。


    为什么要进行单元測试?

    为什么要进行单元測试?说白了就是单元測试有什么优点,事实上測试的优点无非就是降低bug、提高代码质量、使代码易于维护等。单元測试有什么优点请看一下百度百科中归纳的四条:


    1、它是一种验证行为。
    程序中的每一项功能都是測试来验证它的正确性。它为以后的开发提供支援。就算是开发后期,我们也能够轻松的添加功能或更改程序结构,而不用操心这个过程中会破坏重要的东西。而且它为代码的重构提供了保障。这样,我们就能够更自由的对程序进行改进。


    2、它是一种设计行为。
    编写单元測试将使我们从调用者观察、思考。特别是先写測试(test-first),迫使我们把程序设计成易于调用和可測试的,即迫使我们解除软件中的耦合。


    3、它是一种编写文档的行为。
    单元測试是一种无价的文档,它是展示函数或类怎样使用的最佳文档。这份文档是可编译、可执行的,而且它保持最新,永远与代码同步。


    4、它具有回归性。
    自己主动化的单元測试避免了代码出现回归,编写完毕之后,能够随时随地的高速执行測试。


    怎样更好的进行单元測试?


    在讨论怎样更好的进行单元測试之前,先来看看我们曾经是怎么測试代码的。

    曾经是这样測试程序的:

    	public int add(int x,int y) {
    		return x + y;
    	}
    		
    	public static void main(String args[]) {
    		int z = new Junit().add(2, 3);
    		System.out.println(z);
    	}

    如上面所看到的,在測试我们写好的一个方法时,一般是用一个main方法调用一下我们要測试的方法,然后将结果打印一下。如今看来这样的方式已经很out了,所以出现了许多单元測试的工具,如:JUnit、TestNG等。借助它们能够让我们的单元測试变得很方便、高效。今天就说说怎样利用JUnit进行单元測试。


    我们新建一个Java Project以便进行演示,至于Java Project怎么创建我就不在此赘述了,假设连怎么建Java Project,那你还不适合看这篇文章。建好以后在该项目的“src”文件夹上右击,选择new——》JUnit Test Case,然后按下图填写必要信息:



    填写好包名和类名(选择New JUnit 4 Test),点击最以下的那个“Browse”button来选择须要測试的类:



    手动输入我们要測试的类,选择该类,点击“OK”,回到第一张图的界面,然后点击“Next”,来到下图:



    勾选要測试的方法,点击“Finish”,这样我们的JUnit測试实例就建好了。然后就能够写详细的測试了:

    package com.tgb.junit.test;
    
    //静态引入
    import static org.junit.Assert.*;
    import static org.hamcrest.Matchers.*;
    
    import org.junit.Test;
    
    import com.tgb.junit.Junit;
    
    public class JUnitTest {
    
    	@Test
    	public void testAdd() {
    		int z = new  Junit().add(2, 3);
    		assertThat(z , is(5));
    	}
    
    	@Test
    	public void testDivide() {
    		int z = new Junit().divide(4, 2);		
    		assertThat(z, is(2));
    	}
    }
    

    写好以后,右击该类选择“Run As”——》“JUnit Test”,出现下图代表測试通过:



    到这里,可能有人会有疑问,JUnit跟用main方法測试有什么差别呢?

    首先,JUnit的结果更加直观,直接依据状态条的颜色就可以推断測试是否通过,而用main方法你须要去检查他的输出结果,然后跟自己的期望结果进行对照,才干知道是否測试通过。有一句话能够很直观的说明这一点——keeps the bar green to keeps the code clean。意思就是说,仅仅要状态条是绿色的,那么你的代码就是正确的。

    第二点,JUnit让我们同一时候执行多个測试变得很方便,以下就演示一下怎样进行多实例測试:

    首先我们要再建一个待測试类,然后再建一个相应的JUnit測试实例,步骤略。然后在我们測试实例的包上右击选择“Run As”——》“Run Configurations”,例如以下图;



    选择第二项“Run all tests in the selected project, package or source folder”,然后点击“Run”效果例如以下:



    能够看到,我们本次測试了两个类,共三个方法,这样的方便的效果在測试实例越多的情况下,体现的越明显。至于main方法执行多个測试,想想就认为很麻烦,这里就不演示了。


    JUnit除了能够測试这些简单的小程序,还能够測试Struts、JDBC等等,这里仅仅是用这个小程序做过简单的介绍。本实例使用的是hamcrest断言,而没有使用老的断言,由于hamcrest断言更加接近自然语言的表达方式,更易于理解。


    本实例须要引入以下三个jar包:

    hamcrest-core-1.3.jar
    hamcrest-library-1.3.jar
    junit-4.10.jar


    最后附上经常使用hamcrest断言的使用说明:

    数值类型
    //n大于1而且小于15,则測试通过
    assertThat( n, allOf( greaterThan(1), lessThan(15) ) );
    //n大于16或小于8,则測试通过
    assertThat( n, anyOf( greaterThan(16), lessThan(8) ) );
    //n为不论什么值,都測试通过
    assertThat( n, anything() );
    //d与3.0的差在±0.3之间,则測试通过
    assertThat( d, closeTo( 3.0, 0.3 ) );
    //d大于等于5.0,则測试通过
    assertThat( d, greaterThanOrEqualTo (5.0) );
    //d小于等于16.0,则測试通过
    assertThat( d, lessThanOrEqualTo (16.0) );
    
    字符类型
    //str的值为“tgb”,则測试通过
    assertThat( str, is( "tgb" ) );
    //str的值不是“tgb”,则測试通过
    assertThat( str, not( "tgb" ) );
    //str的值包括“tgb”,则測试通过
    assertThat( str, containsString( "tgb" ) );
    //str以“tgb”结尾,则測试通过
    assertThat( str, endsWith("tgb" ) ); 
    //str以“tgb”开头,则測试通过
    assertThat( str, startsWith( "tgb" ) ); 
    //str忽略大写和小写后,值为“tgb”,则測试通过
    assertThat( str, equalToIgnoringCase( "tgb" ) ); 
    //str忽略空格后,值为“tgb”,则測试通过
    assertThat( str, equalToIgnoringWhiteSpace( "tgb" ) );
    //n与nExpected相等,则測试通过(对象之间)
    assertThat( n, equalTo( nExpected ) ); 
    
    collection类型
    //map中包括key和value为“tgb”的键值对,则測试通过
    assertThat( map, hasEntry( "tgb", "tgb" ) );
    //list中包括“tgb”元素,则測试通过
    assertThat( iterable, hasItem ( "tgb" ) );
    //map中包括key为“tgb”的元素,则測试通过
    assertThat( map, hasKey ( "tgb" ) );
    //map中包括value为“tgb”的元素,则測试通过
    assertThat( map, hasValue ( "tgb" ) );





  • 相关阅读:
    .NetCore Grpc 客服端 工厂模式配置授权
    DOCKER 拉取 dotnet 镜像太慢 docker pull mcr.microsoft.com too slow
    Introducing .NET 5
    VSCode 出现错误 System.IO.IOException: The configured user limit (128) on the number of inotify instances has been reached.
    Omnisharp VsCode Attaching to remote processes
    zookeeper3.5.5 centos7 完全分布式 搭建随记
    Hadoop2.7.7 centos7 完全分布式 配置与问题随记
    MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序
    SQL基础随记3 范式 键
    MySQL调优 优化需要考虑哪些方面
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4276037.html
Copyright © 2020-2023  润新知