全面認識JUnit 4的新特征(1)

發表于:2007-06-11來源:作者:點擊數: 標簽:
一、引言 在本文開始,我將假定,你已經了解由Kent Beck和Erich Gamma發明的這個 Java 單元測試 框架并因此而略過必要的簡介。所以,我將集中分析從JUnit 3.8到最新版本JUnit 4的遷移過程以及其在IDE和Ant中的集成。 JUnit 4是一種與其之前的版本完全不同的A

一、引言

在本文開始,我將假定,你已經了解由Kent Beck和Erich Gamma發明的這個Java單元測試框架并因此而略過必要的簡介。所以,我將集中分析從JUnit 3.8到最新版本JUnit 4的遷移過程以及其在IDE和Ant中的集成。

JUnit 4是一種與其之前的版本完全不同的API,它根據Java 5.0中的新特征(注解,靜態導入等)構建而成。如你所見,JUnit 4更簡單、更豐富和更易于使用,而且它引入了更為靈活的初始化和清理工作,還有限時的和參數化測試用例。

代碼實例最能說明問題。因此,在本文中,我將使用一個例子來展示不同的測試用例:一個計算器。該示例計算器很簡單,效率并不高,甚至還有一些錯誤;它僅僅操作整數,并且把結果存儲在一個靜態變量中。Substract方法并不返回一個有效的結果,而且也沒有實現乘法運算,而且看上去在squareRoot方法中還存在一個錯誤:無限循環。這些錯誤將幫助說明使用JUnit 4進行測試的有效性。你可以打開和關閉這個計算器,而且你可以清除這些結果。下面是其實現代碼:

package calc;

public class Calculator {

 private static int result; //存儲結果的靜態變量

 public void add(int n) {

result = result + n;

 }

 public void substract(int n) {

result = result - 1; //錯誤:應該是"result = result - n"

 }

 public void multiply(int n) {} //還沒實現

 public void divide(int n) {

result = result / n;

 }

 public void square(int n) {

result = n * n;

 }

 public void squareRoot(int n) {

for (; ;) ; //錯誤:無限循環

 }

 public void clear() { //清除結果

result = 0;

 }

 public void switchOn() { //打開屏幕,顯示"hello",并報警

result = 0; //實現其它的計算器功能

 }

 public void switchOff() { } //顯示"bye bye",報警,并關閉屏幕

 public int getResult() {

return result;

 }

}

二、遷移一個測試類

現在,我將把一個已經使用JUnit 3.8編寫成的簡單的測試類遷移到JUnit 4。這個類有一些缺陷:它沒有測試所有的業務方法,而且看上去在testDivide方法中還存在一個錯誤(8/2不等于5)。因為還沒有實現乘法運算功能,所以對其測試將被忽略。

下面,我們把兩個版本的框架之間的差別以粗體顯示出現于表格1中。

表格1.分別以JUnit 3.8和JUnit 4實現的CaculatorTest。

JUnit 3.8

package junit3;

import calc.Calculator;

import junit.Framework.TestCase;

public class CalculatorTest extends TestCase {

 private static Calculator calculator = new Calculator();

 @Override protected void setUp() { calculator.clear(); }

 public void testAdd() {

calculator.add(1);

calculator.add(1);

assertEquals(calculator.getResult(), 2);

 }

 public void testSubtract() {

calculator.add(10);

calculator.subtract(2);

assertEquals(calculator.getResult(), 8);

 }

 public void testDivide() {

calculator.add(8);

calculator.divide(2);

assert calculator.getResult() == 5;

 }

 public void testDivideByZero() {

try {

 calculator.divide(0);

 fail();

}

catch (ArithmeticException e) { }

 }

 public void notReadyYetTestMultiply() {

calculator.add(10);

calculator.multiply(10);

assertEquals(calculator.getResult(), 100);

 }

}

JUnit 4

package JUnit 4;

import calc.Calculator;

import org.junit.Before;

import org.junit.Ignore;

import org.junit.Test;

import static org.junit.Assert.*;

public class CalculatorTest {

 private static Calculator calculator = new Calculator();

 @Before public void clearCalculator() {

calculator.clear();

 }

 @Test public void add() {

calculator.add(1);

calculator.add(1);

assertEquals(calculator.getResult(), 2);

 }

 @Test public void subtract() {

calculator.add(10);

calculator.subtract(2);

assertEquals(calculator.getResult(), 8);

 }

 @Test public void divide() {

calculator.add(8);

calculator.divide(2);

assert calculator.getResult() == 5;

 }

 @Test(expected = ArithmeticException.class)

 public void divideByZero() {

calculator.divide(0);

 }

 @Ignore("not ready yet")

 @Test

 public void multiply() {

calculator.add(10);

calculator.multiply(10);

assertEquals(calculator.getResult(), 100);

 }

}


共5頁: 1 [2] [3] [4] [5] 下一頁

原文轉自:http://www.anti-gravitydesign.com

...
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97