This is an automation code written in Python, code is initiated with robotscript. This function validates that my input list matches the list that the program provides me with. I need to do typecasting because robotframework only allows my to insert parameters as unicode strings, typecast is also needed so I can check values within range.
I want to know if this code can be better modified, I'm doing a lot of iteration through list and nested lists. Any comments will be appreciated.
def validate_estimates(expect_coordinates):
""" Validates all Estimates lines that are drawn on display.
input_param: expect_coordinates, which is a list of lists for validation
Values that are collected from the UI need to be typecasted to either time or float
for range check validation.
Function, throws error ir sublists for input and actual values do not match as well if
values from expected lists are not within range.
"""
scene = squishtest.waitForObject("{type='isds::MainView' unnamed='1' visible='1' windowTitle='EdgeView'}")
expect_coordinates_list = ast.literal_eval(expect_coordinates)
measurement_values_list = []
first_iter_special_case = True
for si in squishtest.object.children(scene):
if squishtest.className(si) == 'QGraphicsItem':
if si.type == 65536:
for ssi in squishtest.object.children(si):
for sssi in squishtest.object.children(ssi):
measurement_values = []
try:
qoo = squishtest.castToQObject(ssi)
except Exception, e:
raise AssertionError("Error in typecast: ", e)
if first_iter_special_case:
for i in range(4):
if i == 0:
measurement_values.append(datetime.datetime.strptime(str(qoo.measurementField), '%H:%M')) # time value
elif i == 1 or i == 2:
nm_str = str(qoo.measurementField)
measurement_values.append(float(nm_str[:nm_str.find(' ')]))
elif i == 3:
eet_str = str(qoo.measurementField)
eet_str = eet_str[:eet_str.find(' ')]
measurement_values.append(datetime.datetime.strptime(eet_str, '%H:%M')) # time value
squishtest.mouseClick(squishtest.waitForObject(sssi))
first_iter_special_case = False
else:
for i in range(3):
if i == 0:
measurement_values.append(datetime.datetime.strptime(str(qoo.measurementField), '%H:%M')) # time value
elif i == 1:
nm_str = str(qoo.measurementField)
measurement_values.append(float(nm_str[:nm_str.find(' ')]))
elif i == 2:
eet_str = str(qoo.measurementField)
eet_str = eet_str[:eet_str.find(' ')]
measurement_values.append(datetime.datetime.strptime(eet_str, '%H:%M')) # time value
squishtest.mouseClick(squishtest.waitForObject(sssi))
measurement_values_list.append(measurement_values) # append sublists to list
# list lengths validations
if len(measurement_values_list) != len(expect_coordinates_list):
raise AssertionError('Error list lenghts: Validation list must be of length[%s] not length[%s]' % (len(measurement_values_list), len(expect_coordinates_list)))
for i in range(len(measurement_values_list)):
if len(measurement_values_list[i]) != len(expect_coordinates_list[i]):
raise AssertionError('Error sublist lengths: validation sublist number[%s] is of length[%s] should be of length[%s]' % (i+1, len(expect_coordinates_list[i]), len(measurement_values_list[i])))
# validation of values from isds and our expected values
for i in range(len(measurement_values_list)):
for j in range(len(measurement_values_list[i])):
if type(measurement_values_list[i][j]) is datetime.datetime:
utility_time_in_range(measurement_values_list[i][j], expect_coordinates_list[i][j])
elif isinstance(measurement_values_list[i][j], float):
if not (measurement_values_list[i][j]-30 <= float(expect_coordinates_list[i][j]) <= measurement_values_list[i][j]+30):
raise AssertionError('Error given value[%s] outsite lower boundaries[%s] and uper boundaries[%s]' % (expect_coordinates_list[i][j], measurement_values_list[i][j]-30, measurement_values_list[i][j]+30))
def utility_time_in_range(actual_time, expected_time):
""" Utility function
input_param: actual_time and expected_time.
Verifies that expected_time is within boundraries, otherwise throws out error.
"""
et = datetime.datetime.strptime(expected_time, '%H:%M')
lower_time_boundaries = actual_time - datetime.timedelta(minutes=10)
higher_time_boundaries = actual_time + datetime.timedelta(minutes=10)
if not (lower_time_boundaries <= et <= higher_time_boundaries):
raise AssertionError('Error in time: Given value[%s] outsite lower boundaries[%s] or uper boundaries[%s]' % (expected_time, lower_time_boundaries, higher_time_boundaries))