zoukankan      html  css  js  c++  java
  • junit4的进一步探讨

    上次只是大概记录了下junit4几个常见标签的用法。

    在这篇文章中,我们来进一步分析junit4的用法。

    1.断言

    junit4中一个很常见的用法就是断言。说到断言,大家再熟悉不过了。不过也许有的朋友会有些疑问,为嘛有时候用assertEquals而有时候看到别人又用Assert.assertEquals()。其实两个的用法都是一样的,只是引入包的时候有点区别,只要你用心观察你会发现,用assertEquals时是“import static org.junit.Assert.*”,这是一个静态包含(static),是JDK5中新增的一个功能。也就是说assertEquals是assertEquals是Assert类中的一系列的静态方法,一般的使用方式是Assert. assertEquals(),但是使用了静态包含后,前面的类名就可以省略了,使用起来更加的方便。不过具体用哪个还是看个人习惯啦。

    2.限时测试

    有些程序的逻辑比较复杂,循环嵌套深,很有可能出现死循环。或者是测前端的时候有时候由于网速的原因,过了很长时间还是找不到某些页面元素。这时候我们可能希望程序会有某些处理机制。限时测试就是一个很好地解决方案。我们可以给我们的测试函数设定一个时间,超过了这个时间,就判定测试失败,并终止这个用例的执行。

    要实现这一功能,给@Test标签加一个参数就行。

    如:

    @Test(timeout=1000)

    public void test(){

    ....

    }

    以上表明如果程序在1000ms(注意这里的单位是ms),也就是1s内没有执行完,则test失败。

    3.异常测试

    有时候我们编写的函数需要抛出异常,那么我们在测试这个程序的时候肯定也就希望能捕获这个异常,如果没有捕获到,则说明测试失败。

    @Test(expected=MyException.class)

    public void test(){

    }

    4.Suite测试

    请参照文章“用junit testSuite管理测试用例” http://www.cnblogs.com/weiweiyao/p/4092877.html

    这个就不说了,之前写过。

    5.参数化测试

    你可能遇到过这样的函数,它的参数有许多特殊值,或者说他的参数分为很多个区域。举一个比较简单的例子吧,像如下函数:

    public class Try {

        public  int result=3;

         public  int add(int n) {

            result += n;

            return result;

        }

    }

    如果我想测试不同的输入值,则我需要写很多个@Test方法。如果测试的函数再复杂些,有各种边界值需要校验的话,那么你可能就需要写更多的@Test方法了。

    比如:

        @Test

        public void test1(){

        assertEquals(1,4);

        }

        @Test

        public void test2(){

        assertEquals(3,6);

        }

    但是如果用参数化测试的话,可以简化,我们只需要写一个测试函数,就可以把若干种情况作为参数传递进去,一次性的完成测试。

    测试代码如下:

     

    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;

     

    import junit.framework.TestCase;

     

    //步骤1.指定特殊的运行器Parameterized.class

    //顺便说明一下junit的运行原理:Junit运行时都是由一个runner运行的。指定一个Runner,需要使用@RunWith标注,并且把你所指定的Runner作为参数传递给它。那为什么我们平时没有用到@RunWith,也能运行呢:那是因为系统自动使用了默认的Runner来运行你的代码

    @RunWith(Parameterized.class)

    public class TryTest extends TestCase {

        

         //步骤2:为测试类声明几个变量,分别用于存放期望值和测试所用数据。此处我只放了测试所有数据,没放期望值。 

         private int param,result;

        

         //步骤3:申明构造函数

         public TryTest(int param, int result) {

             super();

             this.param = param;

             this.result = result;

         }

         //步骤4:定义测试数据的集合,该方法可以任意命名

         //但是必须使用@Parameters标注进行修饰

         //这个方法的框架就不予解释了,大家只需要注意其中的数据,是一个二维数组,数据两两一组

         //每组中的这两个数据,一个是参数,一个是你预期的结果。

         //比如我们的第一组{1, 4},1就是参数,4就是预期的结果。分别对应上面构造函数的param和result

         @Parameters

        public static  Collection testDate(){

             Object[][] object = {

                    { 1, 4},

                    { 3, 6 },

                    {1,3}};

        return Arrays.asList(object);

       

        }

        //步骤5:编写测试方法,使用定义的变量作为参数进行测试

         //这里的编写方法和以前的测试方法一样

        @Test

        public void testAdd(){

        Try test=new Try();

        assertEquals(result,test.add(param));

        }

    }

     

    测试结果:

    (1,4)测试通过,(3,6)测试通过,(1,3)测试不通过,期望结果是3(故意把预期结果写错),实际结果却是4。

     

     

    6.设置忽略某个测试用例

     

         对于你暂时不想运行的test case, 在该方法前添加@Ignore

     

    @Ignore("Not Ready to Run" )        
    @Test     
    public void test1() {        
            assertEquals(1, 4);        
    }

     

     

  • 相关阅读:
    520了,用32做个简单的小程序
    sql使用手册
    大厂Redis高并发场景设计,面试问的都在这!
    如何根据普通ip地址获取当前地理位置
    理解Python闭包,这应该是最好的例子
    520了,用32做个简单的小程序
    适合 C++ 新手学习的开源项目——在 GitHub 学编程
    寄存器(内存访问)01 零基础入门学习汇编语言13
    寄存器(CPU工作原理)07 零基础入门学习汇编语言12
    数组08 零基础入门学习C语言30
  • 原文地址:https://www.cnblogs.com/weiweiyao/p/4104211.html
Copyright © 2011-2022 走看看