JUnit 3.8.2和JUnit 4.8.1学习笔记
?
JUnit学习笔记 2011年10月01日 环境 MyEclipse 9.0
铺垫:
?
1、单元测试(Unit Test):?
?
?是针对软件的最小模块进行正确性检验的测试工作。
?所谓最小模块,在OOP的范畴内,通常是指对象的方法。
?
2、为什么要做单元测试?
?
?进行单元测试是降低软件风险和减少维护成本的有效途径。
?
3、以前是怎么做测试的?
?
?main方法、sysout输出……
?
?优点:?快速直接
?
?缺点:?没有留下可重用的代码。
?????????? 无法进行自动化回归测试。
?????????? 增加了类的体积,代码不清晰。
?????????? 不规范、不优雅。
?
4、断言(Assertion):
?
?在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。
?在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,
?一个正确程序必须保证这个boolean表达式的值为true;
?如果该值为false,说明程序已经处于不正确的状态下,assert将给出警告或退出。
?一般来说,assertion用于保证程序最基本、关键的正确性。
?assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。
/*************************************************************************************************
?* 需补充关键词:
?* ① 测试驱动开发(TDD: Test-Driven Development)
?* ② Hamcrest(JUnit4.4后引入的测试框架提供了一套匹配符,可结合使用全新的断言语法:assertThat)
?************************************************************************************************/
?
---------------------------------------我是华丽的分割线-------------------------------------------
?
正题:
?
一、JUnit简介
?
JUnit是基于面向对象构建的java单元测试框架。
JUnit是开放源代码项目,可按需要进行扩展,操作相对简单。
JUnit官方网站:http://www.junit.org
JUnit的口号:keep the bar green to keep the code clean。(PS:口号的具体含义用过JUnit后就知道了……)
?
目前JUnit官网最新版本是4.10。
我用的MyEclipse 9.0内置了3.8.2和4.8.1。
?
3.X和4.X两个版本最主要的区别是:
?
?JUnit3基于继承
?JUnit4基于注解
?
两种未通过测试的结果:
?
?Failure:?测试失败
?Error:??异常错误
二、JUnit应用
?
?
??? 待测类之一:
/** * @author Maxpin on 2011-10-01 含有四则运算方法的测试类 * */public class CalcTest {private Calc calc;//在所有测试方法前执行一次@BeforeClasspublic static void globalInit() {System.out.println("globalInit invoked");}//在所有测试方法后执行一次@AfterClasspublic static void globalDestroy() {System.out.println("globalDestroy invoked");}//在每个测试方法前执行@Beforepublic void setUp() {System.out.println("Before");calc = new Calc();}//在每个测试方法后执行@Afterpublic void tearDown() {System.out.println("After");}// 测试方法执行超过1000毫秒后算超时,测试将失败@Test(timeout = 1000)public void testAdd() {calc = new Calc();int result = calc.add(1, 2);assertEquals(3, result);}// 测试方法期望得到的异常类@Test(expected = Exception.class)public void testDivide() throws Exception {calc.divide(1, 0);}// 执行测试时将忽略掉此方法,如果用于修饰类,则忽略整个类@Ignore("not ready yet")@Testpublic void testSubtract() {calc = new Calc();int result = calc.subtract(1, 2);assertEquals(-1, result);}}/** * @author Maxpin on 2011-10-01 多组参数值测试加法运算的测试类 * * 使用参数化运行器运行 */@RunWith(Parameterized.class)public class CalcParametersTest {Calc clac;private int expected; // 期望值private int input1; // 输入值1private int input2; // 输入值2@SuppressWarnings("rawtypes")// 提供参数的方法@Parameterspublic static Collection preparedData() {Object[][] obj = { { 3, 1, 2 }, { 0, -5, 5 }, { 10, 8, 2 } };return Arrays.asList(obj);}/** * 带参构造方法 * * @param expected * 参数期望值 * @param input1 * 参数输入值1 * @param input2 * 参数输入值2 */public CalcParametersTest(int expected, int input1, int input2) {this.expected = expected;this.input1 = input1;this.input2 = input2;}/** * @throws java.lang.Exception */@Beforepublic void setUp() throws Exception {clac = new Calc();}/** * Test method for {@link com.accp.junit4.Calc#add(int, int)}. */@Testpublic void testAdd() {// 直接断言,会根据参数的组数来执行测试多次assertEquals(this.expected, clac.add(this.input1, this.input2));}}/** * * @author Maxpin on 2011-10-01 套件测试类 * * 测试套件 * * 使用Suite运行器测试,并指定测试类 */@RunWith(Suite.class)@Suite.SuiteClasses({ CalcTest.class, CalcParametersTest.class })public class TestAll {}/** * * @author Maxpin on 2011-10-01 套件测试类 * * 测试套件 * * 使用Suite运行器测试也可以嵌套Suite */@RunWith(Suite.class)@Suite.SuiteClasses({ TestAll.class, LargestorTest.class })public class TestAllTest {}?
---------------------------------------我是华丽的分割线-------------------------------------------
总结:
?
?JUnit单元测试框架体积小巧,功能强大。
?及时测试显然是一种良好的开发习惯,即便测试代码量多过于被测代码量。。。
?JUnit3和JUnit4相比较而言,后者更加灵活便利。
?测试代码执行前后,被测代码的状态始终应保持一致性。
?引用某名言:单元测试不是为了证明您是对的,而是为了证明您没有错误。
?
?
?最后:附上完整版的练习实例源码,仅供学习参考交流使用。