• junit浅学笔记


    JUnit是一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。

         虽然大多情况下他是程序员的活,但作为测试人员还是有必要了解一下,毕竟也是测试工作,提高自己人技术,扩展思想是主要,边学边做笔记,这样学过的东西才不会忘记,嘻嘻~!

     ========学习环境=================

    java编辑器: Eclipse SDK 3.5.6

    junit测试包:Eclipse中自带了junit 4 测试包

    =================================

    1.我们打开eclipse 创建一个工程名字为:Junit4,

    创建一个包,命名为:com.junit4.cc ,

    包下面创建一个类 T

    代码如下:

    复制代码
    package com.junit4.cc;
    publicclass T {
    publicint add(int x ,int y){
    return x+y;
    }

    }
    复制代码

    我们如何来做测试,当然了,上面的代码一眼就可以看出结果,需要测试么,我们这里只是想说明问题,如果我们不用测试框架,我们会用写一个main方法对上面的代码进行验证。全部代码如下。

    复制代码
    package com.junit4.cc;
    publicclass T {
    publicint add(int x ,int y){
    return x+y;
    }
    publicstaticvoid main(String args[]){
    int z=new T().add(3,5); //向T类传递两个参数3和5
    System.out.println(z); //打印z进行查看3和5是否做了加法运算
    }
    }
    复制代码

    云行上面的代码,通过查看结果来判断add方法是否正确。

    ---------------------------------------------------------------------------

    上面的单元测试有很多弊端:

    @ 需要花费很多的时间来写测试代码

    @ 测试代码不可重用,一段测试代码对应一段被测代码。被测代码变,测试代码就没用了

    @ 无法同时运行多个测试代码。假如有一百个被测试代码,要一个一个的运行测试代码,用肉眼观察结果,效率低还容易出错。

    这是我简单总结的几个缺点。

    ---------------------------------------------------------------------------

    2.   那么我们就要使用单元测试框架来提交效率。

    下面我们就使用eclipse来创建一个测试。还是测试上面的代码为例子。

    为了查看更加清晰,我们一般将测试代码与被测试的代码放在不同的包下面。

    我们在Junit工程下面重新创建一个包,命名为:com.junit4.cc.test

    ----------------------------

    创建一个测试类:TTest

    注意:这里要创建的是一个测试类:在com.junit4.cc.test包上面右键点击-->new-->Junit test Case

    点击“Next”会让你选择要测试的方法,选择后点击“Finish”则完成创建。

    创建完成如下图:

    TTest.java代码如下:

    复制代码
    package com.junit4.cc.test;

    importstatic org.junit.Assert.*;

    import org.junit.Test;
    import com.junit4.cc.*;

    publicclass TTest {

    @Test
    publicvoid testAdd() {
    int z=new T().add(5,3);
    assertEquals(8,z);
    }

    }
    复制代码

    3.   如果我们想要真正运行TTest.java这个测试类,还要对这个工程引入junit测试包。

    右键点击工程(junit4)--->Properties

    点击“next ” 按钮,celipse提供junit3和junit4两个测试包,我们选择junit4 点击“finish”就将测试包引入。

    4.  下面来运行我们TTest.java测试代码。

    看到我们左侧的绿色滚动条,说明我们的被代码是没有问题。

    你可以试着修改下面代码的参数:

    int z=new T().add(5,3);  
      assertEquals(8,z);    //将5、3、8等数字任意修改,查看绿色滚动条的颜色,给出的提示是什么?

      上一节初步介绍了什么是单元测试,为什么要做单元测试,以及junit4的初步使用,这里我们接着说一下junit4中的注解。

      =============本节知识点============================

    *     Error和Failures

    *    Junit4 Annotation

    ==================================================================

    1.   在讲注解之前,先来认识 Error和Failures这两种错误有什么不同。

    Errors:表示程序本身错误

    复制代码
    @Test
    publicvoid testAdd() {
    int z=new T().add(5,3);
    assertEquals(8,z);
    int a=8/0; //这一句是有错误的
    }
    复制代码

    运行方法,会有一下错误提示:

    Failures: 是指测试失败。

    @Test
    publicvoid testAdd() {
    int z=new T().add(5,4); //这里修改了数值,把4该为3就正确了
    assertEquals(8,z);
    }

    在来运行这个方法,看一下错误提示:

    所以,我们在写测试程序的时候,要先保证Errors是没有错误的,再来看Failures有没有错误。

    2.  下面介绍junit4 的常用注解

    -----------------------------------------------------------------------------------------------

    *             @ Test:测试方法

                      A)  (expected=XXEception.class)

                    B)  (timeout=xxx)

    *.           @ Ignore: 被忽略的测试方法

    *.           @Before: 每一个测试方法之前云行。

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

    *.           @BefreClass 所有测试开始之前运行。

    *.           @AfterClass 所有测试结果之后运行。

    ------------------------------------------------------------------------------------------------

    下面通过一个测试程序来解释这些注解含义

    复制代码
    package com.junit4.cc.test;

    importstatic org.junit.Assert.*;
    importstatic org.hamcrest.Matcher.*;

    import org.junit.Test;
    import com.junit4.cc.*;

    import org.junit.Before;
    import org.junit.BeforeClass;
    import org.junit.AfterClass;
    import org.junit.After;
    import org.junit.Ignore;


    publicclass TTest {

    @BeforeClass //的所有方法运行之前运行。
    publicstaticvoid beforeClass(){
    System.out.println("------------beforeClass");
    }

    @AfterClass //在所有方法运行之后运行
    publicstaticvoid afterClass(){
    System.out.println("-------------afterClass");
    }

    @Before //每个测试方法运行之前运行
    publicvoid before(){
    System.out.println("=======before");
    }

    @After //每个测试方法运行之后运行
    publicvoid after(){
    System.out.println("=======after");
    }

    @Test
    publicvoid testAdd() {
    int z=new T().add(5,3);
    assertEquals(8,z);
    System.out.println("test Run through");
    }

    @Test ()
    publicvoid testdivision(){
    System.out.println("in Test Division");

    }

    @Ignore //表示这个方法是不被运行的
    @Test
    (expected=java.lang.ArithmeticException.class,timeout=100) //timeout表示要求方法在100毫秒内运行完成,否则报错
    publicvoid testDivide(){
    int z =new T().divide(8,2);
    }



    }
    复制代码

    运行结果如下:

    标记红星(*)方法在每个方法开始和结尾都运行一次。

    标记绿星(*)的方法只在所有方法的开始和结尾运行一次。

    junit有多种注解,我们常用的也就上面几种。

    这一节我们将学习进行批量处理,假如我们有多的测试,怎样进行批量处理,请跟着我做。

    ---------------------------------------------

    假如我们写了两个被测程序。如下:

    T.java

    复制代码
    package com.junit4.cc;

    publicclass T {
    publicint add(int x ,int y){
    return x+y;
    }
    publicstaticvoid main(String args[]){
    int z=new T().add(3,5);
    System.out.println(z);
    }
    }
    复制代码

    User.java

    复制代码
    package com.junit4.cc;

    publicclass User {
    public String geName(){
    return"刘若英"; //PS:她是我的偶像嘻嘻:)
    }
    }
    复制代码

    ------------------------------------测试类-------------------------

    下面要对上面的两个类写测试类。(关于测试类的创建的方法,不懂的可以看我的第一篇《junit浅学笔记一》)

    TTest.java   对应的是T.java的测试类。

    复制代码
    package com.junit4.cc.test;

    importstatic org.junit.Assert.*;

    import org.junit.Test;
    import com.junit4.cc.*;

    publicclass TTest {
    @Test
    publicvoid testAdd() {
    int z=new T().add(5,3);
    assertEquals(8,z);
    }
    }
    复制代码

    UserTest.java  对应的是User.java

    复制代码
    package com.junit4.cc.test;

    importstatic org.junit.Assert.*;

    import org.junit.Test;
    import com.junit4.cc.User;

    publicclass UserTest {

    @Test
    publicvoid testGeName() {
    assertEquals(new User().geName(),("刘若英"));
    }
    }
    复制代码

    完成之后的列表如下:

    要批量运行上面两个测试类,有两个方法。

    方法一

    右键点击测试包“com.junit4.cc.test”--->Run As--->Run Configurations.

    这种方式设置简单,但灵活度不高,假如有100个测试类。我只想运行其中的某几个测试类。下面看第二中方式。

    方法二

    方法引入一种“测试套件”的概念,JUnit提供了一种批量运行测试类的方法,叫测试套件。

      测试套件的写法需要遵循以下原则:

      1. 创建一个空类作为测试套件的入口;

      2. 使用注解 org.junit.runner.RunWith 和 org.junit.runners.Suite.SuitClasses 修饰这个空类

      3. 将org.junit.runners.Suite作为参数传入给注解RunWith,以提示Junit为此类测试使用套件运行器执行。

      4. 将需要放入此测试套件的测试类组成数组作为注解SuiteClasses的参数

      5. 保证这个空类使用public修饰,而且存在公开的不带任何参数的构造函数

    下面在测试包(com.junit4.cc.test)下面创建一个测试类,内容如下:

    AllTest.java

    复制代码
    package com.junit4.cc.test;


    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    @RunWith(Suite.class)
    @SuiteClasses({
    TTest.class,
    UserTest.class //这里自由加入需要运行的测试类
    })
    publicclass AllTest {

    }
    复制代码

    创建之后的列表:

    运行AllTest.java的结果(这里,两个方法的运行结果是一样的):

    ps:关于两种方式的比较,第一种方法简单,只用选择测试包,就可以批量运行里面的所有测试程序。第二种方式还有重新创建一个测试类,但它非常灵活,只用在这个类中加入需要运行的类就可以灵活的运行需要测试的类。

  • 相关阅读:
    源码分析清楚 AbstractQueuedSynchronizer
    Java 并发队列 BlockingQueue
    ReentrantLock以及AQS实现原理
    Java并发之Condition
    Java线程的6种状态及切换
    同步工具类
    Java 并发实践 — ConcurrentHashMap 与 CAS
    Java7/8 中的 HashMap 和 ConcurrentHashMap
    java HashMap、HashTable、ConcurrentHashMap区别
    Mysql的复制原理以及流程
  • 原文地址:https://www.cnblogs.com/felix-/p/4331960.html
Copyright © 2020-2023  润新知