• Junit4


    一、Junit4特性

    JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写。
    先简单解释一下什么是Annotation,这个单词一般是翻译成元数据。元数据是什么?元数据就是描述数据的数据。
    也就是说,这个东西在Java里面可 以用来和public、static等关键字一样来修饰类名、方法名、变量名。修饰的作用描述这个数据是做什么用的,差不多和public描述这个数据是公有的一样。

    我们先看一下在JUnit3中我们是怎样写一个单元测试的。比如下面一个类:
    public class AddOperation {
    public int add(int x,int y){
    return x+y;
    }
    }

    我们要测试add这个方法,我们写单元测试得这么写:
    import junit.framework.TestCase;
    import static org.junit.Assert.*;
    public class AddOperationTest extends TestCase{

    public void setUp() throws Exception {
    }

    public void tearDown() throws Exception {
    }

    public void testAdd() {
    System.out.println("add");
    int x = 0;
    int y = 0;
    AddOperationinstance = new AddOperation();
    int expResult = 0;
    int result =instance.add(x, y);
    assertEquals(expResult,result);
    }
    }

    可以看到上面的类使用了JDK5中的静态导入,这个相对来说就很简单,只要在import关键字后面加上static关键字,就可以把后面的类的static的变量和方法导入到这个类中,调用的时候和调用自己的方法没有任何区别。

    我们可以看到上面那个单元测试有一些比较霸道的地方,表现在:
    1.单元测试类必须继承自TestCase。
    2.要测试的方法必须以test开头。

    如果上面那个单元测试在JUnit4中写就不会这么复杂。代码如下:
    import junit.framework.TestCase;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import static org.junit.Assert.*;

    /**
    *
    * @author bean
    */
    public class AddOperationTest extends TestCase{

    public AddOperationTest() {
    }

    @Before
    public void setUp() throws Exception {
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void add() {
    System.out.println("add");
    int x = 0;
    int y = 0;
    AddOperationinstance = new AddOperation();
    int expResult = 0;
    int result =instance.add(x, y);
    assertEquals(expResult,result);
    }

    }
    我们可以看到,采用Annotation的JUnit已经不会霸道的要求你必须继承自TestCase了,而且测试方法也不必以test开头了,只要以@Test元数据来描述即可。

    测试方法需满足:
    1、以@Test元数据来描述;
    2、测试方法必须使用 public void 修饰,而且不能带有任何参数。

    从上面的例子可以看到在JUnit4中还引入了一些其他的元数据,下面一一介绍:
    @Before:
    使用了该元数据的方法在每个测试方法执行之前都要执行一次。

    @After:
    使用了该元数据的方法在每个测试方法执行之后要执行一次。

    注意:@Before和@After标示的方法只能各有一个。这个相当于取代了JUnit以前版本中的setUp和tearDown方法,当然你还可以继续叫这个名字,不过JUnit不会霸道的要求你这么做了。

    图 5 方法级别 Fixture 执行示意图


    @BeforeClass:
    在测试类中所有测试方法执行之前执行初始化;该方法必须加static前缀

    @AfterClass:
    在测试类中所有测试方法测试完毕之后执行该注销方法;该方法必须加static前缀

    图 6 类级别 Fixture 执行示意图


    @Test(expected=*.class)
    在JUnit4.0之前,对错误的测试,我们只能通过fail来产生一个错误,并在try块里面assertTrue(true)来测试。现在,通过@Test元数据中的expected属性。expected属性的值是一个异常的类型。

    @Test(timeout=xxx):
    该元数据传入了一个时间(毫秒)给测试方法,
    如果测试方法在制定的时间之内没有运行完,则测试也失败。

    @ignore:
    该元数据标记的测试方法在测试中会被忽略。
    当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库联接, 而在本地测试的时候,数据库并没有连接),那么使用该标签来标示这个方法。
    同时,你可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。

    二、Junit4实践

    ① 最佳实践:单元测试代码和被测试代码使用一样的包,不同的目录。

    请牢记这一条 JUnit 最佳实践:测试任何可能的错误。单元测试不是用来证明您是对的,而是为了证明您没有错。

    assertEquals 是由 JUnit 提供的一系列判断测试结果是否正确的静态断言方法(位于类 org.junit.Assert 中)之一,我们使用它将执行结果和预期值进行比较,来判断测试是否成功。

    JUnit 将测试失败的情况分为两种:failure 和 error。
    Failure 一般由单元测试使用的断言方法判断失败引起,它表示在测试点发现了问题;而 error 则是由代码异常引起,这是测试目的之外的发现,它可能产生于测试代码本身的错误(测试代码也是代码,同样无法保证完全没有缺陷),也可能是被测试代码中的一个隐藏的bug。



    测试运行器,测试套件,参数化测试等更多功能使用,参照
    http://www.ibm.com/developerworks/cn/java/j-lo-junit4/
    讲解的特别详尽。



  • 相关阅读:
    机器学习:贝叶斯分类器(一)——朴素贝叶斯分类器
    机器学习:kNN算法(二)—— 实战:改进约会网站的配对效果
    机器学习:kNN算法(一)—— 原理与代码实现(不调用库)
    Oracle给表设置自增字段
    IMAP、POP3、SMTP邮件服务器
    网站高并发大流量访问的10个处理及解决方案
    浅谈async/await
    【前端】加载的图片太多或者太大优化方案(上)
    【前端】本地调试H5页面方案总结
    alphafold2_conda版安装
  • 原文地址:https://www.cnblogs.com/biang/p/6294217.html
Copyright © 2020-2023  润新知