Minimize
Blogger List

Johannes Ahrends
Toad and Oracle

Ben Boise
Toad SC Discussions

Kevin Dalton
Benchmark Factory

Steven Feuerstein
PL/SQL Obsession

Devin Gallagher
Toad SC discussions

Stuart Hodgins
JProbe Discussions

  Henrik "Mauritz" Johnson
Toad Tips & Tricks on the "other" Toads
  Mark Kurtz
Toad SC discussions
  Michael Lumbard
Toad SC discussions
Daniel Norwood
Toad for Data Analysts,
Toad Extension for Visual Studio
Debbie Peabody
Toad for Data Analysts
Gary Piper
Toad Reports Manager
John Pocknell
Toad for Oracle, JProbe
Kuljit Sangha
Toad SC discussions
Bert Scalzo Indicates Oracle ACE status
Toad for Oracle, Data Modeling, Benchmarking
Jeff Smith
Toad product family
Richard To
SQL Optimization
Jim Wankowski
DB2 - LUW and z/OS
John Weathington
  Toad Data Modeler Opens in a new window
Data Modeling
 
  Real Automated Code Testing for Oracle
Quest Code Tester blog
 
Minimize
Blog Tags
toad for oracle (122)
oracle (62)
plsql (46)
sql optimization (37)
toad for data analysts (28)
code tester (19)
toad for ibm db2 (13)
automation (11)
batch optimizer (10)
virtualization (10)
schema browser (9)
toad for sql server (9)
data grid (8)
sql (8)
sql editor (8)
toad data modeler (8)
benchmark factory (7)
excel (7)
query builder (7)
report manager (7)
toad extension (7)
visual studio (7)
11g (6)
configuration (6)
freeware (6)
health check (6)
vmware (6)
connect (5)
dba module (5)
er diagrammer (5)
F4 (5)
linux (5)
refactoring (5)
spotlight (5)
unicode (5)
compare (4)
debugger (4)
export (4)
formatter (4)
make code (4)
rman (4)
strip code (4)
benchmark (3)
bfscript (3)
bulk collect (3)
code templates (3)
code xpert (3)
database browser (3)
db2 (3)
notebook (3)
oem (3)
RAC (3)
session browser (3)
speed (3)
sql optimizer (3)
toad for mysql (3)
tpc-c (3)
9.7 (2)
alert log (2)
app designer (2)
awr (2)
code insight (2)
code snippets (2)
collection (2)
compare and sync (2)
compliance (2)
data generator (2)
data warehouse (2)
database explorer (2)
database monitor (2)
explain (2)
forall (2)
ftp (2)
group execute (2)
handbook (2)
installation (2)
job scheduler (2)
multi-task (2)
nested table (2)
os command (2)
profiler (2)
recovery (2)
release history (2)
save as (2)
schema compare (2)
sql recall (2)
stats pack (2)
subversion (2)
team coding (2)
trace file browser (2)
while loop (2)
10g (1)
64 bit (1)
7zip (1)
action (1)
addm (1)
alter (1)
ansi join (1)
array (1)
ccleaner (1)
code coverage (1)
code road map (1)
CRON (1)
cursor for loop (1)
data browser (1)
data subset (1)
database probe (1)
dbms_flashback (1)
dbms_profiler (1)
ddl (1)
feuerstein (1)
filezilla (1)
flash drive (1)
flow control (1)
for loop (1)
group policy manager (1)
hints (1)
import (1)
index (1)
inheritance (1)
invoker rights (1)
ipad (1)
java (1)
latency (1)
log switch (1)
logical model (1)
ltrim (1)
master-detail browser (1)
monitor (1)
multi-select (1)
naming standards (1)
network (1)
object explorer (1)
OEBS (1)
package (1)
parser (1)
partitioning (1)
performance (1)
pragma (1)
project manager (1)
RAT (1)
revo (1)
REXEC (1)
schema report (1)
script manager (1)
search (1)
set operator (1)
sga (1)
slow (1)
sonarsource (1)
source control (1)
space projection (1)
sql monitor (1)
sql navigator (1)
sql script (1)
sql tracker (1)
sql*plus (1)
standards (1)
statistics (1)
stored procedure (1)
string parser (1)
sub-model (1)
sub-type (1)
synch (1)
synchback (1)
TELNET (1)
toad (1)
trace (1)
unit test (1)
unix (1)
usb (1)
utility (1)
v10 (1)
v9.5 (1)
version control (1)
waits (1)
workload replay (1)
workspace (1)
xml (1)
 
WELCOME, GUEST
 
 

Blogs
Toad and Database Commentaries

