单元测试工具——JUnit

单元测试工具——Junit

 

1.Junit简介

JUnit是一个Java语言的单元测试框架。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。

 

JUnit通过注解的方式来识别测试方法。目前支持的主要注解有:

@BeforeClass:  修饰的方法会在所有方法被调用前执行,且该方法时静态的,所以当测试类被加载后就接着运行它,而且在内存中他只会存在一份实例,他比较适合加载配置文件(针对所有测试,只执行一次 )

@AfterClass:  所修饰的方法通常用来对资源管理,如关闭数据库连接(针对所有测试,只执行一次 )

@Before和@After  会在每个测试方法前后各执行一次

@Test:测试方法,在这里可以测试期望异常和超时时间

@Ignore:忽略的测试方法  

 

2.Junit特性

①    用于测试期望结果的断言(Assertion)

②    用于共享共同测试数据的测试工具

③    用于方便的组织和运行测试的测试套件

④    图形和文本的测试运行器

 

3.安装

下载完以后解压到你喜欢的目录下,假设是JUNIT_HOME,然后将JUNIT_HOME下的junit.jar包加到你的系统的CLASSPATH环境变量中,对于IDE环境,对于需要用到的junit的项目增加到lib中,其设置不同的IDE有不同的设置,这里不多讲。

eclipse中自带JUnit,我们可以直接使用。

 

4.测试

(1)新建一个工程,新建一个要测试的类Calculator。

public class Calculator {
    private static int result; // 静态变量,用于存储运行结果
    public void add(int n) {
        result = result + n;
    }
    public void substract(int n) {
        result = result - 1;  //Bug: 正确的应该是 result =result-n
    }
    public void multiply(int n) {
    }         // 此方法尚未写好
    public void divide(int n) {
        result = result / n;
    }
    public void square(int n) {
        result = n * n;
    }
    public void squareRoot(int n) {
        for (; ;) ;            //Bug : 死循环
    }
    public void clear() {     // 将结果清零
        result = 0;
    }
    public int getResult(){
        return result;
    }
}

 

(2)工程右键,点击Properties

 

 

(3)点击下面的Classpath,之后点击Add Library,

 

 

(4)点击JUnit

 

 

(5)先选择版本,然后finish

 

 

(6)点击Apply and Close

 

 

 

 

(7)在Eclipse的Package Explorer中用右键点击要测试的类,弹出菜单,选择New →Unit Test Case。如下图所示:

 

 

 

(8)选择要测试的版本,填写测试类名

 

 

(9)选择测试方法

 

 

(10)然后就会发现多了一个类

 

 

 

(11)千万不要去删除@Test!!!!!然后把fail(“Not yet imolemented ”)删除,自己的代码敲进去就可以了。

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
public class CalculatorTest {   
    private static Calculator calculator = new Calculator();

    @Before
    public void setUp() throws Exception {
        calculator.clear();
    }

    @Test
    public void testAdd() {
        calculator.add(3);
        calculator.add(4);
        assertEquals(7, calculator.getResult());

    }

    @Test
    public void testSubstract() {
        calculator.add(8);
        calculator.substract(3);
        assertEquals(5, calculator.getResult());

    }

    @Ignore("Multiply() Not yet implemented")
    @Test
    public void testMultiply() {
        fail("Not yet implemented");
    }

    @Test
    public void testDivide() {
        calculator.add(8);
        calculator.divide(2);
        assertEquals(4, calculator.getResult());

    }
}

 

 

 

(12)右键测试类,点击run as → Junit Test

 

 

(12)运行结果

 

进度条是红色表示发现错误,具体的测试结果在进度条上面有表示“共进行了4个测试,其中1个测试被忽略,一个测试失败”。

 

限时测试
对于那些逻辑很复杂,循环嵌套比较深的程序,很有可能出现死循环,因此一定要采取一些预防措施。限时测试是一个很好的解决方案。我们给这些测试函数设定一个执行时间,超过了这个时间,他们就会被系统强行终止,并且系统还会向你汇报该函数结束的原因是因为超时,这样你就可以发现这些Bug了。要实现这一功能,只需要给@Test标注加一个参数即可,代码如下:

 

 

    @Test(timeout = 1000)
    public void squareRoot() {
        calculator.squareRoot(4);
        assertEquals(2, calculator.getResult());
    }

Timeout参数表明了你要设定的时间,单位为毫秒,因此1000就代表1秒。

 

 5.总结

  • 在软件测试这门课中自学了JUnit的使用方法,起初我使用的时候觉得这个软件太麻烦了!测试一段代码竟然还需要我再去敲一段代码……这样太麻烦了!!后来我就去搜集了一些资料,想要了解单元测试的必要性。
  • 那么单元测试为何又备受追捧呢?在How Google Tests Software中,三位谷歌的专家介绍了谷歌的软件测试之道,总而言之就是谷歌会在开发之初设计好单元测试(其实是用代码表达需求),在开发中不断迭代以通过全部的测试(其实是完成全部需求),最终交付给测试人员的软件已经经过一轮测试,如果还有集成后的Bug,就可以交给专业的测试人员发现了。这是一种典型的敏捷开发,可以看到单元测试扮演更多的是驱动开发的角色。
  • 有很多公司非常准确地把单元测试叫做“开发自测”,并且非常准确地认识到了这个活动的重要性:程序员只要认真测一测自己写的代码,bug就能减少90%。所以说,虽然很麻烦!但是单元测试还是很有必要的!!

6.参考及特别鸣谢

赵裕(腾讯 终端工程师):你真的需要单元测试吗?(https://zhuanlan.zhihu.com/p/35508972

 

posted @ 2019-06-04 22:12  丁壹  阅读(7256)  评论(1编辑  收藏  举报