软件测试:单元测试之Eclipse中JUnit4方法&实例

每编写完一个函数之后,都应该对这个函数的方方面面进行测试,这样的测试我们称之为单元测试。

传统的编程方式,进行单元测试是一件很麻烦的事情,你要重新写另外一个程序,在该程序中调用你需要测试的方法,并且仔细观察运行结果,看看是否有错。正因为如此麻烦,所以程序员们编写单元测试的热情不是很高。于是有一个牛人推出了单元测试包,大大简化了进行单元测试所要做的工作,这就是JUnit4

单元测试具体操作步骤:

一、编写待测试的类,新建项目Junit_Test,新建包后新建Calculator.class类

public class Calculator {
    private static int result; // 静态变量,用于存储运行结果
    public void add(int n) {
        result = result + n;
    }
    public void substract(int n) {
        result = result -3;  //Bug: 正确的应该是 result =result-n
    }
    public void multiply(int n) {
    }         // 此方法尚未写好
    public void divide(int n) {
        result = result / n;
    }
    public int getResult() {
        return result;
    }
    public void clear() {     // 将结果清零
        result = 0;
    }
}

二、 将JUnit测试包引入该项目

在资源管理器右键Junit_Test,选择属性,红兰绿黄步骤:


三、生成JUnit测试框架

生成JUnit测试框架:在待测试的类用右键新建测试用例,如果没有,点击其他,点击该类弹出菜单进行选择。



再点击下一步就可以选择要测试的方法了,我这里已经建立过了,就无法选择下一步了,之后点击Finish完成测试用例创建。

四、编写测试用例

import static org.junit.Assert.*;//测试时断言的方法来自这个包   1
import org.junit.*;//包含了绝大部分的功能


public class CalculatorTest {
	
	private static Calculator calculator=new Calculator();  3
	@Before
	public void setUp() throws Exception {
		calculator.clear();
	}

	 @Test                                                  4
	 public void testAdd() {
	        calculator.add(2);
	        calculator.add(3);
	        assertEquals(5, calculator.getResult());//断言
	 }

	 @Test
	 public void testSubstract() {
	        calculator.add(10);
	        calculator.substract(2);
	        assertEquals(8, calculator.getResult());
	 }

	 @Ignore("Multiply() Not yet implemented")
	 @Test
	 public void testMultiply() {
	 }

	 @Test
	 public void testDivide() {
	        calculator.add(8);
	        calculator.divide(2);
	        assertEquals(4, calculator.getResult());
	 }
}	    
这是详细的代码介绍:

1、包含必要的Package

在测试类中用到了JUnit4框架,自然要把相应地Package包含进来。最主要地一个Package就是org.junit.*。把它包含进来之后,绝大部分功能就有了。还有一句话也非常地重要“import static org.junit.Assert.*;”,我们在测试的时候使用的一系列assertEquals方法就来自这个包。大家注意一下,这是一个静态包含(static),是JDK5中新增添的一个功能。也就是说,assertEqualsAssert类中的一系列的静态方法,一般的使用方式是Assert. assertEquals(),但是使用了静态包含后,前面的类名就可以省略了,使用起来更加的方便。

2、测试类的声明

测试类是一个独立的类,没有任何父类。测试类的名字也可以任意命名,没有任何局限性。所以我们不能通过类的声明来判断它是不是一个测试类,它与普通类的区别在于它内部的方法的声明。

3、创建一个待测试的对象

你要测试哪个类,那么你首先就要创建一个该类的对象

4、测试方法的声明

在测试类中,并不是每一个方法都是用于测试的,你必须使用“标注”来明确表明哪些是测试方法。“标注”也是JDK5的一个新特性,用在此处非常恰当。我们可以看到,在某些方法的前有@Before@Test@Ignore等字样,这些就是标注,以一个“@”作为开头。

这些标注都是JUnit4自定义的,熟练掌握这些标注的含义非常重要。

5、编写测试方法

你要在方法的前面使用@Test标注,以表明这是一个测试方法。对于方法的声明也有如下要求:名字可以随便取,没有任何限制,但是返回值必须为void,而且不能有任何参数。如果违反这些规定,会在运行时抛出一个异常。

6、忽略还未完成的方法

如果你在写程序前做了很好的规划,那么哪些方法是什么功能都应该实现定下来。因此,即使该方法尚未完成,他的具体功能也是确定的,这也就意味着你可以为他编写测试用例。但是,如果你已经把该方法的测试用例写完,但该方法尚未完成,那么测试的时候一定是“失败”。这种失败和真正的失败是有区别的,因此JUnit提供了一种方法来区别他们,那就是在这种测试函数的前面加上@Ignore标注,这个标注的含义就是“某些方法尚未完成,暂不参与此次测试”。这样的话测试结果就会提示你有几个测试被忽略,而不是失败。一旦你完成了相应函数,只需要把@Ignore标注删去,就可以进行正常的测试。

7、固定代码阶段Fixture

Fixture的含义就是“在某些阶段必然被调用的代码”。比如我们上面的测试,由于只声明了一个Calculator对象,他的初始值是0,但是测试完加法操作后,他的值就不是0了;接下来测试减法操作,就必然要考虑上次加法操作的结果。这绝对是一个很糟糕的设计!我们非常希望每一个测试都是独立的,相互之间没有任何耦合度。因此,我们就很有必要在执行每一个测试之前,对Calculator对象进行一个“复原”操作,以消除其他测试造成的影响。因此,“在任何一个测试执行之前必须执行的代码”就是一个Fixture,我们用@Before来标注它。

五、运行测试代码

按照上述代码修改完毕后,我们在CalculatorTest类上点右键,运行我们的测试



进度条是红颜色表示发现错误,具体的测试结果在进度条上面有表示“共进行了4个测试,其中1个测试被忽略,一个测试失败”。

猜你喜欢

转载自blog.csdn.net/weixin_30363263/article/details/80062866
今日推荐