关于junit、hamcrest和eclemma的简单使用的博客介绍URL:

时间:2021-08-10 16:51:59

目录

一、         博客和GitHub的URL. 1

二、         Install Junit(4.12), Hamcrest(1.3) with Eclipse. 1

三、         Install Eclemma with Eclipse. 2

四、         Write a java program for the triangle problem and test the program with Junit. 2

五、         Junit简单使用... 2

六、         使用EclEmma进行简单地覆盖测试... 5

七、         Hamcrest简单使用... 7

八、         “判断三角形类型代”程序的测试代码说明... 9

九、         参考文章... 11

 

一、        博客和GitHub的URL

关于junit、hamcrest和eclemma的简单使用的介绍URL:

 

关于三角形判断的代码和测试代码的github的URL:

https://github.com/DiligentToHappy/learngit

二、        Install Junit(4.12), Hamcrest(1.3) with Eclipse

jar包就是别人已经写好的一些类,然后将这些类进行打包,你可以将这些jar包引入你的项目中,然后就可以直接使用这些jar包中的类和属性以及方法。

 

Eclipse中引入jar包参考这个链接:http://blog.csdn.net/mazhaojuan/article/details/21403717

 

介绍链接中的第二种方法:用户jar包式

通过“项目”->“属性”->“Java构建路径”->“添加库”->“用户库”->“新建”->填写用户库名称,点击“OK”->“添加外部jar包”(“也可以选择多个jar,但是限制在同一个文件夹中”,链接中的作者这句话不知道对不对?)。

这种方式的好处是,不用每次创建项目都要引入jar包。

 

三、        Install Eclemma with Eclipse

通过eclipse安装非常简单,“帮助”->“eclipse marketplace”,搜索 eclemma,一路默认安装就好了。

 

四、        Write a java program for the triangle problem and test the program with Junit

a) Description of triangle problem:

Function triangle takes three integers a,b,c which are length of triangle sides; calculates whether the triangle is equilateral, isosceles, or scalene.

判断三角形的思路:

1)  先判断3条边是否是正数

2)  接着是否满足“两条边之和大于第三边”

3)  最后判断是哪种类型的三角形。先判断是否是等边三角形,再判断是否是等边三角形,最后“不等边三角形”。

五、        Junit简单使用

  1. junit中常用注解:

@是Java注解,即annotation。注解可以理解为插件,是代码级别的插件,在类的方法上写:@XXX,就是在代码上插入了一个插件。注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。

 

@Test:测试方法必须用@Test注解,测试方法必须是public void,即公共、无返回数据,可以抛出异常。

@Test 的expected参数用于异常测试,即测试是否会抛出指定的异常,若抛出则成功,反之失败。下图测试用例是以0为除数,运行结果为“成功”!因为指定的“ArithmeticException”异常抛出了。

 

@Test 的timeout参数用于限时测试,即限定测试用例耗费的时间,单位毫秒,如果测试用例没有在限定时间内完成则失败。

 

 

@Ignore:如果暂时不需要运行某些测试方法或者测试类,就可以方法前加上这个注解,在运行结果中,junit会统计忽略的用例数,来提醒你。

 

@Before:会在每一个用例运行之前都运行一次。主要用于一些独立于用例之间的准备工作。必须是public void,不能为static。

 

@After:与@Before相对应

 

@Parameters:用于使用参数化功能,参数化测试,用于对同一测试用例测试多组数据。

 

@Runwith:首先分清几个概念。

1)   测试方法:就是用@Test注解的一些函数。

2)   测试类:包含一个或者多个测试方法的一个***Test.java文件。

3)   测试集:是一个suite,可能包含多个测试类。

4)   测试运行器:决定用什么方式偏好取运行这些测试方法、测试类,测试集。

而@RunWith 就是放在测试类名之前,用来确定这个类怎么运行。也可以不标注,会使用默认的运行器。

常见的运行器有:

a)   @RunWith(Parameterized.class)参数化运行器,配合@Parameters使用junit的参数化功能

 

b)   @RunWith(Suite.class)

@Suite.SuiteClasses({Atest.class,Btest.class})

测试套件运行器配合使用测试套件功能。当有多个测试类需要同时进行测试时,就是用测试套件来完成该工作。将要测试的类作微 @Suite.SuiteClasses的参数

 

 

  1. junit使用方法:

编写完成代码之后,选择“运行”按钮旁边的倒三角按钮,选择运行方式中的junit测试即可。

 

执行结果:

 

 

  1. 介绍静态类org.junit.Assert:

在程序中“import static org.junit.Assert.*”,静态导入Assert类,因此可以在程序中直接使用Assert类的任何静态方法。

 

assertEquals():用来查看对象中存的值是否是期待的值;

 

assertFalse()和assertTure(),查看变量是否为false或true,如果assertFalse()查看的变量值是FALSE,测试成功,否则失败;assertTrue与之相反。

 

assertSame()和assertNotSame(),用来比较两个对象的引用是否相等和不相等。

 

assertNull()和assertNotNull()用来查看对象是否为恐吓buweikong

 

fail(),意为失败,用来抛出错误。

六、        使用EclEmma进行简单地覆盖测试

覆盖测试是衡量“测试质量”的一个重要指标。

