CS61B srping 2018 lab03 https://sp18.datastructur.es/

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就是测试 , 是否 equal的方法

@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方法,先写测试,测试必须至少包含以下三个方面:

  1. 函数返回一个reversed的list
  2. 必须是destructive,可以用assertNotEquals来做
  3. 对函数输入一个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编写测试。 ?我后面想起来可能会写

posted @ 2024-12-25 15:41  刘老六  阅读(57)  评论(0)    收藏  举报