Newbie: Control flow of tests using 'define_method'

C

Chris Cropleu

I am very new to development and even more in the dark when it comes to
Ruby, but I am still having fun. ;-) I also apologise for the long
snippets of code in this post.

I am trying to test a database migration using Ruby and the built in
Test framework.

I am stuck however on a particular problem and it relates to control
flow and the dynamic use of 'define_method' to create multiple Tests if
an assert_equal 'fails' thus jumping out of a loop and stopping all
future tests.

I found what I thought was the solution from this post:

http://www.ruby-forum.com/topic/204730

One I notice however is it will not execute the define_method block
until it has executed all of the exterior loops.

My code is as follows:

class TestSuite < Test::Unit::TestCase

#Build a hash of Source Database columns and target Database columns

companyRRAccessToBeacon = Hash.new
companyRRAccessToBeacon['company_id'] = 'ID'
cmpanyRRAccessToBeacon['ultimate_parent_id'] = 'GlobalUltimateID'
companyRRAccessToBeacon['fullname'] = 'Name'
companyRRAccessToBeacon['turnover_curr'] = 'TurnoverCurrencyTypeID'
companyRRAccessToBeacon['turnover'] = 'TurnoverAmount'
companyRRAccessToBeacon['u_size_code'] = 'CorporateSizeTypeID'
companyRRAccessToBeacon['corp_status_id'] =
'CorporateOwnershipTypeID'
companyRRAccessToBeacon['created_user'] = 'RowCreatedBy'
companyRRAccessToBeacon['created_datetime'] = 'RowCreatedDate'
companyRRAccessToBeacon['last_modification_by'] = 'RowModifiedBy'
companyRRAccessToBeacon['last_modification_date'] =
'RowModifiedDate'
companyRRAccessToBeacon['off_limits_id'] = 'OffLimitsID'

#Connect to the RRAccess and Beacon databases
rraccesshandle = connectrraccessdb
beaconhandle = connectbeacondb


