本主题解释如何在 SOAtest 和 Virtualize 中配置并应用 DB 工具。该工具允许查询数据库 以使用 SOAtest 验证 SQL 语句。

本章包含:

了解 DB 工具

该工具发送请求到指定的数据库,并且返回查询的结果。SOAtest 和/或 Virtualize 将结果格式为 XML;这允许基于 XML 的工具(XML 数据库、XSLT 工具等)链接到输出。

DB 工具可用于调用存储过程(比如,使用 PL./SQL),如 Support for PL/SQL and Stored Procedures中所述。

通讯报文查看器自动附加到每个 DB 工具。它允许查看发送到服务器的查询的最终结果(考虑到参数化、变量等等)。在响应中,将显示与 JDBC 相关的对象。 

配置 DB 工具

可以在 DB 工具中配置以下选项:

常规

  • 数据源:指定用于提供值要使用的数据源。此菜单仅在数据源添加到测试或操作套件时可用。

连接选项卡

有几个选项可以将工具连接到数据库。默认情况下,可以使用文件或指定数据库驱动程序设置来配置本地连接。 

启用 File 选项并浏览文件系统或工作区中的连接配置文件。

启用 Local 选项并指定要查询的数据库的 Driver、 URL、 Username和 Password 。有关配置数据库连接设置的更多详情,请查阅   SOAtest 中的数据库配置参数 Virtualize 中的数据库配置参数

如果只查询数据库一次而不需要等待其他命令,还可以启用 Close connection 选项来关闭连接。当您计划将多个 DB 工具连接到同一个 DB 以便所有工具都可以共享一个连接时,不要启用此选项。共享连接可以提高资源效率,而不是为每个 DB 工具在新连接上使用资源。

如果测试套件具有数据库帐户共享属性,则可以连接  Use Local Settings,Use Shared PropertyUse Both。这些选项允许您只使用相应 DB 工具中的设置、共享全局数据库帐户中的设置(作为全局属性添加到测试套件中的全局数据库设置),或者两者都使用。有关如何定义共享属性并将其导出到文件的详细信息,请查阅 添加全局测试组件属性 在 SOAtest 中或 添加全局属性 在 Virtualize 中。

记得检查流量工具连接 ID

通讯报文工具显示连接 ID。检查这个 ID 将帮助您确保 DB 工具使用相同的连接。

SQL Query

选项卡

  • SQL Query允许指定 FixedParameterized SQL 语句。
    • 如果选中 Fixed ,那么您可以通过输入特殊的字符串 ${column} 到文本框并从 Data Source 下拉菜单选择数据源来进行细粒度参数化。在运行期间,该工具将在指定的数据源中查找列。任何字符串值都可以参数化。
      例如,如果创建了一个数据源,并且有包含 CA、NY 和 WA 的三行,则可以将以下内容输入到 Fixed 文本框中:

      SELECT *
      FROM People
      WHERE state = ’${States}’

      运行时,DB工具将创建以下查询:

      SELECT *
      FROM People
      WHERE state = "CA"

      SELECT *
      FROM People
      WHERE state = "NY"

      SELECT *
      FROM People
      WHERE state = "WA"

      若要访问可编写数据源中的值, 请使用

      ${<Data Source Name>: <Column Name>}

      注意,冒号和 <列名> 之间需要有一个空格。

      若要访问 XML 数据库中的值, 请使用 

      ${<Data Source Column Name mapped to Selected Element>}

  • Separate statements by semicolon (;): 如果启用此选项,工具将用分号分隔 SQL 查询编辑器的内容。有关更多详情信息,请查阅 Statement Separation Behavior
  • Separate statements by Magic Token (typically used for stored procedures):  如果启用此选项,该工具将根据提供的 magic token 字符串划分 SQL 查询编辑器的内容。magic token 是一个字符串,它从一行的开头开始,只包含 magic token(在 token 后面有可选的空格)。有关更多详情信息,请查阅 Statement Separation Behavior
  • JDBC OUT parameter types for stored procedures: 允许调用 OUT 参数或返回值的存储过程和函数。
    • 如果正在执行常规 SQL 查询或没有任何 OUT 参数的存储过程,可以将该字段保留为空。有关更多详情,请查阅下面的 JDBC OUT Parameter Types for Stored Procedures
    • 注意,对于每个 DB 工具,都将相同的 JDBC OUT 参数发送到每个可调用语句。要使用不同的 out 参数,请创建一个单独的 DB 工具。

语句分离行为

使用 Separate statements by semicolon (;),工具将用分号分隔 SQL 查询编辑器的内容。使用 Separate statements by Magic Token (typically used for stored procedures),该工具将根据提供的 magic token 字符串划分 SQL 查询编辑器的内容。magic token 是一个字符串,它从一行的开头开始,只包含 magic token(在 token 后面有可选的空格)。

