Unit Testing with JUnit, Debugging
准备
装好 CS61B插件(emmmmm,不装也没事)
把lab2 的IntList.java
复制到 lab3/IntList 文件夹.
看看关于测试的课程视频
介绍
啊?
JUnit是java测试框架,现在要用JUnit进行单元测试,单元Unit就是把程序分成小块的单元,一个单元的功能尽量少,单独测试,分而治之。
JUnit语法
LinkedListDequeTest
中手动(自动化程度低)编写的测试程序和使用JUnit编写的测试程序没啥本质区别,但是JUnit提供的各种方法可以避免不必要的重复操作,ArithmeticTest.java
中是关于JUnit的例子(先别打开IntelliJ呃呃呃) ,
@Test 必须加,所有测试方法必须非静态non-static,assertEquals就是测试
@Test
public void testMethod() {assertEquals(<expected>, <actual>);
}
从这开始,要使用IntelliJ了。
Running JUnit Tests in IntelliJ 在 IntelliJ中 运行JUnit 测试
先把lab2 的
IntList.java
复制到 lab3/IntList 文件夹。
先看看ArithmeticTest
文件,如果设置正确,运行后,应该可以看到下图的类似结果,
因为这里用了 CS61B renderer(呃呃呃),显示结果和default renderer会有点差别,你可以切换,
办法有好多种,比如右键单击,到菜单栏切换,或者在右上角功能区切换。
然后先把 Arithmetic 中的错误改好吧。可以用眼睛瞅,也可以调试看看,你随便。
//这是默认的 有错误的 那段程序文本。。。public static int sum(int a, int b) {return a * b;}
Intlists
用IntList.of
方法来创建 IntList, 比如IntList myList = IntList.of(0, 1, 2, 3);
会生成0 -> 1 -> 2 -> 3 -> null
这样的list, Copy your IntList.java that you created for lab2 into the lab3/IntList folder,向 IntListTest.java加入一个新测试,测.reverse()
方法(还没编写具体内容),这里要'test driven'。
Test a Reverse Method 先测试Reverse方法
先别写好 reverse方法,先写测试,测试必须至少包含以下三个方面:
- 函数返回一个reversed的list
- 必须是destructive,可以用
assertNotEquals
来做 - 对函数输入一个null,函数也能正常工作
@Test(timeout = 1000)
让测试不会长时间卡死。
Writing a Reverse Method 编写Reverse方法
先写个 空的reverse方法,单纯为了编译通过(要是用命令行运行,那必须加个main方法,用IDE则不用),第一次测试,那测试肯定fail。
然后编写与一个通过上面三个条件的测试即可,week 3 discussion solutions
有答案。
下方是 两个版本的reverse 方法
public static IntList reverse(IntList l){if(l.rest==null||l==null){return l;}IntList reverse = null;while(l!=null){IntList second = l.rest;l.rest=reverse;reverse=l;l=second;}return reverse;}public static IntList reReverse(IntList l){if(l.rest==null||l==null){return l;}IntList second = l.rest;IntList reverse= reReverse(second);second.rest=l;l.rest=null;return reverse;}
A Debugging Mystery 调试
额,提供了两个文件如下,把bug 调试/找出来。(但没说要改),如果要编写测试看,assertTrue(boolean) 和 assertTrue(String, boolean)可能很有用。
public class HorribleSteve {public static void main(String [] args) {int i = 0;for (int j = 0; i < 500; ++i, ++j) {if (!Flik.isSameNumber(i, j)) {break; // break exits the for loop!}}System.out.println("i is " + i);}
}
/** An Integer tester created by Flik Enterprises. */
public class Flik {public static boolean isSameNumber(Integer a, Integer b) {return a == b;}
}
嗯,我没发现问题在哪,我就知道 Integer a , Interger b
要改成 int a ,int b
。。。emmmmmm
Deque Unit Tests 为Deque编写测试
如果你会,可以为LinkedListDeque and ArrayDeque
编写测试。 ?我后面想起来可能会写