在 IDEA 中优雅的断点测试


一、功能介绍

1. Resume programme

对应上图中的 模块1,当程序执行到断点处将停止,通过 Resume programme 即直接略过中间代码跳到一处断点,若后续不存在断点则执行到程序结束。

如在下述中分别在 1,3 输出处断点,当程序运行 println(1) 时将暂停,执行 Resume programme 后则将在 println(3) 处再次暂停,再次执行 Resume programme 则会执行剩余代码然后退出。

 public static void main(String[] args) {
    System.out.println(1);      // 此段断点
    System.out.println(2);
    System.out.println(3);      // 此段断点
    System.out.println(4);
}

2. Step Over

对应上图中的 模块2,即从断点处开始逐行执行,若执行的代码为方法并不会进入内部而是直接得到该方法执行结果。

同样在 println(1) 处断点,当程序运行 println(1) 时将暂停,执行 Step Over 后则将在 println(2) 处再次暂停,再次执行 Step Over 则将在 println(3) 处暂停,即逐行向下执行。

 public static void main(String[] args) {
    System.out.println(1);      // 此段断点
    System.out.println(2);
    System.out.println(3);
}

3. Step Into

对应上图中的 模块3,同样是从断点处开始逐行执行,但是与 Step Over 不同的是 Step Into 若执行的当前行若是方法则会进入方法内部继续逐行断点。

如下中在 test() 处断点,程序运行后将在该行暂停,执行 Step Into 后将跳到 println(2) 处暂停,若不存在方法嵌套则继续选择其将类似 Step Over 逐行向下执行。

public static void main(String[] args) {
    System.out.println(1);
    test();     // 此段断点
    System.out.println(4);
}

public static void test() {
    System.out.println(2);
    System.out.println(3);
}

4. Step out

对应上图中的 模块4,用于略过当前执行的方法内剩余代码执行过程,若存在方法内后续仍存在断点则执行到断点处。如在不存在其它断点的情况下通过 Step Into 进入某个方法的之后触发 Step out 则会直接执行剩余代码并返回至 Step Into 入口的下一行。

如下中在 println(2) 处断点,程序启动后将在该行暂停,执行 Step out 后将会执行 test() 方法内剩余代码转至 println(4) 处暂停。

public static void main(String[] args) {
    System.out.println(1);
    test();     
    System.out.println(4);
}

public static void test() {
    System.out.println(2);      // 此段断点
    System.out.println(3);
}

5. View Breakponints

对应上图中的 模块5,用于查看当前代码中已经添加的断点。

6. Mute Breakpoint

对应上图中的 模块6,通过触发 Mute Breakpoint 则当前代码中的所有断点将不再生效,意味着执行到断点处不会停止。

二、示例演示

为了更好的介绍断点作用效果下面通过一个具体示例进行介绍。

1. 测试代码

在开始之前准备一个简单的测试代码,完整代码如下:

public class MyTest {

    @Test
    public void demo() {
        System.out.println("Example start.");
        method1();
        method2();
        System.out.println("Example finish.");
    }

    public void method1() {
        System.out.println("Into method 1.");
        method2();
        System.out.println("Exit method 1.");
    }

    public void method2() {
        System.out.println("Into method 2.");
        System.out.println("Exit method 2.");
    }
}

2. 示例分析

(1) 测试一

在上述示例代码 第6行 处打上断点并执行 demo 模块,第一大点中不同功能触发效果如下:

  • 若执行 Step Over : 断点将移至 第7行,若继续触发则会逐行向下执行,但在执行 method1() 等方法时并不会进入其方法体。
  • 若执行 Step Into : 断点将移至方法 method1() 内,即上述中的 第12行
  • 若执行 Step Out : 将从 第6行 开始执行剩余代码并返回。
(2) 测试二

同样在 第6行 打上断点执行后 demo 模块。

  • 在触发断点后选择 Step Into 进入 method1() 方法体内。
  • 进入 method1() 后触发 Step Out 则会返回到 demo() 中的 第7行,即 Step Into 入口的下一行。
(3) 测试二

分别在 第6行第14行 打上断点执行后 demo 模块。

  • 在触发断点后选择 Step Into 进入 method1() 方法体内。
  • 进入 method1() 后触发 Step Out 则会在 第14行 处停止,即若当前方法内存在断点则不会退出方法而是在断点处停止。

文章作者: 烽火戏诸诸诸侯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 烽火戏诸诸诸侯 !
  目录