选择的分隔符(分号或魔法令牌) 不会 发送给服务器。DB 工具将每个分离的子字符串作为具有相同连接的单独 JDBC 调用发送到服务器。这允许一个 DB 工具使用多个查询。根据 SQL 服务器 JDBC 驱动程序的不同,可以在同一个 JDBC 调用中发送多个查询:

  • SQL Server同一个 JDBC 调用中允许多个语句(可选用分号分隔)。
  • MySQL: 要求将“allowMultiQueries=true”添加到 JDBC URL 中,以允许在同一个 JDBC 调用中有多个查询(用分号分隔)。例如 "jdbc:mysql://boa:3306/test?allowMultiQueries=true"。该特性还需要 4.0 或更高版本的 MySQL 驱动程序。
  • DB2:每个 JDBC 调用只接受一条语句。
  • Oracle: 每个 JDBC 调用只接受一条语句。

如果一个 DB 工具需要使用多个语句,那么它们必须用一个魔法令牌分隔(这是由于 DB3 和 Oracle 中的限制)。例如,如果您选择使用一个“GO”(默认)魔法令牌,并输入以下查询字符串进行分隔,那么将发送两个 JDBC 调用,其中每个调用都包含两条 SQL 语句:

create table pr88467(dkey int, svalue varchar(30));
insert into pr88467 (dkey,svalue) values (1,"A"),(2,"B"),(3,"C"); 
GO
select * from pr88467;
drop table pr88467;

在创建或调用存储过程时,必须使用魔法令牌分隔,并且存储过程必须是其组中的唯一语句。在创建过程时,这是必需的,因为过程通常包含所需的嵌套分号,如果使用“使用分号分隔”选项,那么这些嵌套分号将被删除。当调用过程时,它们必须分开,因为 DB 工具需要能够检测它们,并将它们作为 CallableStatement 发送给 JDBC 驱动程序(带有可选的 out 参数)。例如:

create or replace function pr83185_func2(s NUMBER) return SYS_REFCURSOR as mycursor SYS_REFCURSOR;
begin
open mycursor for select * from EMPLOYEES where SALARY > s;
return mycursor;
end;
GO
? = call pr83185_func2(15000)

上面将发出两个 JDBC 调用:

  • 一个用来创建过程。
  • 然后调用过程并获得结果。

Options 选项卡

  • Fail on SQL Exception指定当遇到 SQL 异常时工具是否应该失败。注意,如果将验证工具作为输出链接到此 DB 工具,则验证的结果将决定该工具的成功或失败,而此设置不适用。
  • Auto-commit database changes after running query指定是否要使用自动提交模式。在自动提交模式(默认)下,SQL 查询自动将更改提交到数据库。否则,更改将只在连接期间可见。
  • Rollback database changes after running query指定是否启用回滚。启用此功能后,更改将立即恢复。

    更多关于自动提交和回滚的信息

    自动提交模式取代回滚模式:如果自动提交模式打开,则自动禁用回滚模式。如果希望使数据库更改只在工具使用期间可见,则禁用自动提交模式。如果要在工具中还原更改,请使用回滚选项。

  • XML encoding指定是否对 XML 字符进行编码。默认情况下,XML 值被编码为 unicode 字符。但是您可以选择其中一项以下选项来更改字符的编码方式:
    • 选中 Unicode 来保存 XML 规范支持的所有 unicode 字符。只编码受限制的 XML 字符,如 "<" and "&"。
    • 选中 ASCII 来保护所有 ASCII 字符。编码非 ASCII unicode 字符和受限制的 XML 字符。
    • 选中 None 来禁用 XML 编码。字段值的字符,包括受限制的 XML 字符,将在最终文档中按原样表示。
  • Separate column names from values in the XML output确定列名应与值分开。这可能让人们更难以读取输出,因此默认情况下禁用了它。

  • Use single result format if only one result确定工具如何格式化输出 XML。如果可能,在启用此选项的情况下,结果将不会嵌套在“<results>”xml 标记中。如果有多个结果,那么即使启用了此选项,也将使用多输出格式。

单输出格式:

<updatedRows>0</updatedRows>

多输出格式:

<results>
	<updatedRows>0</updatedRows>
</results> 

使用多个结果: 

<results>
	<updatedRows>0</updatedRows>
	<updatedRows>0</updatedRows>
	<updatedRows>0</updatedRows>
</results>

用于存储过程的 JDBC OUT 参数类型

 JDBC OUT parameter types for stored procedures 字段允许调用提取 OUT 参数或返回值的存储过程和函数。如果正在执行常规 SQL 查询或没有任何 OUT 参数的存储过程,可以将该字段保留为空。