#Companyrowdata stores the Data Driven tests used for the test
below.
companyrowData =
getXlsRowData("C:\\Users\\ecucropc\\Documents\\Visual Studio
2008\\Projects\\DataSynchronisation\\DataSynchronisation\\Company
Data.xls", "Company", "A1:L3")

#Loop through each record returned in the Data Driven Test set.
companyrowData.each do | companydata |
puts "In #{companydata} loop"
#If no Company records are returned then run the test.
companydata["company_id"] != ""
recordtofetch = companydata["company_id"]

#Get the common RRAccess Company columns
sqlRRaccessValues = (getDBValue(rraccesshandle, "select
company_id, ultimate_parent_id, fullname, turnover_curr, turnover,
U_Size_Code, corp_status_id, created_user, created_datetime,
last_modification_by, last_modification_date, off_limits_id from
RRAccessLive.Company WHERE Company_id = ?", recordtofetch))

#Get the common Beacon Company columns
sqlBeaconValues = (getDBValue(beaconhandle, "select ID,
GlobalUltimateID, Name, TurnoverCurrencyTypeID, TurnoverAmount,
CorporateSizeTypeID, CorporateOwnershipTypeID, RowCreatedBy,
RowCreatedDate, RowModifiedBy, RowModifiedDate, OffLimitsID from
BeaconLive.Company WHERE ID = ?", recordtofetch))

#For each HashMap pair get the values from the RRAccess and Beacon
databases and then
#loop through and perform the comparison test.

companyRRAccessToBeacon.each {|key, value|
puts "Inside each loop #{companyRRAccessToBeacon[key]}"
rrAccessColumnValue = sqlRRaccessValues[key]
rrBeaconColumnValue = sqlBeaconValues[value]

#This dynamic define_method is used to create many tests.

define_method ("test_company_" + companyRRAccessToBeacon[key])
do
puts "Inside assert_equal loop for
test_company_#{companyRRAccessToBeacon[key]}"
assert_equal sqlRRaccessValues[key], sqlBeaconValues[value]
end
}
end
end


The output of this is as follows:

In off_limits_idFturnover_currUSDlast_modification_date2008/06/25
11:10:00corp_status_idQUOcreated_user2000734ultimate_parent_id1fullnameAAR
CorporationU_Size_Code1last_modification_by40000347turnover1061169created_datetime1988/10/17
00:00:00company_id1 loop
Inside each loop OffLimitsID
Inside each loop TurnoverCurrencyTypeID
Inside each loop RowModifiedDate
Inside each loop CorporateOwnershipTypeID
Inside each loop RowCreatedBy
Inside each loop GlobalUltimateID
Inside each loop Name
Inside each loop CorporateSizeTypeID
Inside each loop RowModifiedBy
Inside each loop TurnoverAmount
Inside each loop RowCreatedDate
Inside each loop ID
In off_limits_idCturnover_currUSDlast_modification_date2009/12/01
14:51:00corp_status_idQUOcreated_user9999999ultimate_parent_id2fullnameAbbott
LaboratoriesU_Size_Code1last_modification_by40001040turnover22476322created_datetime1978/01/01
00:00:00company_id2 loop
Inside each loop OffLimitsID
Inside each loop TurnoverCurrencyTypeID
Inside each loop RowModifiedDate
Inside each loop CorporateOwnershipTypeID
Inside each loop RowCreatedBy
Inside each loop GlobalUltimateID
Inside each loop Name
Inside each loop CorporateSizeTypeID
Inside each loop RowModifiedBy
Inside each loop TurnoverAmount
Inside each loop RowCreatedDate
Inside each loop ID
In off_limits_idFturnover_currUSDlast_modification_date2008/06/25
11:10:00corp_status_idQUOcreated_user2000734ultimate_parent_id1fullnameAAR
CorporationU_Size_Code1last_modification_by40000347turnover1061169created_datetime1988/10/17
00:00:00company_id1 loop
Inside each loop OffLimitsID
Inside each loop TurnoverCurrencyTypeID
Inside each loop RowModifiedDate
Inside each loop CorporateOwnershipTypeID
Inside each loop RowCreatedBy
Inside each loop GlobalUltimateID
Inside each loop Name
Inside each loop CorporateSizeTypeID
Inside each loop RowModifiedBy
Inside each loop TurnoverAmount
Inside each loop RowCreatedDate
Inside each loop ID
In off_limits_idCturnover_currUSDlast_modification_date2009/12/01
14:51:00corp_status_idQUOcreated_user9999999ultimate_parent_id2fullnameAbbott
LaboratoriesU_Size_Code1last_modification_by40001040turnover22476322created_datetime1978/01/01
00:00:00company_id2 loop
Inside each loop OffLimitsID
Inside each loop TurnoverCurrencyTypeID
Inside each loop RowModifiedDate
Inside each loop CorporateOwnershipTypeID
Inside each loop RowCreatedBy
Inside each loop GlobalUltimateID
Inside each loop Name
Inside each loop CorporateSizeTypeID
Inside each loop RowModifiedBy
Inside each loop TurnoverAmount
Inside each loop RowCreatedDate
Inside each loop ID
Loaded suite C:/Users/ecucropc/Documents/Visual Studio
2008/Projects/DataSynchronisation/DataSynchronisation/CommonTest
Started
Inside assert_equal loop for test_company_CorporateOwnershipTypeID
FInside assert_equal loop for test_company_CorporateSizeTypeID
FInside assert_equal loop for test_company_GlobalUltimateID
Inside assert_equal loop for test_company_ID
Inside assert_equal loop for test_company_Name
Inside assert_equal loop for test_company_OffLimitsID
FInside assert_equal loop for test_company_RowCreatedBy
Inside assert_equal loop for test_company_RowCreatedDate
Inside assert_equal loop for test_company_RowModifiedBy
Inside assert_equal loop for test_company_RowModifiedDate
Inside assert_equal loop for test_company_TurnoverAmount
Inside assert_equal loop for test_company_TurnoverCurrencyTypeID
F
Finished in 0.029 seconds.

1) Failure:
test_company_CorporateOwnershipTypeID(TestSuite)
[C:/Users/ecucropc/Documents/Visual Studio
2008/Projects/DataSynchronisation/DataSynchronisation/CommonTest.rb:57]:
<"QUO "> expected but was
<1>.

2) Failure:
test_company_CorporateSizeTypeID(TestSuite)
[C:/Users/ecucropc/Documents/Visual Studio
2008/Projects/DataSynchronisation/DataSynchronisation/CommonTest.rb:57]:
<nil> expected but was
<1>.

3) Failure:
test_company_OffLimitsID(TestSuite) [C:/Users/ecucropc/Documents/Visual
Studio
2008/Projects/DataSynchronisation/DataSynchronisation/CommonTest.rb:57]:
<"C"> expected but was
<nil>.

4) Failure:
test_company_TurnoverCurrencyTypeID(TestSuite)
[C:/Users/ecucropc/Documents/Visual Studio
2008/Projects/DataSynchronisation/DataSynchronisation/CommonTest.rb:57]:
<"USD"> expected but was
<166>.

12 tests, 12 assertions, 4 failures, 0 errors


If I comment out the 'define_method' block of code, it will continue
where I was expecting it to go.

Any help would be greatly appreciated.
 
A

Aldric Giacomoni

Chris said:
class TestSuite < Test::Unit::TestCase

#Build a hash of Source Database columns and target Database columns

companyRRAccessToBeacon = Hash.new
companyRRAccessToBeacon['company_id'] = 'ID'
cmpanyRRAccessToBeacon['ultimate_parent_id'] = 'GlobalUltimateID'
companyRRAccessToBeacon['fullname'] = 'Name'
companyRRAccessToBeacon['turnover_curr'] = 'TurnoverCurrencyTypeID'
companyRRAccessToBeacon['turnover'] = 'TurnoverAmount'
companyRRAccessToBeacon['u_size_code'] = 'CorporateSizeTypeID'
companyRRAccessToBeacon['corp_status_id'] =
'CorporateOwnershipTypeID'
companyRRAccessToBeacon['created_user'] = 'RowCreatedBy'
companyRRAccessToBeacon['created_datetime'] = 'RowCreatedDate'
companyRRAccessToBeacon['last_modification_by'] = 'RowModifiedBy'
companyRRAccessToBeacon['last_modification_date'] =
'RowModifiedDate'
companyRRAccessToBeacon['off_limits_id'] = 'OffLimitsID'
Wowzer. How about this?
companyRRAccessToBeacon = {'company_id' => 'ID', 'ultimate_parent_id' =>
'GlobalUltimateID' }
And so on and so forth ? A little cleaner, a little easier to read,
fewer repetitions.
#Connect to the RRAccess and Beacon databases
rraccesshandle = connectrraccessdb
beaconhandle = connectbeacondb

[...]

#Loop through each record returned in the Data Driven Test set.
companyrowData.each do | companydata |
puts "In #{companydata} loop"
#If no Company records are returned then run the test.
companydata["company_id"] != ""
recordtofetch = companydata["company_id"]

Where is your if statement? Maybe you mean this?
recordtofetch = companydata['company_id'] unless
companydata['company_id'].empty?
[...]


The output of this is as follows:
[...]
Inside assert_equal loop for test_company_CorporateOwnershipTypeID
FInside assert_equal loop for test_company_CorporateSizeTypeID
FInside assert_equal loop for test_company_GlobalUltimateID
.Inside assert_equal loop for test_company_ID
.Inside assert_equal loop for test_company_Name
.Inside assert_equal loop for test_company_OffLimitsID
FInside assert_equal loop for test_company_RowCreatedBy
.Inside assert_equal loop for test_company_RowCreatedDate
.Inside assert_equal loop for test_company_RowModifiedBy
.Inside assert_equal loop for test_company_RowModifiedDate
.Inside assert_equal loop for test_company_TurnoverAmount
.Inside assert_equal loop for test_company_TurnoverCurrencyTypeID
F
Finished in 0.029 seconds.

1) Failure:
test_company_CorporateOwnershipTypeID(TestSuite)
[C:/Users/ecucropc/Documents/Visual Studio
2008/Projects/DataSynchronisation/DataSynchronisation/CommonTest.rb:57]:
<"QUO "> expected but was
<1>.

