如何使用eclipse进行junit测试

一.导言

JUnit是Erich Gamma(设计模式的作者)和Kent Beck(极限编程的支持者)编写的开源回归测试框架,供Java编码人员做单元测试。当前版本是4.1,可从www.junit.org网站获得。与早期的JUnit 3相比,JUnit 4.1依赖于Java 5.0的新特性,因此不兼容jdk 1.4,可以说是一个全新的框架。

因为这里用的IDE是Eclipse 3.2.1 plus语言包,集成了junit 4.1,所以省去了下载配置类库的麻烦。

其次,创建一个项目

打开Eclipse,点击菜单“文件”->;"新建"->;项目或新建按钮打开新建对话框:

请选择“Java项目”并点击“下一步”进入“新建Java项目”对话框:

在此对话框中,您需要设置项目的名称以及项目所在的目录。我将我的项目命名为JUnitTest,目录是F:\ ypjcck \ JUnit \ Eclipse \ JUnit Test。由于Eclipse自带JUnit类库,此时只需点击Finish即可。

第三,写JavaBean进行测试。

测试用的JavaBean很简单,名为Book,只有id和name两个属性,将分别用在两个用例中。让我们开始编写JavaBean。

请点击“文件”-->;"新建"->;类,打开“新建Java类”对话框,将包设置为net.test.unit.junit,将名称设置为Book,并确保没有选择“public static void main(string[]args)”选项,然后单击Finish。按如下方式修改代码:

包net . test . unit . JUnit;

公共类图书{

私有字符串id = null

私有字符串名称= null

公共字符串getId() {

返回id;

}

公共void setId(字符串id) {

this.id = id

}

公共字符串getName() {

返回名称;

}

publicvoid集合名称(字符串名称){

this.name = name

}

}

至此,用于测试的JavaBean就完成了。

第四,编写测试用例

这里只使用一个类进行测试,这个类叫做BookTest。以前像这样的类需要继承junit.framework.TestCase,但是JUnit 4.1充分利用了Java 5.0新增的注释功能,所以没必要这么做。当然,JUnit 4.1还是提供了对老办法的支持,但这里不打算介绍了。

BookTest类包含两个用例,分别对应于该类的caseId和caseName方法,即每个方法实现一个用例。与JUnit 3.8.1不同的是,在JUnit 4.1中,不再要求方法名以test开头,而是允许随意命名,只要符合Java的命名规范即可。这里为了说明这一点,特意用案例作为开头,但是测试案例必须用@Test标注。另外,BookTest有两个方法:setUp和tearDown,分别用@Before和@After标注。前者在每个测试方法之前执行,主要用于初始化。后者在每个测试方法完成后执行,主要用于清理资源。注意,这两种方法的命名也是无限制的,没有定义个数的限制,但是必须用@Before和@After来标注。此外,JUnit 4.1还提供了注解@BeforeClass和@AfterClass,这两个注解在功能上类似于@Before和@After,但前者是用来在所有用例执行前初始化然后清理,后者是用来在每个用例执行前初始化然后清理。让我们开始写BookTest。

在Eclipse中,创建BookTest类有两种方法:第一,像前面创建Book类一样,单击“File”->;"新建"->;“类”来创建;方法二:首先在包浏览器中选择Book类,然后点击File->;"新建"->;" JUnit测试用例",打开" New JUint Test Case "窗口:

此时,你会发现很多信息已经被Eclipse自动添加了。如果您想要使用Eclipse来自动创建测试方法,那么点击Next。由于本文将自行编写测试方法,请直接点击“完成”。

创建BookTest类后,按如下方式修改代码:

包net . test . unit . JUnit;

导入静态org . JUnit . assert . *;

导入org . JUnit . after;

导入org . JUnit . before;

导入org . JUnit . test;

公共课书籍测试{

Book book = null

@以前

公共void设置()引发异常{

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

book =新书();

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

}

@之后

public void tearDown()引发异常{

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

book = null

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

}

@测试

公共void caseId() {

book . setid(" 001 ");//将id属性的值设置为001。

//使用Assert检查id属性的值是否为001。

assertEquals("001 ",book . getid());

System.out.println("id属性已测试!");

}

@测试

公共void caseName() {

book . setname(" ASP ");//将name属性的值设置为ASP。

//使用Assert检查name属性的值是否为JSP,这是一个必然出错的测试。

assertEquals("JSP ",book . getname());

System.out.println("name属性已测试!");

}

}

