• 系统测试过程截获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语句

  • 相关阅读:
    一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(一)简介
    常用perl脚本工具
    一步步学习操作系统(2)——在STM32上实现一个可动态加载kernel的"my-boot"
    一步步学习操作系统(1)——参照ucos,在STM32上实现一个简单的多任务(“啰里啰嗦版”)
    一步步学习操作系统(1)——参照ucos,在STM32上实现一个简单的多任务(“精简版”)
    perl的正则表达式
    vim小技巧
    一些方便的bash命令
    Linux磁盘及文件系统管理
    Linux权限扩展
  • 原文地址:https://www.cnblogs.com/jinyz/p/3372204.html
Copyright © 2020-2023  润新知