junit 简单介绍(入门)

当你需要编写更多的test case的时候,你可以创建更多的TestCase对象。当你需要一次执行多个TestCase对象的时候,你可以创建另一个叫做TestSuite的对象。为了执行TestSuite,你需要使用TestRunner。

TestCase + TestSuite + BaseTestRunner = TestResult

Test runner:

JUnit发布包中包含了3个TestRunner类:一个用户文本控制台,一个用户Swing,甚至还有一个AWT。
并不存在TestRunner接口,这和JUnit框架中的其它元素不同。相反,JUnit附带的几个test runner都是继承自BaseTestRunner。如果你不管什么理由需要编写你自己的test runner,你也可以继承这个类。例如:Cactus框架就继承了BaseTestRunner来创建一个ServletTestRunner,可以从浏览器中运行JUnit测试。

用TestSuite来组合测试:

若想要运行多个test case又会如何呢?如果想在多个test case中选一部分又怎样呢?应当如何来为test case分组呢?
看来,在TestCase和TestRunner之间,你还需要某种容器,用来把几个测试归在一起,并且把他们作为一个集合一起运行,但是,在使得多个test case运行得以简化的同时,你也不希望让运行单个test case变得复杂化。
JUnit对这个难题的回答是TestSuite。TestSuite被设计成可以运行一个或多个test case,test runner负责启动TestSuite,而要运行哪些test case则由TestSuite来决定。
若你没有提供自己的TestSuite,test runner会自动创建一个。
缺省的TestSuite会扫描你的测试类,找出所有以test开头的方法。缺省的TestSuite在内部为每个testXXX方法都创建一个TestSuite的实例,要调用的方法的名字会传递给TestCase的构造函数,这样每个实例就有一个独一无二的标识。

用TestResult来收集参数:
TestResult负责收集TestCase的执行结果。如果所有的测试都总是可以顺利的完成,那么为什么还要运行他们呢?所以,TestResult储存了所有测试的详细情况,是通过还是失败。
TestRunner使用TestResult来报告测试结果。如果TestResult集合中没有TestFailure对象,那么代码就是干净的,进度条就的绿色的;否则TestRunner就会报失败,并输出失败测试的数目和它们的stack trace。
你只需要知道他的存在就OK了。

用TestListener来观察结果:

JUnit框架提供了TestListener接口,以帮组对象访问 TestResult并创建有用的报告。TestRunner实现了 TestListener,很多特定的JUnit扩展和实现了TestListener。可以有任意数量的TestLintener向JUnit框架注册,这些TestListener可以根据TestResult提供的信息做它们需要做的任何事情。

用TestCase来工作:

概括地说,JUnit的工作过程就是由TestRunner来运行包含一个或者多个TestCase(或者其他TestSuite)的TestSuite。但是在常规的工作中,你通常只和TestCase打交道。

junit_demo1:

创建一个普通的java工程,导JUNIT4的jar
编写基本类:
package cn.partner4java.helloworld;

import junit.framework.TestCase;

public class HelloWorld extends TestCase {

public void testHelloWorld(){
int i = 1/0;
}

}

这就是一个TestCase

有啥用呢?

在outLine找到这个方法,点击右键,run as Junit test,就会弹出结果显示

还是不知道有啥用对吧?
创建:cn.partner4java.helloworld2.ArithmeticService
创建:cn.partner4java.helloworld2.ArithmeticServiceTest

package cn.partner4java.helloworld2;

public class ArithmeticService {
private int num1 = 0;
private int num2 = 0;

public ArithmeticService(int num1,int num2){
this.num1 = num1;
this.num2 = num2;
}

public int add(){
return num1 + num2;
}

public int delete(){
return num1 - num2;
}
}


package cn.partner4java.helloworld2;

import junit.framework.TestCase;

public class ArithmeticServiceTest extends TestCase {
private ArithmeticService arithmeticService;

@Override
protected void setUp() throws Exception {
super.setUp();
arithmeticService = new ArithmeticService(12,3);
}

public void testAdd(){
System.out.println(arithmeticService.add());
}

public void testDelete(){
System.out.println(arithmeticService.delete());
}

}

不知道你看完这两个类,能否明白JUnit是干的什么的。(哦,是用来测试我的类的方法是否正确)

我们以前面同样的方法执行testAdd,你们说会打印什么结果呢?(如果你认真听我们前面讲的内容了,你就会知道答案)

很抱歉,不是15,而是:
15
9
两个结果

接下类我们说TestSuite:
修改:ArithmeticServiceTest

执行testDelete,打印什么?

package cn.partner4java.helloworld3;

import junit.framework.TestCase;
import junit.framework.TestSuite;

public class ArithmeticServiceTest extends TestCase {
private ArithmeticService arithmeticService;

public ArithmeticServiceTest(String string) {
super(string);
}

@Override
protected void setUp() throws Exception {
super.setUp();
arithmeticService = new ArithmeticService(12,3);
}

public void testAdd(){
System.out.println(arithmeticService.add());
}

public void testDelete(){
System.out.println(arithmeticService.delete());
}

public static TestSuite suite(){
TestSuite suite = new TestSuite();
suite.addTest(new ArithmeticServiceTest("testAdd"));
return suite;
}
}

答案:15
明白为什么了吧?

当然也可以把TestSuite拿出来单独写:
如:cn.partner4java.helloworld4.ArithmeticServiceTestSuite
执行结果:
15
9

package cn.partner4java.helloworld4;

import cn.partner4java.helloworld3.ArithmeticServiceTest;
import junit.framework.Test;
import junit.framework.TestSuite;

public class ArithmeticServiceTestSuite extends TestSuite {
public static Test suite() {
TestSuite suite = new TestSuite(ArithmeticServiceTest.class);
return suite;
}
}

那么我们的TestRunner和TestResult,聪明的你会想到,不就是我们这里的测试结果界面和测试返回报告么。
在现实的编程中,我们也很少需要手工去写这两种类。

多说一嘴:

Junit4,其实一般是这么写的:
cn.partner4java.helloworld5.HelloWorld

JDK5以后的新特性,注解,你也可以自定义注解。

package cn.partner4java.helloworld5;


import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class HelloWorld {

@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("setUpBeforeClass");
}

@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("tearDownAfterClass");
}

@Test
public void testHelloWorld(){
System.out.println("testHelloWorld");
}

}

当然还有断言的配合使用,这里就先不说了

这是我以前整理培训的ppt的内容,可下载了看看,只供参考,只是一个入门培训,不过平时的使用已经够了

http://download.csdn.net/source/3022235


你可能感兴趣的:(JUnit)