Well, in your first test, you get a '1' back and you apparently expect a
"QUO ".
Anything else the errors can tell you that they can't tell us?
Look into this and get back to us a little later.. The tests work,
they're telling you that they fail :)
 
C

Chris Cropleu

Aldric said:
Chris said:
class TestSuite < Test::Unit::TestCase

#Build a hash of Source Database columns and target Database columns

companyRRAccessToBeacon = Hash.new
companyRRAccessToBeacon['company_id'] = 'ID'
cmpanyRRAccessToBeacon['ultimate_parent_id'] = 'GlobalUltimateID'
companyRRAccessToBeacon['fullname'] = 'Name'
companyRRAccessToBeacon['turnover_curr'] = 'TurnoverCurrencyTypeID'
companyRRAccessToBeacon['turnover'] = 'TurnoverAmount'
companyRRAccessToBeacon['u_size_code'] = 'CorporateSizeTypeID'
companyRRAccessToBeacon['corp_status_id'] =
'CorporateOwnershipTypeID'
companyRRAccessToBeacon['created_user'] = 'RowCreatedBy'
companyRRAccessToBeacon['created_datetime'] = 'RowCreatedDate'
companyRRAccessToBeacon['last_modification_by'] = 'RowModifiedBy'
companyRRAccessToBeacon['last_modification_date'] =
'RowModifiedDate'
companyRRAccessToBeacon['off_limits_id'] = 'OffLimitsID'
Wowzer. How about this?
companyRRAccessToBeacon = {'company_id' => 'ID', 'ultimate_parent_id' =>
'GlobalUltimateID' }
And so on and so forth ? A little cleaner, a little easier to read,
fewer repetitions.
#Connect to the RRAccess and Beacon databases
rraccesshandle = connectrraccessdb
beaconhandle = connectbeacondb

