如何使用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测试适配器类。