1.2 JUnt4测试用例的运行和调试
写好产品代码和测试代码后,就可以运行测试程序了。只要在Eclipse的CalculatorTest类上单击鼠标右键,在弹出的菜单上选择“Run As a JUnit Test”运行测试用例,测试结果就显示出来了,如图4所示。
显然,减法没通过是由于代码中存在问题,而乘法没通过是由于乘法没有实现。首先来修改减法的函数实现:
publicvoid substract(int m,int n) { result =n-m; //Bug: 正确的应该是result =m-n }
再进行一次运行,结果如图5所示。
图4 JUnit单元测试结果(一) 图5 JUnit单元测试结果(二)
最后完成乘法的产品代码与测试代码。产品代码如下:
publicvoid multiply int m,int n) { result=m*n }
测试代码如下:
publicvoid testMultiply() { calculator.multiply(8,2); assertEquals(16,calculator.getResult()); }
图6为最后的测试结果。最终产品代码如下:
packageandycpp; publicclass Calculator { private static int result; // 静态变量,用于存储运行结果 public void add(int m,int n) { result = m + n; } public void substract(int m,int n) { result = m-n; } public void multiply int m,int n) { result = m*n; } public void divide(int m,int n) { result = m / n; } public void square(int n) { result = n * n; } public void squareRoot(int n) { for (; ;) ; //Bug : 死循环,为了后面介绍 } public void clear() { // 将结果清零 result = 0; } public int getResult() { return result; } }
图6 JUnit单元测试结果(三)
而最终的测试代码如下:
packagecom.jerry; importstatic org.junit.Assert.*; importorg.junit.Before; importorg.junit.Test; importorg.junit.Ignore; publicclass CalculatorTest { privatestatic Calculator calculator = new Calculator(); @Before publicvoid setUp() throws Exception { calculator.clear(); } @Test publicvoid testAdd() { calculator.add(2,3); assertEquals(5,calculator.getResult()); } @Test publicvoid testSubstract() { calculator.substract(10,2); assertEquals(8,calculator.getResult()); } @Test publicvoid testMultiply() { calculator.multiply (8,2); assertEquals(16,calculator.getResult()); }@Test publicvoid testDivide() { calculator.divide(8,2); assertEquals(4,calculator.getResult()); } }
1.3 对基本代码的详细介绍
一个单元测试代码主要分为以下几个部分。
(1)设置环境。
(2)运行测试。
(3)结果判断。
(4)清理环境。
这里,设置环境和清理环境是有区别的。
设置环境:比如,建立数据库连接。
清理环境:比如,断开数据库连接。
1.包含必要的Package
importstatic org.junit.Assert.*;
assertEquals是Assert类中的一系列的静态方法,一般的使用方式是Assert. assertEquals(),但是使用了静态包后,前面的类名就可以省略了,使用起来更加方便。比如:
assertEquals(8,calculator.getResult());
显而易见,assertEquals函数的主要功能是实现“结果判断”。
2.测试类的声明
测试类是一个独立的类,没有任何父类。测试类的名字也可以任意命名,没有任何局限性。所以,不能通过类的声明来判断它是不是一个测试类。测试类与普通类的区别在于它内部方法的声明。
3.创建一个待测试的对象
要测试哪个类,要创建一个该类的对象。比如第1.1节和第1.2节中,为了测试Calculator类,必须创建一个Calculator对象。
privatestatic Calculator calculator = new Calculator();
4.测试方法的声明
在测试类中,并不是每个方法都用于测试,必须使用“标注”来明确表明哪些是测试方法。“标注”也是JDK5的一个新特性,用在此处非常恰当。可以看到,某些方法的前面有@Before、@Test、@Ignore、@After等字样,这些就是标注,以一个“@”作为开头。第1.3节开始的描述的@Before、@Test、@After对应于。
(1)标记@Before:设置环境。
(2)标记@Test:运行测试。
(3)标记@After:清理环境。
这个方法的前面使用@Test标注,表明这是一个测试方法。对方法的声明,也有如下要求:名字可以随便取,没有任何限制,但是返回的值必须为void,而且不能有任何参数。如果违反这些规定,会在运行时抛出一个异常。
@Test publicvoid testSubstract() { calculator.substract(10,2); assertEquals(8,calculator.getResult()); }
在测试方法中调用substract函数,将10减去2,期待的结果应该是8。如果最终的实际结果也是8,则说明substract函数是正确的,反之说明它是错的。
assertEquals(8,calculator.getResult()):用来判断期待结果和实际结果是否相等,第一个参数填写期待结果,第二个参数填写实际结果,也就是通过计算得到的结果。这样写好后,JUnit会自动进行测试,并把测试结果反馈给用户。
星云测试
奇林软件
联合通测
顾翔凡言:
分子作布朗运动的原因是由于原子、基本粒子也在作布朗运动,所以根本就无法测准粒子的动量与位置。根据狭议相对论E=MC^2,质量与能量是物质的两个属性,基本粒子有质量,与作布朗运动产生能量是一致的。(大物体也在作布朗运动,比如弹球,但由于质量太大,运动范围太小,我们用肉眼看不到)。