[...]

#Loop through each record returned in the Data Driven Test set.
companyrowData.each do | companydata |
puts "In #{companydata} loop"
#If no Company records are returned then run the test.
companydata["company_id"] != ""
recordtofetch = companydata["company_id"]

Where is your if statement? Maybe you mean this?
recordtofetch = companydata['company_id'] unless
companydata['company_id'].empty?
[...]


The output of this is as follows:
[...]
Inside assert_equal loop for test_company_CorporateOwnershipTypeID
FInside assert_equal loop for test_company_CorporateSizeTypeID
FInside assert_equal loop for test_company_GlobalUltimateID
.Inside assert_equal loop for test_company_ID
.Inside assert_equal loop for test_company_Name
.Inside assert_equal loop for test_company_OffLimitsID
FInside assert_equal loop for test_company_RowCreatedBy
.Inside assert_equal loop for test_company_RowCreatedDate
.Inside assert_equal loop for test_company_RowModifiedBy
.Inside assert_equal loop for test_company_RowModifiedDate
.Inside assert_equal loop for test_company_TurnoverAmount
.Inside assert_equal loop for test_company_TurnoverCurrencyTypeID
F
Finished in 0.029 seconds.

1) Failure:
test_company_CorporateOwnershipTypeID(TestSuite)
[C:/Users/ecucropc/Documents/Visual Studio
2008/Projects/DataSynchronisation/DataSynchronisation/CommonTest.rb:57]:
<"QUO "> expected but was
<1>.

Well, in your first test, you get a '1' back and you apparently expect a
"QUO ".
Anything else the errors can tell you that they can't tell us?
Look into this and get back to us a little later.. The tests work,
they're telling you that they fail :)

Thanks for your feedback. You are quite right, the assertion is giving
me the failures I was expecting, however my rather large code snippet
probably did not highlight my particular problem in the loop control I
was trying to describe.

I have since spoken with some wiser heads (namely the developers on the
team) and they suggested a good method for me to move forward on this.

I have now captured the column differences (if there are any) in a hash
and the put that hash into an assert_nil test.

Much cleaner and I only need to run one test as opposed to the potential
hundreds in my original solution.

Regards,

Chris
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,770
Messages
2,569,584
Members
45,075
Latest member
MakersCBDBloodSupport

Latest Threads

Top