这里的setUp和tearDown方法就不说了,只是进行了book对象的初始化和清理,但是caseId和caseName需要说明一下。前者是测试书的id属性,先赋值为“001”,然后用assertEquals方法检查id属性中存储的值是否是期望值。由于我的期望值也是“001”,这个用例执行后应该是成功的。后者是测试书的name属性,也是先赋值为“ASP”,然后用assertEquals方法看它的值是否是预期值。因为我故意把期望值设置为“JSP”,所以这个用例执行后会出现错误。

assertEquals方法是Assert类的静态方法。在程序的开头,有一行代码,“import static org . JUnit . assert . *;”,利用Java 5.0提供的静态导入来静态导入Assert类,这样我们就可以在程序中直接使用Assert类的任何静态方法。让我们简单介绍一下静态类org.junit.Assert

该类主要包括8大类22种方法,如下:

1.AssertEquals(),8重载,用于检查对象中存储的值是否为预期值,类似于字符串比较中使用的Equals()方法;

2.Assertifalse()和Assertitrue()各有两个重载,用于检查变量是假还是真。如果Assertifalse()检查的变量的值为false,则测试成功,为true则测试失败,Assertitrue()则相反;

3.AssertSame()和assertNotSame(),各两个重载,用于比较两个对象的引用是否相等,类似于使用“= =”和”!= "比较两个对象;

4.Assert null()和assertNotNull()各有两个重载,用于检查对象是否为空;

5.fail(),两个重载,意思是失败,用来抛出一个错误。个人认为有两个目的:一是在测试驱动开发中,因为测试用例是在被测试类之前写的,写的时候不清楚是否正确,所以可以用fail方法抛出错误进行模拟;第二种是抛出意外错误。比如要测试的内容是从数据库中读取的数据是否正确,但是错误的原因是数据库连接失败。

5.运行BookTest。

写完BookTest,就可以运行了。请单击运行按钮旁边的倒三角形,然后选择“运行方式”-& gt;“1 JUnit测试”,此时运行效果如下:

可以看到图片左侧的“JUnit”一栏,里面有错误。但是,此错误是意料之中的。如果不想看,可以将testName()方法中的“JSP”改为“ASP”,此时运行效果如下:

此时,您会看到“JUnit”列中的进度条不是红色的,而是绿色的,这表明没有错误。

不及物动词测试套

当需要同时测试多个测试类时,应该使用测试套件来完成工作。但是Eclipse 3.2.1提供的测试套件创建功能并不能很好的支持JUnit 4.1,所以我们必须手动创建。

点击“文件”-->;"新建"->;类创建一个名为AllTests的类,如下所示:

单击“完成”将代码修改如下:

包net . test . unit . JUnit;

导入org . JUnit . runner . run with;

导入org . JUnit . runners . suite;

@RunWith(Suite.class)

@Suite。SuiteClasses(BookTest.class)

公共类所有测试{}

这里,AllTests是一个空类,用@RunWith和@ suite进行了注释。将待测试的类BookTest作为@ Suite.Suiteclaces的annotation的参数,然后将测试套件suite作为参数设置到runner @RunWith。您可以选择下面的文件,然后单击“运行方式”-& gt;“1 JUnit测试”。

请注意,@ suite.suiteclaces注释支持数组,例如:

@Suite。SuiteClasses ({BookTest.class,BookTest2.class })

这允许您一次运行多个测试类。

七、命令行下

上面描述的操作模式都是基于Eclipse的。事实上,JUnit本身也提供了在命令行执行以下命令的方法:

java -cp junit-4.1.jar所在的文件夹;org.junit.runner.JUnitCore

net . test . unit . JUnit . all测试

如果你想运行多个测试类,如下:

java -cp junit-4.1.jar所在的文件夹;org.junit.runner.JUnitCore

所有测试

八、JUnit使用高级

@Ignore comment,ignore test,用来忽略暂时不想运行的测试用例。以BookTest为例,添加一个引用“import org . JUnit . ignore;在文件的开头。,然后修改caseName方法:

