[Erp5-report] r9627 - /erp5/trunk/utils/erp5mechanize/userperzope.py

nobody at svn.erp5.org nobody at svn.erp5.org
Mon Sep 4 11:23:20 CEST 2006


Author: vincent
Date: Mon Sep  4 11:23:18 2006
New Revision: 9627

URL: http://svn.erp5.org?rev=9627&view=rev
Log:
Add maximum-failure parameter to specify the maximum total number of failure or the average number of failure that can be accepted in a valid test.
Sort results before displaying to make sure no result is missed.

Modified:
    erp5/trunk/utils/erp5mechanize/userperzope.py

Modified: erp5/trunk/utils/erp5mechanize/userperzope.py
URL: http://svn.erp5.org/erp5/trunk/utils/erp5mechanize/userperzope.py?rev=9627&r1=9626&r2=9627&view=diff
==============================================================================
--- erp5/trunk/utils/erp5mechanize/userperzope.py (original)
+++ erp5/trunk/utils/erp5mechanize/userperzope.py Mon Sep  4 11:23:18 2006
@@ -29,6 +29,21 @@
 import sys
 import getopt
 
+def compute_max_error_count(user_count, maximum_failure):
+  if maximum_failure is None:
+    return None
+  maximum_failure = int(maximum_failure)
+  if maximum_failure < 0:
+    return -maximum_failure / user_count
+  else:
+    return maximum_failure
+
+def result_cmp(a, b):
+  dif = cmp(a['user'], b['user'])
+  if dif != 0:
+    return dif
+  return cmp(a['duration'], b['duration'])
+
 def parse_csv_line(line, sep):
   line = line.replace('\n','')
   item_list = line.split(sep)
@@ -46,17 +61,23 @@
   sys.stdout.write('\n')
 
 try:
-  opt_list, arg_list = getopt.getopt(sys.argv[1:], '', ['maximum_duration=', 'csv_separator=', 'default_step_number=', 'ignore_first_run'])
+  opt_list, arg_list = getopt.getopt(sys.argv[1:], '', ['maximum_duration=', 'maximum_failure=', 'csv_separator=', 'default_step_number=', 'ignore_first_run'])
 except getopt.error, msg:
   print 'Error: %s' % (msg, )
   print \
 '''Synopsis:
-  %s [--maximum_duration=float] [--csv_separator=char] [--default_step_number=integer] [file [...]]
+  %s [--maximum_duration=float] [--maximum_failure=int] [--csv_separator=char] [--default_step_number=integer] [file [...]]
 
   Each given file must be a CSV file separated by separator (default = ,).
   First CSV column must be of the form user at host.
   If last collumn contains "FAILED" (without quotes) the following is ignored
     and the test immediatelly marked as failed.
+  If maximum_failure is given and positive, it will be the absolute maximum
+    of tolerated failures in a test, independently of user count.
+  If maximum_failure is given and negative, its absolute value will be the
+    maximum number of tolerated failures per user in average
+    (computed as -maximum_failure divided by the number of user for a given
+    test run).
   If maximum_duration is given, second and third columns must be floating
     point values (second is start time, third is stop time). The
     maximum_duration parameter must be a floating point value aswel. If the
@@ -75,11 +96,14 @@
 
 csv_separator = ','
 maximum_duration = None
+maximum_failure = None
 ignore_first_run = False
 default_step_number = None
 for o, a in opt_list:
   if o == '--maximum_duration':
     maximum_duration = float(a)
+  elif o == '--maximum_failure':
+    maximum_failure = a
   elif o == '--csv_separator':
     csv_separator = a
   elif o == '--default_step_number':
@@ -105,8 +129,8 @@
       if ignore_first_run: # This allows to avoid the impact of the first run for a given user (cache filling, ...)
         continue
     if field_list[-1] == 'FAILED':
-      failed = True
-      break
+      failed += 1
+      continue
     if len(field_list) < 4:
       if default_step_number is not None:
         duration_list.append(float(field_list[2])/default_step_number)
@@ -116,25 +140,36 @@
     else:
       duration_list.append(float(field_list[2])/int(field_list[3]))
   if len(line_list):
-    result = {'user': failed==False and len(known_user_list) or 0, 'duration': len(duration_list) and sum(duration_list)/len(duration_list) or 0, 'max_duration': len(duration_list) and max(duration_list) or 0, 'min_duration': len(duration_list) and min(duration_list) or 0}
+    result = {'user': len(known_user_list), 'duration': len(duration_list) and sum(duration_list)/len(duration_list) or 0, 'max_duration': len(duration_list) and max(duration_list) or 0, 'min_duration': len(duration_list) and min(duration_list) or 0, 'failures': failed, 'filename': filename}
     if not result_list.has_key(len(known_zope_list)):
       result_list[len(known_zope_list)] = [result]
     else:
       result_list[len(known_zope_list)].append(result)
   csv.close()
 
-output_csv(separator=csv_separator, fields=['Zope count', 'Total user count', 'Average test duration at maximum user count', 'Min', 'Max'])
+output_csv(separator=csv_separator, fields=['Zope count', 'Total user count', 'Average test duration at maximum user count', 'Min', 'Max', 'Limited by', 'File'])
 for k, v in result_list.items():
+  v.sort(cmp=result_cmp)
   maximum_user_number = 0
   avg_duration = 0
   min_duration = 0
   max_duration = 0
+  filename = ''
+  reason = '(no limit reached)'
   for result in v:
-    if result['user'] == 0 or result['user'] < maximum_user_number or maximum_duration is not None and result['duration'] > maximum_duration:
+    if result['user'] < maximum_user_number or (result['user'] == maximum_user_number and result['duration'] > avg_duration):
+      continue
+    max_failure_for_this_run = compute_max_error_count(result['user'], maximum_failure)
+    if max_failure_for_this_run is not None and result['failures'] > max_failure_for_this_run:
+      reason = 'Too many failures'
+      break
+    if maximum_duration is not None and result['duration'] > maximum_duration:
+      reason = 'Too slow'
       break
     maximum_user_number = result['user']
     avg_duration = result['duration']
     min_duration = result['min_duration']
     max_duration = result['max_duration']
-  output_csv(separator=csv_separator, fields=[k, maximum_user_number, avg_duration, min_duration, max_duration])
+    filename = result['filename']
+  output_csv(separator=csv_separator, fields=[k, maximum_user_number, avg_duration, min_duration, max_duration, reason, filename])
 




More information about the Erp5-report mailing list