!!!
软件测试之Debug必知必会(IDEA版),日常工作必备!
一、Debug作用
Debug的作用大致如下:追踪代码的运行流程
、程序运行异常定位和调试
。对于一个优秀的测试人员来说,需要具备的能力:能发现问题,还能定位问题,而且能给研发解释得清楚
。
测试人员在测试过程中,在有一定定位问题能力前提下,尽量不要一发现问题就找开发,可以先通过各种手段定位出问题。如果实在找不出原因,可以再去找开发。定位问题的手段有很多,例如看日志、抓包、Debug等
。
二、Debug基本使用
在IDEA中使用Debug步骤分为设置断点和调试程序两部。如下图所示
2.1 开启或取消断点
- 在IDEA中
左侧行号栏
处鼠标左键单击
即可打上/取消断点。在设置好断点后,断点出鼠标右键
单击可以通过取消勾选Enabled选项
可以使之不生效。
- 鼠标左键单击可以开启和取消断点,如果需要取消所有断点,可以先点击进入
Breakpoints面板
中。
- 可以取消勾选断点,就可以使之失效,点击上方 — 号就可以删除断点。
2.2 设置断点范围
-
设置断点的时候,按照断点的影响范围,可以分为
ALL
和Thread
。ALL:阻塞所有线程。Thread:阻塞当前线程。一般需要进行多线程的Debug或者Debug远程代码的时候,都是选择Thread模式
。
-
关于Debug中ALL和Thread的不同,可以通过下面的代码进行区分。在
ThreadTester
类的run方法的两条输出语句中打上断点,分别设置ALL、Thread两种情况,查看执行步骤。最后可以看出:使用All的模式,所有进入代码的线程,都会依次卡在第一个断点上,如果不放行,任意一个线程都不进入到下一步。如果是Thread的模式,那么就会每个线程进行依次进行调试,依次进入各自的断点中。
public class ThreadDebugTest { public static void main(String[] args) { Thread t1=new ThreadTester("Thread-1"); t1.start();
<span class="token class-name">Thread</span> t2<span class="token operator">=</span><span class="token keyword">new</span> <span class="token class-name">ThreadTester</span><span class="token punctuation">(</span><span class="token string">"Thread-2"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> t2<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"All Thread a=end"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
}
class ThreadTester extends Thread{
public ThreadTester(String name){
this.setName(name);
}<span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">" start"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">" end"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
}
2.3 设置断点条件
- 按照命中次数:即可以设置在某行语句执行到第几次的时候,触发断点。
- 按照表达式:在断点处设置表达式,当表达式成立的时候,触发Debug。
2.4 设置断点类型
- 行断点:上面在制定代码行设置断点的,都是行断点。
- 方法断点:标记在方法那一行的断点。对于方法断点,可以设置下面几个值:
Method entry
:进入方法时激活断点。Method exit
:结束方法时激活断点。Emulated
:方法开始和结束都都触发一次断点,默认也是这个。
- 异常断点:当程序发生指定的异常,触发断点。创建和触发异常断点的步骤如下。这种断点对于知道代码中某个场景会抛出异常,但是却不明确哪一块代码导致抛出异常的场景下,还是很好用的。
- 变量断点:设置在变量上的断点。应用场景:在进行一系列的计算后,变量的值不是预期效果的情况下,可以使用变量断点来确定原因。
- 类断点:设置在类上的断点,比较少用。
三、多线程Debug
在前面说到设置断点的范围的时候,说到了ALL和Thread,而多线程Debug就是设置为Thread情况下得调试。
四、远程Debug
4.1 开启远程Debug
参考链接:Java项目开启远程调试(tomcat、springboot)
作为测试而言,可以参考上面链接在Java应用启动时添加相关配置,设置Debug也端口。如果已经设置Debug端口的可以通过使用ps -ef|grep java
查看应用是否开启Debug,以及其对应的Debug端口
添加的配置有两种模式,一种为-agentlib,另一种为-Xdebug,其区别和用法参数含义如下。
-
-agentlib:用于java5以上。-Xdebug会以解释模式而不是JIT运行,这会比较慢,所以推荐-agentlib
-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y
-
-Xdebug:通常用于java5 及更低版本
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044
参数解析:
参数 | 含义 |
---|---|
address | debug端口 |
server=y/n | JVM 是否需要作为调试服务器执行 |
suspend=y/n | 是否在调试客户端建立连接之后启动JVM |
transport=dt_socket、dt_shmem | dt_socket使用socket模式,dt_shmem使用共享内存,后者只适用于windows平台 |
4.2 IDEA中进行远程Debug
- 点击
Run
->Edit Configurations
- 点击
+
->Remote
- 填写
IP地址
和端口号
,然后启用即可。
- 点击开启Debug,显示如下即代表连接上远程Debug。
!!!
版权声明:本文为CSDN博主「One Tester」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37688023/article/details/116403767