@忽略

@测试

public void caseName()

单击“运行方式”-->;“1 JUnit测试”,运行效果如下:

此时,caseName()方法已被忽略。

@Test批注的预期参数exception test用于测试是否会抛出指定的异常。扔了就是成功,扔了就是失败。请在BookTest中添加一个测试用例:

@Test(应为= ArithmeticException.class)

public void caseException() {

int n = 2/0;

}

这个测试用例除以0,运行效果如下:

成功!因为引发了指定的ArithmeticException。

@Test注释的timeout参数是一个有时间限制的测试,用来限制测试用例消耗的时间,以毫秒为单位。如果在限定时间内没有完成测试用例,则为失败,否则以测试用例的执行结果为准。请在BookTest中添加一个测试用例:

@Test(timeout=1000)

public void caseWhile() {

for(;;) {

}

}

这是一个无限循环,1秒后会强制停止。运行效果如下:

由于超时,操作失败。

@Parameters标注,参数测试,用于测试同一测试用例的一组数据。请创建一个新的“JUnit测试用例”BookTest2,并将代码修改如下:

包net . test . unit . JUnit;

导入静态org . JUnit . assert . assert equals;

导入Java . util . arrays;

导入Java . util . collection;

导入org . JUnit . after;

导入org . JUnit . before;

导入org . JUnit . test;

导入org . JUnit . runner . run with;

导入org . JUnit . runners . parameterized;

导入org . JUnit . runners . parametered . parameters;

@RunWith(Parameterized.class)

公共类图书测试2 {

私有字符串需要id;

私有字符串targetId

私有字符串需要name;

私有字符串targetName

Book book = null

@参数

公共静态收集结果(){

return Arrays.asList(新对象[][] {

{ "002 "," 001 "," JSP "," ASP" },

{ "001 "," 001 "," ASP "," ASP" }

});

}

public book test 2(String expected id,String targetId,String expectedName,String targetName) {

this . expected id = expected id;

this.targetId = targetId

this . expected name = expected name;

this . target name = target name;

}

@以前

公共void设置()引发异常{

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

book =新书();

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

}

@之后

public void tearDown()引发异常{

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

book = null

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

}

@测试

公共void caseId() {

book . setid(targetId);//设置id属性的值。

//使用Assert查看id属性的值。

assertEquals(expectedId,book . getid());

System.out.println("id属性已测试!");

}

@测试

public void caseNames() {

book . set name(target name);//设置name属性的值。

//使用Assert查看name属性的值。

assertEquals(expectedName,book . getname());

System.out.println("name属性已测试!");

}

}

这个例子实际上是BookTest的扩展版本,但是在原来的基础上有几处改动:

首先在文件头添加一行代码:@RunWith(Parameterized.class),用来调用BookTest2类运行;

其次,定义一个用@Parameters注释的结果静态方法,用于存储测试数据。在本例中,存储了两组数据,每组四个。

第三,定义一个带参数的构造函数,参数的个数等于每组测试数据的个数。

最后,定义了四个成员变量,比如expectedId,将测试数据传递给测试用例。

下面执行BookTest2,运行效果如下:

测试用例运行了两次,第一次失败是因为期望值不等于设定值,第二次成功了。

Junit . framework . JUnit 4 test adapter类依托Java 5.0的新特性,不需要继承junit.framework.TestCase的JUnit 4.1已经推出了一段时间,但是一些带有JUnit测试环境的IDE,比如NetBeans 5.5甚至老的Eclipse,仍然只支持JUnit 3。基于JUnit 4.1环境开发的测试用例无法正确运行,所以要解决这个问题,我们需要使用JUnit.framework.JUnit 4测试适配器类。创建一个新的类TestSuite,并将代码修改如下:

包net . test . unit . JUnit;

公共类测试套件{

public static void main(String[]args){

JUnit . textui . test runner . run(test suite . suite());

}

public static JUnit . framework . test suite(){

返回new JUnit . framework . JUnit 4 test adapter(all tests . class);

}

}

最重要的一个是suite方法,它使所有基于JUnit 4环境创建的Tests类都能够通过JUnit在JUnit 3命令行环境中运行。框架。JUnit 4测试适配器类。