Toad World blogs are a mix of insightful how-tos from Quest experts as well as their commentary on experiences with new database technologies.  Have some views of your own to share?  Post your comments!  Note:  Comments are restricted to registered Toad World users.

Do you have a topic that you'd like discussed?  We'd love to hear from you.  Send us your idea for a blog topic.


Dec 21

Written by: QCTO Blog
Monday, December 21, 2009  RssIcon

Sometimes you need to reference the value of an IN argument (an input, in Code Tester terminology) in your outcome. For example, under certain circumstances, the string returned by your function should be the same as the input value. Or perhaps the out value should be some part of the input value.

You could hard-code the same value you supplied in the Input Grid, but then if you change the input value, you have to change the outcome value as well. That's not a great solution.

Code Tester instead gives you two different ways to reference the input value indirectly:
  1. Functions in the qu_result_xp package that accept the name of the argument and returns it value
  2. Reference the name of the variable that Code Tester will declare and then assign the IN value to it before the program is run.

Let's take a look at both these techniques for a very simple example. Suppose I want to test this function:

FUNCTION first_three (string_in IN VARCHAR2) RETURN VARCHAR2
IS
BEGIN
   RETURN SUBSTR (
string_in, 1, 3);
END;

I start up Test Builder and create a new test case. I enter "abcdefg" in the input grid for string. I will also open up the Properties Window for that input.

I see this:

Notice the variable name "i_STRING_IN." That is the name of the variable that will be used to store the input value and pass it to first_three. You can change this to anything you like, but the default is usually fine.

OK, now let's shift focus to the Outcome side of the test case. The function is supposed to return a string that is just a portion of the input value (first three characters). I could therefore create an outcome like this:

 But this only proves that the correct value is returned for this one string ("abcdefg"). And, as noted above, if I ever want to change the input value, I must change the outcome value as well.

Instead of hard-coding the return value, I can open the Properties Window for the outcome's expected result:

and then in the "Expression of Query" field I can enter either of the following:
SUBSTR (i_String_in, 1, 3)
or
SUBSTR (qu_result_xp.argval_varchar2 ('STRING_IN'), 1, 3)

The first approach simply relies on the name of the input variable remaining "i_string_in." The second approach relies on the underlying API in the qu_result_xp package to look up the value of the IN argument with the specified name.

More generally, the API approach can be described as: when you want to get the value of an IN argument for a test case, you will call a program of this form:

qu_result_xp.argval_ < datatype > ('< argument_name >')

All of the following are currently supported:

FUNCTION argval_varchar2 (argument_name_in IN VARCHAR2) RETURN VARCHAR2;
FUNCTION argval_clob (argument_name_in IN VARCHAR2) RETURN CLOB;
FUNCTION argval_date (argument_name_in IN VARCHAR2) RETURN DATE;
FUNCTION argval_number (argument_name_in IN VARCHAR2) RETURN NUMBER;
FUNCTION argval_boolean (argument_name_in IN VARCHAR2) RETURN BOOLEAN;
FUNCTION argval_timestamp (argument_name_in IN VARCHAR2) RETURN TIMESTAMP;
FUNCTION argval_timestamp_tz (argument_name_in IN VARCHAR2)
   RETURN TIMESTAMP WITH TIME ZONE
;
FUNCTION argval_timestamp_ltz (argument_name_in IN VARCHAR2)
   RETURN TIMESTAMP WITH LOCAL TIME ZONE
;
FUNCTION argval_interval_ds (argument_name_in IN VARCHAR2)
   RETURN INTERVAL DAY TO SECOND
;

When you pass the name of the argument, be sure to use a case that matches the actual argument name. In other words, unless the argument name is contained within double quotes, pass the argument name as UPPER CASE.

Another advantage of referencing the input value by name, rather than by the hard-coded value, is that you can use random values or lists of values to dynamically generate many different inputs (and therefore different test cases), all with the same/single outcome.

Consider the testing of first_three. So far I have built a single test case for a specific input value of "abcdefg". I am reassured that I get the right answer for that one value, but I'd feel lots more confident if I could "throw" lots of different strings at it and ensure that in all cases, the function returned the correct answer.

To do this, I can go back to the input for the test case and change the value from a single literal to a randomly generated list of, say, 100 strings with lengths varying from 10 to 32767:

And now every time I run my test, Code Tester will generate 100 new strings and run first_three for each. You see the partial results below:

I hope this gives you a clear understanding of how you can reference IN argument values by name, and make your test cases that much more flexible and useful.
 


Your name:
Gravatar Preview
Your email:
(Optional) Email used only to show Gravatar.
Your website:
Title:
Comment:
Add Comment   Cancel 
Search Blog Entries