使用 JdbcProxy 测试 Java 应用程序(上)

发表于:2008-11-18 16:51

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:郑溪龙、徐方    来源:IBM

#
java

  简介

  JdbcProxy 是 SourceForge 上一个开源的 Java 项目,用 Java 语言编写,遵循 LGPL 和 MPL1.1 协议,由 Frans van Gool 开发,支持 JDBC2.0 规范。通过继承和重写 JDBC2.0 的接口,将一个 Java 应用访问数据库的过程记录在 XML 文件中,并通过这些文件在脱离数据库的情况下重现这个调用过程。 JdbcProxy 可以用在 Java 应用程序的测试中,进行数据准备并模拟数据库调用过程。读者可以从 JdbcProxy 主页 获得最新的程序源代码以及说明文档。目前最新的版本是 1.1 。

  使用 JdbcProxy 代替普通的数据库调用可以满足程序开发、测试人员的很多需求,使准备测试数据的工作变得简单。以文章查询系统为例,有些测试用例需要测试当数据库中没有数据时页面的显示情况--显示没有相应数据的页面;有些测试用例需要测试当数据库中只有一条数据时页面的显示情况--显示文章的内容而不是文章的列表;还有些测试用例需要测试页面的分页效果,这时就需要为程序准备不同的测试数据。如果采用直接连接测试用数据库的方式进行测试,不同的测试用例需要重新准备测试数据库,操作起来比较复杂,也不能同时测试不同的测试场景。如果使用 JdbcProxy,就可以为同一个 Java 程序准备不同的测试用数据文件,测试者可以脱离后端数据库的限制,只需要访问到数据文件就能完成测试。不同测试人员能够彼此不受影响的同时测试这个应用,从而大大简化了准备测试环境的过程。

  使用 JdbcProxy

  JdbcProxy 提供了两种记录 JDBC 调用过程的方式,一种是方便开发人员和测试人员阅读的,另一种是用于回放 JDBC 调用过程的。

  第一种方式主要是为了让开发人员和测试人员能够了解 Java 应用调用 JDBC 的详细信息,当应用程序较为复杂--例如进行了多表查询,采用这种记录方式可以让开发人员和测试人员一目了然的看到应用程序访问数据库的过程。

  第二种方式是为测试程序准备数据的关键步骤之一。为了回放 JDBC 调用过程,JdbcProxy 分别处理应用程序对数据库的每个请求 (request) 与响应 (response),并在指定目录下生成一系列 XML 文件,这些文件是回放 JDBC 调用过程的基础。这些 request/response 文件并不能直接被 JdbcProxy 调用,JdbcProxy 还提供了一个 StubTraceMerger 工具,用来将这些 request/response 文件整合在一个文件中,这个整合的文件就是我们测试 Java 应用所需要的数据文件。

  JdbcProxy 提供了一种通过 HTTP 服务器发送请求并接收响应的机制,这些请求和响应都按照应用程序的 JDBC 调用顺序记录在整合文件中,当 Java 应用试图通过 JDBC 连接数据库时,JdbcProxy 会通过 HTTP 服务器从整合文件中读取相应的数据,模拟调用数据库的过程,使用户得以在脱离数据库的情况下进行 Java 应用的测试。

  因此要想利用 JdbcProxy 测试 Java 应用程序,首先需要生成用于回放 JDBC 调用过程的 request/response 文件,然后将这些 request/response 文件整合在一个文件中,最后将这个整合的数据文件提供给 HTTP 服务器,这样 JdbcProxy 就可以通过 HTTP 服务器访问到数据文件,实现脱离数据库进行测试的目的。

  下面将对 JdbcProxy 提供的每个功能做详细的介绍。

  记录方便开发人员和测试人员阅读的 JDBC 调用过程

  JdbcProxy 可以跟踪 JDBC 调用过程,生成方便开发人员和测试人员阅读的文件格式。在普通的数据库调用中,如果开发人员和测试人员想了解 JDBC 的调用过程,或者需要完整的查看某个 SQL 语句,则需要手工将这些信息打印出来或者记录在日志中。 JdbcProxy 的这个功能就像为 JDBC 的调用过程自动记录了一个日志,开发人员和测试人员可以从日志中获得被调用的每一个方法,以及调用方法的参数和返回值。这样便于开发人员和测试人员发现由于 SQL 语句拼写错误而导致的数据库访问失败,或是由于数据库中没有数据而导致的空指针异常,使应用程序的数据库访问过程更加直观。可以根据清单 1中的示例代码生成 JDBC 调用过程。

  清单 1

  import java.sql.Statement;

  public class JdbcProxyDemo {
  public static void main(String args[]) throws Exception {
  String driver = "nl.griffelservices.proxy.jdbc.oracle.StubTracerDriver";
  String url = "jdbc:tracer::COM.ibm.db2.jdbc.app.DB2Driver:jdbc:db2:SAMPLE";
  Class.forName(driver);
  Connection connection = DriverManager.getConnection(url);
  Statement stmt = connection.createStatement();
  stmt.executeUpdate("DELETE FROM greetings WHERE greeting='Good Night'");//delete
  stmt.executeUpdate("INSERT INTO greetings VALUES('Good Evening')"); //insert
  stmt.executeUpdate("UPDATE greetings SET greeting = 'Good Night'
  WHERE greeting = 'Good Evening'"); //update
  ResultSet rs = stmt.executeQuery("SELECT * FROM greetings");//select
  while (rs.next()) {
  System.out.println(rs.getString("greeting"));
  }
  rs.close();
  stmt.close();
  connection.close();
  }
  }

  与普通数据库调用不同,清单 1中示例程序中所需的数据库驱动是 JdbcProxy 提供的StubTracerDriver,URL 的结构如下:

jdbc:tracer:<filename>:<driver>:<url>

  其中:
   <filename> 是保存结果的文件名;如果为空,结果会被输出到控制台。

   <driver> 是数据库驱动名,该示例程序使用的是 db2 的驱动。

   <url> 是数据源的 URL,该示例程序使用 jdbc:db2:SAMPLE,不需要用户名和密码。

  运行上述程序得到清单 2的记录结果:

  清单 2

 //记录调用 getConnection 方法java.sql.Driver.connect(jdbc:db2:SAMPLE, {}) returns
  DB2Connection
  {
  connectionHandle = 1
  SPConnected = false
  source = SAMPLE
  user =
  conArgs =
  closed = false
  describeCached = false
  describeParam = true
  isReadOnly = false
  autoClose = false
  LONGDATA compat = false
  }

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号