该字段中列出的类型可以用空格或逗号分隔,并且类型名对应于 java.sql.Types (http://docs.oracle.com/javase/8/docs/api/java/sql/Types.html) 或 oracle.jdbc.OracleTypes (http://download.oracle.com/docs/cd/A97329_03/web.902/q20224/oracle/jdbc/OracleTypes.html)类中的字段名 首先查找在 java.sql.Types 中提供的类型。如果没有找到,它将在 oracle.jdbc.OracleTypes 中查找。提供的类型名称将传递给 JDBC CallableStatement.registerOutParameter()。

示例

  • 若要带 4 个 IN 参数的存储过程,请使用 CALL MYPROC(XMLTYPE('<hello>Some XML</hello>'), 55, 'character large object', 'some text')

  • 若要调用带 4 个参数(分别为 Oracle XMLType、INTEGER、CLOB 和 VARCHAR)的存储过程,假设第二个(INTEGER)和第四个(VARCHAR)参数是 OUT 参数,那么提供的 SQL 查询内容分可以如下所示
    CALL MYPROC(XMLTYPE('<hello>some XML</hello>'), ?, 'character large object', ?)
    ,并且 JDBC OUT 参数类型字段将拥有内容
    INTEGER, VARCHAR
  • 若要调用返回 VARCHAR 并且带 5 个 OUT 参数(其类型为 OUT INTEGER, IN INTEGER, Oracle XMLTYPE, Oracle CLOB, VARCHAR 和 DATE)的函数,那么 SQL 查询可以如下所示
    ? = CALL MYFUNCTION(XMLTYPE('<hello>Some XML</hello>'), 'character large object', ?, 33, ?, ?, ?, ?)
    并且 JDBC OUT 参数类型字段将具有
    VARCHAR, INTEGER, SYS.XMLTYPE, CLOB, VARCHAR, DATE
  • 若要调用与上面相同的函数,但对某些参数使用数据源值,请使用
     ? = CALL MYFUNCTION(XMLTYPE('${My CML Content Columna name}'), 'character large object', ?, ${Column Name 2}, ?, ?, ?, ?)
    DB 工具将使用 XML 序列化函数返回值和 OUT 参数,这与常规 SQL 查询的方式类似。这允许您查看执行结果并链接 XML 验证/提取工具(如 XML 断言器和 XML 数据库。
    如果返回值或任何 OUT 参数是 CURSOR 类型,则返回值将作为 JDBC ResultSet 处理,并将其序列化为嵌套在整个结果 XML 中的 XML(与处理常规查询结果的方法相同)。

  • 要调用接受 IN 整数型参数并返回 CURSOR 的函数,可以使用
     ? = CALL MYFUNC(15000)
    ,并且参数类型字段包含
    CURSOR
    。在 CURSOR 返回或 OUT 参数的案例中,DB 工具以 ResultSet XML 格式返回它们,该格式嵌入到 DB 工具的整个 XML 输出中,其中包括与 CURSOR 关联的列名。注意,如果您接收到像 SQLException 这样的消息“类型长度大于最大值”,那么您可能在 Oracle 驱动程序中遇到了一个 bug。如果发生这种情况,请尝试一个更新的 Oracle JDBC 驱动程序。Parasoft 已经证实 ojdbc14.jar 版本 10.2.0.4 没有出现这个问题。

Oracle 类型扩展

Oracle 数据库支持各种专有数据类型。如果数据库使用这些数据类型,则必须将适当的 jar 添加到  类路径(在 Parasoft> JDBC Drivers 下)。

例如,Oracle 支持 oracle.xdb.XMLType。这在 xdb.jar 和 xmlparserv2.jar 中可用,其装载了特定的 Oracle 应用程序。它也可以从 XML Developer's Kit (XDK) Java 中获得,该 Java 位于 http://www.oracle.com (单击 Downloads,单击 XML Developer Kit 的链接,然后选择任何平台的工具包)。注意,这个工具包包含其他文件,但是您只需要上面列出的 2 个文件。 

这两个 jar 都应该添加到首选项面板中的 JDBC 类路径(在 Parasoft> JDBC Drivers 下)。

支持 PL/SQL 和存储过程

由于存储过程可以驱动当今系统的业务逻辑,所以它们需要验证(就像系统中的任何其他组件一样)。还可以存储到 Oracle 数据库的过程(也称为函数、过程、包和触发器)。它还可以反复调用这些过程。这对于需要频繁执行的复杂查询尤其有用。 

PL/SQL(过程语言/结构化查询语言)是 Oracle 数据库中使用的 SQL 数据库语言的专有过程扩展。其他 SQL 数据库管理系统也提供类似的 SQL 语言扩展。

下图展示了如何配置 DB 工具查询(在 SQL Query 选项卡中)来创建或替换存储过程的示例:



下图展示了如何配置 DB 工具查询来调用存储过程的示例:


在通讯报文视图器中查看查询结果

当通讯报文视图器工具附加到 DB 工具上,并且 DB 工具执行“SELECT”语句时,通讯报文视图器工具的响应区域将显示一个包含 DB 查询结果的表。

当 DB 工具执行多个 SQL 语句,并且 XML 响应包含多个结果集时,可以使用组合框(当表中有多个结果集时,在表上方)来确定显示哪个结果集的通讯报文。

这里,通讯报文视图器显示结果集 2 的结果:

  • No labels