JUnit单元测试的介绍以及基本操作

Junit介绍

    ■Juint由Erich Gamma和Kent Beck编写的一个测试框架

    ■开源软件

    ■支持语音有Smalltalk,Java,C++,Perl等

    ■支持的IDE:JBuilder,VisualAge,Eclipse等

    ■Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能

常用的测试基本概念

    ■白盒测试:程序内部的逻辑结构和其他信息对测试人员是公开的

    ■回归测试:软件或环境的修复或更正后的“再测试”,自动测试工具对这类测试尤其有用

    ■单元测试:是最小颗粒度的测试,以测试某个功能或代码块。一般由程序员来做,因为它需要知道内部设计和编码的细节

    ■JUnit:是一个开发源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于Java语言)。主要用于白盒测试,回归测试

单元测试工具

目前最流行的单元测试工具是xUnit系列框架,常用的根据语言不同分为

    ■Junit(java)

    ■Cppunit(C)

    ■DUnit(Delphi)

    ■Nunit(.net)

    ■PhpUnit(Php)

    ■Pyunit(Python)等

在Eclipse中配置好Junit

    1.在该项目上点右键,点“属性”

    2.选择“Java Build Path”,选择“Libraries”标签,点击“Add Library”按钮,弹出Add Libray窗体,选中“Junit”,单击“Next”

生成Junit的测试用例框架

    ■在Eclipse的Package Explorer中右击Calculate.java,选择new-->“Junit Test Case”

    ■setUpBeforeClass():调用这个测试类的时候,会先执行setUpBeforeClass的内容。只会被执行一次(因为测试类只会被调用一次,所以它只会执行一次),主要用于初始化

    ■tearDownAfterClass():测试类所有方法都被执行之后,它会执行该方法,只会被执行一次。初始化工作做一些执行后处理,例如关闭和数据库的连接

    ■setUp():每个测试用例执行的时候,都会执行setUp()

    ■tearDown():每次测试用例执行后,都会执行tearDown()

    ■Class under test:选择被测试类,可以直接输入类名/Browse

单元测试基本思想:通过断言来判断,期望值与实际值比对,一致的话,断言成功。如果不一致则失败。

    ■测试类是一个独立的类,没有任何父类。测试类的名字也可以任意命名,没有任何局限性。但是建议都用类名+Test来命名

    ■我们不能通过类的声明来判断它是不是一个测试类,它与普通类的去呗在于它内部的方法和声明

创建一个待测试类的对象

Private static Calculator calculator= new Calculator();

    ■需要测试哪个类,首先就要创建该类的对象

    ■为了测试Calculater类,我们必须创建一个calculator对象

测试方法的声明

    ■在测试类中,并不是每个方法都是用于测试的,必须使用“标注”来明确表明哪些是测试方法

        ◆@Before

        ◆@Test:表明这是一个测试方法

        ◆ @Ignore:跳过,不执行

    ■方法名可以随便取,没有任何限制,但是规范写法是test+方法名,方法名首字母大写

    ■方法的返回值必须为void

    ■方法不能有任何参数

    ■如果违反这些规范,运行时会抛出一个异常

测试方法的例子——@test

    @Test

        public void testAdd(){

            calculator.add(2);

            calculator.add(3);

            assertEquals(5,calculator.getResult());    //判断期待结果和实际结果是否相等

    }

    ■我们期待的结果应该是5

    ■第一个参数填写期待结果,第二个参数填写实际结果

    ■JUnit会自动进行测试并把测试结果反馈给用户

测试方法的例子——@Ignore

    @Ignore("Mulctiply() Not yet implented")

    public void testMultiply(){    

    }

    ■加上@Ignore标注的含义就是“某些方法尚未完成,暂不参与此次测试”

    ■这样的话测试结果就会提示你又几个测试被忽略,而不是失败

@Before和@After

    @Before

    public void setUp() throws Exception{

        calculator.clear();

    { 

    @After

    public void tearDown() throws Exception{

    }

    ■@Before,@After是每个方法测试时候必然被调用的代码

    ■保证每个测试都是独立的,相互之间没有任何耦合度

    ■这里不需要@Test标注,因为这不是一个test

测试开始-->setUp-->test*****-->tearDown-->测试结束


@BeforeClass或@AfterClass

    ■只在测试用例初始化执行@BeforeCalss方法,当所有测试执行完毕后,执行@AfterClass进行收尾工作

    ■用于测试读取文件等耗时的方法

    ■该方法必须是public和static的

    ■注意:@BeforeClass和@AfterClass只执行一次

    ■@Before,@After是每个测试用例执行的时候都会执行

限时测试

    @Test(timeout=2000)//设置超时时间为2000ms

    public void testDivide(){

        for( ; ;);//死循环

    }

    ■对于逻辑很复杂,循环嵌套比较深的程序采用限时测试

    ■函数设定一个执行时间,超过了这个时间,他们就会被系统强行终止,并且系统还会向你汇报该函数结束的原因是因为超时

测试异常

@Test(expected = ArithmeticException.class)

public void divideByZero(){

    calculator.divide(0);

}

    ■expected属性用来测试函数应该抛出的异常

Runner(运行器)

    ■JUnit中有一个默认的Runner,如果你没有指定,那么系统自动使用默认Runner来运行你的代码

    ■@RunWith是用来修饰类,可以指定需要的Runner

参数化测试

可以将所有参数集中起来一次测试。步骤如下:

    1.为这种测试专门生成一个新的类

    2.定义一个待测试的类,并且定义两个变量,一个用于存放参数,一个用于存放期待的结果

    3.定义测试数据的集合,用@Papameters标注进行修饰

    4.创建构造函数对先前定义的两个参数进行初始化


参数化测试

  ■数据驱动:用多组不同的数据执行相同的脚本——脚本是固定的,但是测试数据是变化的,一组数据或多组数据

   ■ 关键字驱动:操作元素,操作动作,输入的值,三个都可以自定义

可以将所有参数集中起来一次测试。步骤如下:

    1.为这种测试专门生成一个新的类

    2.定义一个待测试的类,并且定义两个变量,一个用于存放参数,一个用于存放期待的结果

    3.定义测试数据的集合,用@Papameters标注进行修饰

    4.创建构造函数对先前定义的两个参数进行初始化

测试集

步骤:

    1.用@RunWith标注传递一个参数Suite.class

    2.用@Suite.SuiteClasses表明这个类是一个打包测试类

    3.把需要打包的类作为参数传递给该标注

对于一些比较大,较长期且相对于需求越稳定的项目,非常适合底层的单元测试的方式来进行,整体的质量会提高,效率也很高

推荐书籍:单元测试的艺术

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 1 单元测试与Junit4测试框架: 单元测试:是指对软件中的最小可测试单元进行检查和验证。在java应用程序中常...
    Aubade阅读 1,018评论 0 0
  • 1. 单元测试入门——优秀基因 单元测试最初兴起于敏捷社区。1997年,设计模式四巨头之一Erich Gamma和...
    厲铆兄阅读 2,640评论 3 16
  • 多少年来,父亲的背影在我的心中日渐模糊,但每当回忆起来,内心总有一缕缕温暖如光的记忆。 印象中的父亲,总是那样年轻...
    红叶竹马阅读 393评论 0 14
  • 车终于开了, 我像第一次那样, 审视着窗外的一切。 连绵的山坡, 夹着一道道裂痕, 就像久违的拥抱。 回来了? 回...
    一曲长歌婉转阅读 225评论 0 3