- Test Script Synchronization
- Placing a Generic Delay in Your Script
- Waiting for Test Objects to Come into Existence
- Timing How Long Something Takes to Execute in a Script
- Working with Test Objects
- Working with the Clipboard Object
- Viewing an Objects Properties
- Retrieving All Properties of a Test Object
- Retrieving the Value of a Single Property
- Programmatically Retrieving Data from an Object in My Application
- Determining a Test Objects Valid Test Data Type Arguments to getTestData()
- Using getTestData to Extract Data from a Text Field
- Using getTestData to Extract Data from a List
- Using getTestData() to Read Data in a Table
- Using getTestData() to Extract Data from a Tree
- Obtaining Data from a Test Object That the Rational Functional Tester Verification Point Wizard Does Not Capture
- Creating a Custom Verification Point
- Changing the Value of a Test Objects Property
- Evolving Custom Scripting into Reusable Methods
- Summary
Using getTestData() to Extract Data from a Tree
From a test data type perspective, trees are simple. There are only two test data types: tree and selected.
Table 3.7 Tree Object Data Types
Data Type |
Return Type |
Comments |
Tree |
ItestDataTree |
Retrieves the entire tree hierarchy. |
selected |
ItestDataTree |
Retrieves the selected tree nodes. |
Tree Talk
There’s a special vocabulary used with trees with which you might not be familiar. A tree consists of elements referred to as nodes. Each node can have a parent, siblings, and children. A node that has no parent is called a root node. A tree can have one root node (the Classics music tree) or multiple root nodes (the tree in the Rational Functional Tester Preferences dialog box). A node that has no children is called a leaf or terminal node.
In the Classics music tree, Composers is the root node. Composers has no siblings. Its children are Schubert, Haydn, Bach, Beethoven, and Mozart. Mozart has three children. Symphony No. 34 has no children and is therefore a leaf node.
Before continuing, you need to clarify what is returned with respect to selected tree nodes. If you click Bach’s Violin Concertos in Classics, it is the selected node. You might think that in this scenario if you get selected data from the tree, just Violin Concertos will be returned. This is not the case. To see what getTestData() returns, insert a Data verification point on the tree with Bach’s Violin Concertos selected and select Selected tree hierarchy. You see something similar to what is displayed in Figure 3.22.
Notice that Rational Functional Tester captures the selected element along with its ancestor nodes all the way up to the root node. If multiple nodes are selected (hold down the Ctrl key and select Symphony No. 9 and Mozart’s Symphony in C, No. 41: Jupiter), the selected tree hierarchy would look like Figure 3.23.
Table 3.8 lists the interfaces for accessing tree data and the commonly used methods in each interface.
Table 3.8 Interfaces and Their Methods Used for Accessing Trees
Interface |
Methods |
ITestDataTree |
ITestDataTreeNodes getTreeNodes() |
ITestDataTree Nodes |
int getNodeCount() int getRootNodeCount() ITestDataTree Node[] getRootNodes() |
ITestDataTree Node |
int getChildCount() ItestDataTreeNode[] getChildren() ItestDataTreeNode getParent() Object getNode() |
The following steps can be used as a generic template for acquiring the root nodes of a tree control.
- Call the tree control’s getTestData() method. The data will be returned as an ITestDataTree interface.
- On the ITestDataTree reference, call getTreeNodes(). This returns the data as an ITestDataTreeNodes interface.
Note that if you want to get to the selected leaf nodes in the tree, you need to start at the top of the tree and traverse down to them (such as using some sort of loop). To get to the top of a tree, call getRootNodes(), which returns an array of individual ITestDataTreeNodes. It returns an array because depending on the tree, there can be more than one root node.
Also note that after you have the data contained in an ITestDataTreeNodes interface, you can find out how many nodes are in the data returned by calling getNodeCount(). It’s important to note that getNodeCount() doesn’t necessarily return the number of nodes in the test object; it returns the number of nodes in the data returned by the initial call to getTestData(). If you pass getTestData() an argument of tree, it returns the total number of nodes in the tree (for example, the Composer tree in Classics returns 20 nodes). If you pass an argument of selected, it returns the number of nodes in the selected tree hierarchy. If Bach Violin Concertos is selected, it returns three (because the nodes returned are Composers > Bach > Violin Concertos).
- As listed in Table 3.8, there are three key methods you can invoke on an ITestDataTreeNode. getNode() returns the node data as an Object. Thus, if you call getNode() on the first (and only) root node and cast that to a string, you can print it out (or more likely store it in a variable for further processing).
Listing 3.11 provides two examples—one Java and one VB.NET—that exemplify the previous template steps.
Listing 3.11. Printing a tree’s root nodes
Java public void printRootNodes( TestObject tree ) { String selectedNode = null; ITestDataTree iTreeData = (ITestDataTree)tree.getTestData("selected"); ITestDataTreeNodes iNodes = iTreeData.getTreeNodes(); ITestDataTreeNode[] rootNodes = iNodes.getRootNodes(); for(int i = 0; i < rootNodes.length; i++) { String nodeData = rootNodes[i].getNode().toString(); System.out.println( nodeData ); } }
VB.NET Public Sub printRootNodes(ByVal tree As TestObject) Dim selectedNode As String = Nothing Dim iTreeData As ITestDataTree = tree.GetTestData("tree") Dim iNodes As ITestDataTreeNodes = iTreeData.GetTreeNodes() Dim rootNodes As ITestDataTreeNode() = iNodes.GetRootNodes() For i As Integer = 0 To rootNodes.length - 1 Dim nodeData As String = rootNodes(i).GetNode.ToString Console.WriteLine( nodeData ) Next End Sub
The next code sample in Listing 3.12 builds off the prior steps. In particular, after you acquire the root node as an ITestDataTreeNode, you can start traversing it. To descend one level, call getChildren(). This returns the ITestDataTreeNode’s children (in the returned data, not the test object) as an array of ITestDataTreeNodes. Note that the data type of the root nodes is the same as any other node in a tree, namely ITestDataTreeNode. After you have the array of child ITestDataTreeNodes, you can acquire their data, using the getNode() method and casting it to a string—similar to what was accomplished in Listing 3.11.
Listing 3.12. Get the text of the selected node in a tree
Java public String getSelectedTreeNode( TestObject tree ) { String selectedNode = null; ITestDataTree iTreeData = (ITestDataTree)tree.getTestData("selected"); ITestDataTreeNodes iNodes = iTreeData.getTreeNodes(); int nodeCount = iNodes.getNodeCount(); System.out.println("node count = " + nodeCount); if( nodeCount != 0) { ITestDataTreeNode[] node = iNodes.getRootNodes(); for(int i = 0; i < nodeCount - 1; i++) { ITestDataTreeNode[] children = node[0].getChildren(); node = children; } selectedNode = node[0].getNode().toString(); } return selectedNode; }
VB.NET Public Function getSelectedTreeNode(ByVal tree As TestObject) As String Dim selectedNode As String = Nothing Dim iTreeData As ITestDataTree = tree.GetTestData("selected") Dim iNodes As ITestDataTreeNodes = iTreeData.GetTreeNodes() Dim nodeCount As Integer = iNodes.GetNodeCount() Console.WriteLine("Nodecount = " + nodeCount.ToString) If (nodeCount <> 0) Then Dim node As ITestDataTreeNode() = iNodes.GetRootNodes() For i As Integer = 1 To nodeCount - 1 Dim children As ITestDataTreeNode() = node(0).GetChildren() node = children Next selectedNode = node(0).GetNode().ToString() End If Return selectedNode End Function