系统测试过程截获SQL方法

1      摘要

测试过程中,经常会遇到莫名的各种问题,可能从开发同学的日志无法发现具体出现问题的原因,本着测试同学深入分析、定位问题的目的,经常需要一些额外的手段获得更多的错误异常信息。

我们涉及到(J2EE)系统,经常会出现SQL的问题,包括语法的问题和业务逻辑的问题,所以测试人员需要了解测试业务背后到底做些那些SQL操作,可以通过开源p6spy 组件通过简单的配置完成JAVA相关应用SQL的截取。

适读人群:测试设计师、测试经理、质量保证主管、项目经理

             

2      P6Spy介绍

如果直接用 JDBC 或者是类 iBatis 的东西来访问数据库,那所执行的 SQL 语句是明确的,可以通过调整log4j的相关配置完成,SQL日志的输出,而现在的项目大多会用 ORM 组件,例如 Hibernate、JPA、等都有自己特定的查询语法,最终当然要转换成 SQL 语句的,所以会生成什么样的 SQL 语句就不甚明了,虽然 Hibernate 设置 show_sql=true 时也能打印出生成的 SQL(带?号参数),配合详细的日志参数值也可以对上,但是比较麻烦,大大地影响了测试的速度。

   对于Java应用程序,可以通过开源p6spy 组件完成,它可以拦截所有执行的 SQL 语句,而不管你使用的是什么 ORM 框架,对于 PrepareStatement 那样带参数(?) 的语句,它会帮你代上相应的参数值。

 p6spy 的主页是 http://www.p6spy.com,它支持当前流行的应用服务器,如 JBoss、Orion、Tomcat、WebLogic、WebSphere 等,在 http://www.p6spy.com/documentation/install.htm#install 介绍了 p6spy 的安装。其实不用太在意 p6spy 的安装说明,关键是要了解了某个应用服务器本身,要搞清楚的一个问题是“谁在加载 p6spy 包,从哪里加载”,那么配置 p6spy 就不成问题了,你甚至可以把 p6spy 用在独立的 Java 应用程序中。

 p6spy 可以输出日志到文件中、控制台、或者传递给 Log4j,而且还能配搭 SQL Profiler 或 IronTrackSQL 图形化监控 SQL 语句,监测到哪些语句的执行是耗时的,逐个优化。关于与 SQL Profiler 或 IronTrackSQL 的配合使用可参数文件的链接。

3      安装和实验

  • 软件准备

下载 Tomcat 5 或者 6 进行安装

  下载 p6spy-install.zip,解压缩 p6spy-install.zip,其中有 p6spy.jar 和 spy.properties

  • 拷贝文件

   在 Tomcat 6 下:把 p6spy.jar、classes12.jar、c3p0-0.9.0.2.jar 和 spy.properties 都拷到 $TOMCAT_HOME/lib 目录下。

  • 修改 p6spy 配置文件

打开 $TOMCAT_HOME/lib 或者 $TOMCAT_HOME/common/classes 下的 spy.properties 文件,此文件中本身有很详细的注释,很容易理解其中的配置。

1) 找到 # realdriver=oracle.jdbc.driver.OracleDriver 把前面的 # 注释符去掉,因为我们用的是 Oracle 数据库,即改为

realdriver=oracle.jdbc.driver.OracleDriver

  同时把 realdriver=org.gjt.mm.mysql.Driver 用 # 注释掉,即改为

# realdriver=org.gjt.mm.mysql.Driver

  2) 打开输出过滤,因为我们希望对有些表(如用户表) 的查询不输出相应的 SQL,找到 filter=false,把它改为 filter=true。

   再看它后面有几个配置 include = 、 exclude =  和 sqlexpression = 用来设置过虑规则。例如我们不想输出对 users、constants 表操作的 SQL,就配置

exclude = users,constants

  3) 输出目的地的选择,在 spy.properties 中可以找到

#specifies the appender to use for logging

#appender=com.p6spy.engine.logging.appender.Log4jLogger

#appender=com.p6spy.engine.logging.appender.StdoutLogger

appender=com.p6spy.engine.logging.appender.FileLogger

  分别是输出到 Log4j、控制台和文件中,如果是输出到控制台的话,就让 appender=com.p6spy.engine.logging.appender.StdoutLogger 有效,其他两个注释掉。

  如果你配置的是默认的 appender=com.p6spy.engine.logging.appender.FileLogger,那么它下面的 logfile = spy.log 就是指定要输出的日志文件,这个文件会生成在 System.getProperty("user.dir") 目录中,即 $TOMCAT_HOME/bin 目录中,你可以让它生成到 $TOMCAT_HOME/logs 目录中,就写成

logfile = ../logs/spy.log

  如果是让 SQL 语句输出到日志文件的话,append=true,会较重要,为 true 时为附加,spy.log 会变得很大,否则为每次 Tomcat 重启后生成新的文件。

需留意一下最后的有关使用 Log4j 输出的配置

  • 修改 spring-jdbc.xml

使 <property>    <value>oracle.jdbc.driver.OracleDriver</value> </property>

改成

<property><value> com.p6spy.engine.spy.P6SpyDriver </value></property>

通过以上三个步骤就可以运行测试脚本,在spy.log文件中就可以看到程序运行时所执行的sql语句

原文地址:https://www.cnblogs.com/jinyz/p/3372204.html