We are building a new experience for our SmartBear Community.
This site is now read-only. You can still browse and search as usual. Learn More
This site is now read-only. You can still browse and search as usual. Learn More
Hi,
Re iterating over a spreadsheet to find a row.
I'm using this table in my Excel lookup spreadsheet.
| CustomerId | Customer Name | Surname | DOB |
| 1 | John | Lennon | 9/10/1940 |
| 2 | Paul | McCartney | 18/6/1942 |
| 3 | George | Harrison | 25/2/1943 |
| 4 | Ringo | Starkey | 7/7/1940 |
To do the lookup, I wrote some Groovy script. I used this page to help me read the Excel spreadsheet... https://www.anilvij.com/how-to-read-data-from-excel-using-groovy-soapui/ in order to write my Groovy script.
Here's the Groovy script you can use as an example. Note : This works for xls files, not xlsx.
import com.eviware.soapui.support.XmlHolder;
import jxl.*;
import jxl.write.*;
// For the sake of example, these are the values returned from your db and these are what we will look for in Excel.
def forename = "George";
def surname = "Harrison";
def dob = "25/2/1943";
Workbook workbook1 = Workbook.getWorkbook(new File("C:\\temp\\CustomerData.xls")) //file containing the data
Sheet sheet1 = workbook1.getSheet(0) //Index 0 will read the first sheet from the workbook, you can also specify the sheet name with "Sheet1"
//Sheet sheet1 = workbook1.getSheet("Sheet1")
size= sheet1.getRows().toInteger() //get the number of rows, each row is a data set
log.info("Number of rows is ${size}.");
// We will use these in our loop.
def found = false;
def row = 0;
log.info("Looking for ${forename} ${surname}");
for (int i = 1; i < size; i++) {
def id = sheet1.getCell(0,i).getContents(); // getCell(column,row) getContents() teases out the value.
def sourceForename = sheet1.getCell(1,i).getContents();
def sourceSurname = sheet1.getCell(2,i) .getContents();
log.info("${id} - ${sourceForename} ${sourceSurname}");
if((forename.equals(sourceForename)) && (surname.equals(sourceSurname))) {
// We've found a match. Let's note the row and break out of loop to save time.
found = true;
row = i;
break;
}
}
if(found){
// Compare DOB
// You don't have to use assert, you could use a boolean check or whatever suits.
assert dob == sheet1.getCell(3,row).getContents();
log.info("DOB is a Match!");
} else {
log.info("Could not find ${sourceForename} ${sourceSurname} in the Excel lookup sheet.");
}
workbook1.close() //close the file
I think it might help if I give a bit more context to the situation.
I work for a financial institution that provides mortgages, so the test cases I'm putting through are test mortgage applications. When I run the XML request (or 'submit the application') it compares my customer's name, DOB and address to the 'Credit Reference Agency' (CRA) data, or the customer database. I don't have direct access to this to be able to reference the DOB's directly from there, which is where the spreadsheet comes in - it calculates the DOB to mirror what will be in the CRA data, so I can use the DOB from the spreadsheet to get a match on my customer from the CRA.
So I want to be able to choose any customer from our list, and for it to cross reference the customer's name with the spreadsheet (which I thought was my Data source but maybe I'm wrong? Sorry I'm very new to this). So I don't necessarily want to pick a random row, I just want it to return the correct DOB whether I choose the customer on row 1, 100 or 1000 (choosing the customer would be 'at random' by me, but not actually randomised in the technical sense of the word).
"What you need is the means to iterate over each row in Excel until you find the matching forename/surname pairing and return the DOB for that."
Yeah, this is exactly what I need.
At times I may run 150 test steps in a row, but other times it may only be a handful of test steps. The same customer information is likely to be used in each test step, but different customers may be used, and some test cases may be testing scenarios with up to 4 applicants, so there will be 4 different DOBs to match.
Sorry again if I still haven't managed to make it fully clear, so far the most advanced thing I've managed to do in ReadyAPI is set custom project properties and reference them in my XML, so I'm very much at a beginner stage!
Hi,
Re iterating over a spreadsheet to find a row.
I'm using this table in my Excel lookup spreadsheet.
| CustomerId | Customer Name | Surname | DOB |
| 1 | John | Lennon | 9/10/1940 |
| 2 | Paul | McCartney | 18/6/1942 |
| 3 | George | Harrison | 25/2/1943 |
| 4 | Ringo | Starkey | 7/7/1940 |
To do the lookup, I wrote some Groovy script. I used this page to help me read the Excel spreadsheet... https://www.anilvij.com/how-to-read-data-from-excel-using-groovy-soapui/ in order to write my Groovy script.
Here's the Groovy script you can use as an example. Note : This works for xls files, not xlsx.
import com.eviware.soapui.support.XmlHolder;
import jxl.*;
import jxl.write.*;
// For the sake of example, these are the values returned from your db and these are what we will look for in Excel.
def forename = "George";
def surname = "Harrison";
def dob = "25/2/1943";
Workbook workbook1 = Workbook.getWorkbook(new File("C:\\temp\\CustomerData.xls")) //file containing the data
Sheet sheet1 = workbook1.getSheet(0) //Index 0 will read the first sheet from the workbook, you can also specify the sheet name with "Sheet1"
//Sheet sheet1 = workbook1.getSheet("Sheet1")
size= sheet1.getRows().toInteger() //get the number of rows, each row is a data set
log.info("Number of rows is ${size}.");
// We will use these in our loop.
def found = false;
def row = 0;
log.info("Looking for ${forename} ${surname}");
for (int i = 1; i < size; i++) {
def id = sheet1.getCell(0,i).getContents(); // getCell(column,row) getContents() teases out the value.
def sourceForename = sheet1.getCell(1,i).getContents();
def sourceSurname = sheet1.getCell(2,i) .getContents();
log.info("${id} - ${sourceForename} ${sourceSurname}");
if((forename.equals(sourceForename)) && (surname.equals(sourceSurname))) {
// We've found a match. Let's note the row and break out of loop to save time.
found = true;
row = i;
break;
}
}
if(found){
// Compare DOB
// You don't have to use assert, you could use a boolean check or whatever suits.
assert dob == sheet1.getCell(3,row).getContents();
log.info("DOB is a Match!");
} else {
log.info("Could not find ${sourceForename} ${sourceSurname} in the Excel lookup sheet.");
}
workbook1.close() //close the file
all cred goes to ChrisAdams 🙂
I dunno, that link gave me the difficult parts.
Thank you both so much for taking the time to respond to this thread, and thanks Chris for the resolution!
A few things have come up at work today meaning I can't implement this right now, but I'll hopefully have time to try it out tomorrow or Monday 😊