如果我们设计的测试用例仅覆盖了地阿妈的一小部分,那么不管我们写了多少测试用例,我们也不能相信软件质量是有保证的。EclEmma能够对Java语言编写的程序进行覆盖测试。从而对程序运行的结果生成详尽的覆盖测试报告。

 

安装完成后,eclipse的工具栏出现下图覆盖测试按钮,不要看错哦!

 

 

运行已经创建好的Java项目:选中项目,点击覆盖测试的按钮,按下图。

 

在Java编辑器中,EclEmma用不同的色彩表示了源代码的测试情况。其中。绿色代表该行代码被完整执行,红色代表代码没有被执行,黄色代表代码被部分执行。黄色的行通常出现在单行代码包含分支的情况,如下图

 

除了在源代码的编辑窗口直接进行着色之外,EcLEmma还提供了单独的视图来统计程序的覆盖测试率。

 

由于本次只运行了triangleKind,并没有运行triangleTest,所以该行测试率为0.

EcLemma还提供了统计多次覆盖结果的功能。

 

下图进行junit测试覆盖,从图中可以看出设计的 “测试用例”对代码的覆盖率50%左右,说明测试用例设计的不够合理。

 

七、        Hamcrest简单使用

如果要判断某几个值是否为true或者false,使用hamcrest判断会更方便。Hamcrest是专门为增强junit来提供的框架,它可以有效使用一些语义比较清晰的名字来做判断,常用方法:

逻辑:

    allOf:如果所有匹配器都匹配,测试才能成功,遵循c++中的“short circuiits”;

    anyOf:如果任何匹配器匹配就成功,遵循c++中的“short circuiits”;

    not:如果包装的匹配器不匹配时,测试成功。

 

对象:

equalTo:测试对象相等,使用object.equals方法。Object的equals()方法是比较两个对象的内存地址是否相等,即若object1.equals(object2)为true,则表示equals1和equals2实际上是引用同一个对象。

hasToString:测试object.tostring方法,Object类的toString方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@ ”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:getClass().getName() + '@' + Integer.toHexString(hashCode())。例如:com.struts2.User@de6ced

instanceOf,isCompatibleType:测试类型;

notNullValue,nullValue:测试对象实例;

sameInstance:测试对象实例;

hasProperty:测试JavaBeans属性。

  

集合:

    array:测试一个数组元素;

    hasEnrty,hasKey,hasValue:测试一个集合包含一个元素;

    hasItemInArray:测试一个数组包含一个元素。

 

数字:

    closeTo:测试浮点值接近给定的值;

    greaterThan,greaterThanOrEqualTo,lessThan,lessThanOrEqualTo:测试大小

   

文本:

    equalToIgnoringCase:测试字符串相等忽略大小;

    equalToIgnoringWhiteSpace:测试字符串相等,忽略空格;

    containsString,endWith,startsWith:测试字符串匹配。

 

使用:

    在你写的junit的测试用例比如testTriangle中先静态导入hamcrest包中的Matchers:

 

    然后在@Test注解后的测试方法中写asserThat方法就行:

 

 

错误:

    进行junit测试报错如下:

 

右键“项目名称”->“属性”,进行如下配置:

 

 

Eclipse库中自带了一个“junit4”,而我自己也设置了我的“用户库”,将自带的“移除”,将“用户库”里的hamcrest和junit的jar包调换顺序,使hamcrest优先于junit。

八、        “判断三角形类型代”程序的测试代码说明

使用了,@RunWith(Parameterized.class)参数化运行器,配合@Parameters使用junit的参数化功能。代码如下:

package tju.junit.triangle;

import static org.junit.Assert.*;

import java.util.Arrays;

import java.util.Collection;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.junit.runners.Parameterized;

import org.junit.runners.Parameterized.Parameters;

 

@RunWith(Parameterized.class)

public class TriangleTest {

    private int a;

    private int b;

    private int c;

    private String expected;

    private TriangleKind triangle;

   

    public TriangleTest(String expected,int a, int b,int c)

    {

        this.expected = expected;

        this.a = a;

        this.b = b;

        this.c = c;

    }

   

    @Before

    public void setUp() throws Exception {

        System.out.println("测试开始了!");

        triangle = new TriangleKind();

        System.out.println("triangle对象被初始化!");

    }

 

    @After

    public void tearDown() throws Exception {

        System.out.println("triangle对象将被清理!");

        triangle = null;

        System.out.println("测试结束!");

    }

   

    @Parameters

    public static Collection<Object[]> getData()

    {

        return Arrays.asList(new Object[][]

                {

                    {"等边三角形",2,2,2},

                    {"等边三角形",6,6,6},

                    {"等腰三角形",5,2,5},

                    {"等腰三角形",2,2,3},

                    {"等腰三角形",8,7,7},

        /*          {"不等边三角形",5,3,6},

                    {"非三角形",1,2,3},

                    {"非三角形",-2,-3,4},*/

                });

    }

   

 

    //测试给定的三条边构成的三角形是否与期待值一样

    @Test

    public void testGetTriangleKind() {

        assertEquals(this.expected, triangle.getTriangleKind(a, b, c));

    }

 

}

九、        参考文章

2、junit学习之hamcrest、testSuite介绍及测试原则

Eclipse下导入外部jar包的3种方式

Eclipse中怎么使用junit测试

测试辅助工具 hamcrest

使用 EclEmma 进行覆盖测试