用Junit进行单元测试很方便,尤其是Junit4引入了很多Annotation注解以后。看测试的示例:
待测试类:
public class Calculator { public int add(int a, int b) { return a + b; } public int minus(int a, int b) { return a - b; } public int square(int n) { return n * n; } //Bug : 死循环 public void squareRoot(int n) { for(; ;) ; } public int multiply(int a, int b) { return a * b; } public int divide(int a, int b) throws Exception { if (0 == b) { throw new Exception("除数不能为零"); } return a / b; } }
单元测试类:
import org.junit.After; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; public class CalculatorTest { private Calculator cal = new Calculator(); @BeforeClass // 注意,这里必须是static...因为方法将在类被装载的时候就被调用(那时候还没创建实例) public static void before() { System.out.println("global"); } @AfterClass public static void after() { System.out.println("global destroy"); } @Before public void setUp() throws Exception { System.out.println("一个测试开始。。"); } @After public void tearDown() throws Exception { System.out.println("一个测试结束"); } @Test @Ignore public void testAdd() { int result = cal.add(1, 2); Assert.assertEquals(3, result); } @Test public void testMinus() { int result = cal.minus(5, 2); Assert.assertEquals(3, result); } @Test public void testMultiply() { int result = cal.multiply(4, 2); Assert.assertEquals(8, result); } @Test(timeout = 1000) // 单位为毫秒 public void testSquareRoot() { cal.squareRoot(4); } @Test(expected = Exception.class) public void testDivide() throws Exception { System.out.println("teddd"); cal.divide(4, 0);// 很简单的办法....... } // @Test // public void testDivide() { // int result = 0; // try { // result = cal.divide(10, 5); // } catch (Exception e) { // e.printStackTrace(); // Assert.fail();// 如果这行没有执行。说明这部分正确。 // } // Assert.assertEquals(2, result); // } }
在Eclipse里Run As -> JUnit Test,运行测试类,Eclipse的JUnit的View显示如:
可以看到,CalculatorTest类中总共有5个测试用例,ignore了一个,3个测试用例通过,testSquareRoot测试不通过(因为超时),所以整个的测试结果飘红了。同时,控制台的输出结果为:
global 一个测试开始。。 一个测试结束 一个测试开始。。 一个测试结束 一个测试开始。。 一个测试结束 一个测试开始。。 teddd 一个测试结束 global destroy
各种注解的说明:
@Test:
表明该方法是一个测试方法
@BeforeClass 和 @AfterClass:
测试用例初始化时执行 @BeforeClass方法,当所有测试执行完毕之后,执行@AfterClass进行收尾工作。标注、@BeforeClass 和 @AfterClass的方法必须是static的,因为方法将在类被装载的时候就被调用,那时候还没创建测试对象实例。
@Before:
使用了该元数据的方法在每个测试方法执行之前都要执行一次。
@After:
使用了该元数据的方法在每个测试方法执行之后要执行一次。
@Test(expected=*.class) :
通过@Test元数据中的expected属性验证是否抛出期望的异常,expected属性的值是一个异常的类型,如果抛出了期望的异常,则测试通过,否则不通过。
@Test(timeout=xxx):
该元数据传入了一个时间(毫秒)给测试方法,如果测试方法在制定的时间之内没有运行完,则测试也失败。
@Ignore:
该元数据标记的测试方法在测试中会被忽略。同时可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@lgnore("该方法还没有实现"),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。
在test方法内除了使用Assert的assertEquals()方法外,还能使用assertFalse()、assertTrue()、assertNull()、assertNotNull()、assertSame()、assertNotSame()等断言函数。而且如果使用的是Junit4,结合Hamcrest,使用
assertThat([value], [matcher statement])方法可以实现更灵活的断言判断(前提是引入hamcrest的jar包)。
例如:
// is匹配符表明如果前面待测的object等于后面给出的object,则测试通过
assertThat( testedObj, is( object) );
// containsString匹配符表明如果测试的字符串包含指定的子字符串则测试通过
assertThat( testedString, containsString( "developerWorks" ) );
// greaterThan匹配符表明如果所测试的数值testedNumber大于16.0则测试通过
assertThat( testedNumber, greaterThan(16.0) );
// closeTo匹配符表明如果所测试的浮点型数testedDouble在20.0±0.5范围之内则测试通过
assertThat( testedDouble, closeTo( 20.0, 0.5 ) );
//hasItem匹配符表明被测的迭代对象含有元素element项则测试通过assertThat(iterableObject, hasItem (element));
更多更详细的Hamcrest提供的断言判断参考:
http://hi.baidu.com/shenhuanyu09/item/2bcfcb981aa3188e581461b4
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////分割线
上面的Caculator待测试类里,现在我如果想给square方法多弄几个测试用例,按照上面的方法,我应该写好几个@Test方法来测试,或者每次测完再改一下输入的值和期望得到的值,好麻烦。JUnit提供如下的测试:
import java.util.Arrays; import java.util.Collection; import org.junit.Assert; 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 CalculatorTest2{ private Calculator cal = new Calculator(); private int param; private int result; //构造函数,对变量进行初始化 //定义一个待测试的类,并且定义两个变量,一个用于存放参数,一个用于存放期待的结果。 public CalculatorTest2(int param, int result) { this.param = param; this.result = result; } @Parameters public static Collection data(){ return Arrays.asList(new Object[][]{ {2, 4}, {0, 0}, {-3, 9}, }); } @Test public void squareTest() { int temp = cal.square(param); Assert.assertEquals(result, temp); } }
Eclipse里JUnit的运行结果显示为:
测试通过了,CalculatorTest2类里的parameter是每次的测试输入,result就是测试的结果。所有的测试输入和期望结果都在@Parameters标注的data函数的返回的Collection集合里,2的期望得到的平方结果值是4,0期望得到0,-3期望得到9。
把测试代码提交给JUnit框架后,框架如何来运行代码呢?答案就是——Runner。在JUnit中有很多个 Runner,他们负责调用测试代码,每一个Runner都有各自的特殊功能,要根据需要选择不同的Runner来运行测试代码。JUnit中有一个默认Runner,如果没有指定,那么系统自动使用默认 Runner来运行你的代码。这里参数化测试就没有再用默认的Runner了。
再看看打包测试测例子:
import org.junit.runner.RunWith; import org.junit.runners.Suite; /** * 大家可以看到,这个功能也需要使用一个特殊的Runner, * 因此我们需要向@RunWith标注传递一个参数Suite.class。 * 同时,我们还需要另外一个标注@Suite.SuiteClasses, * 来表明这个类是一个打包测试类。我们把需要打包的类作为参数传递给该标注就可以了。 * 有了这两个标注之后,就已经完整的表达了所有的含义,因此下面的类已经无关紧要, * 随便起一个类名,内容全部为空既可 * */ @RunWith(Suite.class) @Suite.SuiteClasses({ CalculatorTest.class, CalculatorTest2.class }) public class AllCalculatorTests { }
这个测试类包含了上面的CalculatorTest.class和CalculatorTest2.class里面所有的测试函数,它的目的就是进行打包所有的测试。
参考:
http://blog.csdn.net/zhuangxiu/article/details/6256893
http://blog.csdn.net/songyinan1989/article/details/7445921
http://www.jb51.net/article/15797.htm
http://jingbo2759.blog.163.com/blog/static/983753152009711103710146/
相关推荐
在Eclipse中使用JUnit4进行单元测试是一种常见的Java开发实践,它可以帮助开发者确保代码的正确性和稳定性。单元测试是软件开发中的重要环节,通过编写针对代码各个独立模块的测试用例,可以验证代码功能是否按预期...
在Eclipse中使用JUnit4进行单元测试是一种常见的开发实践,它可以帮助程序员确保代码的质量和可靠性。JUnit4是Java编程语言中最流行的单元测试框架之一,它提供了丰富的注解、断言和测试工具,使得测试过程更加简洁...
通过深入学习和实践这个"Junit4教程.doc"文档,开发者可以掌握如何有效地使用Junit4进行单元测试,提高代码的健壮性和可维护性。同时,了解单元测试的原理和最佳实践,也有助于提升编程能力,成为一名更专业的Java...
**如何使用JUnit4进行单元测试?** JUnit4引入了注解(Annotation)来简化测试编写,不再需要强制继承TestCase类。以下是一些关键的JUnit4注解: - `@Before`:类似于JUnit3的setUp方法,用于设置测试前的环境。 -...
本教程将详细介绍如何在Eclipse中使用JUnit4进行单元测试。 首先,你需要了解JUnit4的基本概念。JUnit是一个开源的Java测试框架,主要用于编写和运行针对Java代码的单元测试。在JUnit4中,测试用例以方法的形式存在...
单元测试之道(Java):使用JUnit进行单元测试。单元测试是提高代码质量的有效手段,但大部分开发人员由于种种原因都不乐意进行单元测试。
在Eclipse中使用JUnit4进行单元测试,首先需要安装JUnit库到项目中,并配置构建路径。然后,可以通过在方法上添加@Test注解来标记需要测试的方法。JUnit会自动调用这些方法,并检查其中的异常和断言结果。例如,对于...
在实际开发中,使用JUnit4进行单元测试能够帮助我们确保代码的质量,发现并修复bug,提高软件的稳定性。正确地利用JUnit4提供的功能,可以有效地提高测试效率,并使测试代码更加整洁和易于维护。
在Java世界中,**JUnit**是最广泛使用的单元测试框架。本篇将重点介绍如何利用**JUnit 4.5**进行单元测试,以及这个版本的一些特性。 ### JUnit简介 JUnit是一个开源的、基于Java的测试框架,由Ernst Leiss和Kent ...
JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了一种方便、高效的方式来验证代码的正确性。这个压缩包文件包含了JUnit4的相关库,使得开发人员能够轻松地在他们的项目中引入单元测试功能。...