[Erp5-report] r32026 rafael - /erp5/trunk/products/ERP5Type/tests/runFunctionalTest.py

nobody at svn.erp5.org nobody at svn.erp5.org
Wed Jan 27 14:52:37 CET 2010


Author: rafael
Date: Wed Jan 27 14:52:32 2010
New Revision: 32026

URL: http://svn.erp5.org?rev=32026&view=rev
Log:
Small refactor. Now it is used a class (FunctionalTestRunner) to run the functional tests. This will help create custom Runners for Projects or custom products.

 * It allow not take screenshots with xwud
 * This is just a initial clean up should not change the current behaviours. 
 * More improvements and features will come soon.

Modified:
    erp5/trunk/products/ERP5Type/tests/runFunctionalTest.py

Modified: erp5/trunk/products/ERP5Type/tests/runFunctionalTest.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/tests/runFunctionalTest.py?rev=32026&r1=32025&r2=32026&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/tests/runFunctionalTest.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/tests/runFunctionalTest.py [utf8] Wed Jan 27 14:52:32 2010
@@ -38,22 +38,6 @@
   ./runUnitTest.py --save prepareFunctionalTest.py
 """
 
-
-host = 'localhost'
-port = 8080
-portal_name = 'erp5_portal'
-user = 'ERP5TypeTestCase'
-password = ''
-send_mail = 0
-stdout = 0
-debug = 0
-email_to_address = 'erp5-report at erp5.org'
-smtp_host = ''
-email_subject = 'ERP5'
-run_only=''
-portal_url = ''
-xvfb_display = '123'
-
 tests_framework_home = os.path.dirname(os.path.abspath(__file__))
 # handle 'system global' instance
 if tests_framework_home.startswith('/usr/lib'):
@@ -63,128 +47,144 @@
     tests_framework_home.split(os.path.sep)[:-3])
 
 instance_home = os.path.join(real_instance_home, 'unit_test')
-profile_dir = os.path.join(instance_home, 'profile')
 bt5_dir_list = ','.join([
                     os.path.join(instance_home, 'Products/ERP5/bootstrap'),
                     os.path.join(instance_home, 'bt5')])
 
 
-
-def usage(stream, msg=None):
-  if msg:
-    print >>stream, msg
-    print >>stream
-  program = os.path.basename(sys.argv[0])
-  print >>stream, __doc__ % {"program": program}
-
-def parseArgs():
-  global send_mail
-  global stdout
-  global debug
-  global email_to_address
-  global smtp_host
-  global host
-  global port
-  global portal_name
-  global portal_url
-  global run_only
-  global email_subject
-  global xvfb_display
-  try:
-    opts, args = getopt.getopt(sys.argv[1:],
-          "hsd", ["help", "stdout", "debug",
-                 "email_to_address=", "host=", "port=", 
-                 "portal_name=", "run_only=",
-                 "email_subject=", "smtp_host=", "xvfb_display="] )
-  except getopt.GetoptError, msg:
-    usage(sys.stderr, msg)
-    sys.exit(2)
-
-  for opt, arg in opts:
-    if opt in ("-s", "--stdout"):
-      stdout = 1
-    elif opt in ("-d", "--debug"):
-      debug = 1
-    elif opt == '--email_to_address':
-      email_to_address = arg
-      send_mail = 1
-    elif opt == '--smtp_host':
-      smtp_host = arg
-    elif opt in ('-h', '--help'):
-      usage(sys.stdout)
-      sys.exit()
-    elif opt == "--host":
-      host = arg
-    elif opt == "--port":
-      port = int(arg)
-    elif opt == "--portal_name":
-      portal_name = arg
-    elif opt == "--run_only":
-      run_only = arg
-    elif opt == "--email_subject":
-      email_subject = arg
-    elif opt == "--xvfb_display":
-      xvfb_display = arg
-
-  if not stdout:
-    send_mail = 1
-
-  portal_url = "http://%s:%d/%s" % (host, port, portal_name)
-
-def openUrl(url):
-  f = urllib2.urlopen(url)
-  file_content = f.read()
-  f.close()
-  return file_content
-
-
-def main():
-  setPreference()
-  unsubscribeFromTimerService()
-  launchFuntionalTest()
-
-def launchFuntionalTest():
-  status = getStatus()
-  xvfb_pid = None
-  firefox_pid = None
-  try:
-    if not debug:
-      xvfb_pid = runXvfb(xvfb_display)
-    firefox_pid = runFirefox(xvfb_display)
-    while True:
-      sleep(10)
-      cur_status = getStatus()
-      if status != cur_status:
-        break
-  finally:
-      if xvfb_pid:
-        os.kill(xvfb_pid, signal.SIGTERM)
-      if firefox_pid:
-        os.kill(firefox_pid, signal.SIGTERM)
-
-def startZope():
-  os.environ['erp5_save_data_fs'] = "1"
-  os.system('%s/bin/zopectl start' % instance_home)
-  sleep(2) # ad hoc
-
-def stopZope():
-  os.system('%s/bin/zopectl stop' % instance_home)
-
-def runXvfb(xvfb_display):
-  pid = os.spawnlp(os.P_NOWAIT, 'Xvfb', 'Xvfb', ':%s' %xvfb_display)
-  display = os.environ.get('DISPLAY')
-  if display:
-    auth = Popen(['xauth', 'list', display], stdout=PIPE).communicate()[0]
-    if auth:
-      (displayname, protocolname, hexkey) = auth.split()
-      Popen(['xauth', 'add', 'localhost/unix:%s' %xvfb_display, protocolname, hexkey])
-  print 'Xvfb : %d' % pid
-  return pid
-
-def prepareFirefox():
-  os.system("rm -rf %s" % profile_dir)
-  os.mkdir(profile_dir)
-  prefs_js = """
+class FunctionalTestRunner:
+  """
+    Used to run Functional tests
+  """
+  def __init__(self, instance_home):
+    self.instance_home = instance_home
+    self.xvfb_fbdir = instance_home
+    self.send_mail = 0
+    self.stdout = 0
+    self.debug = 0
+    self.email_to_address = 'erp5-report at erp5.org'
+    self.smtp_host = ''
+    self.host = 'localhost'
+    self.port = 8080
+    self.user = 'ERP5TypeTestCase'
+    self.password = ''
+    self.portal_name = 'erp5_portal'
+    self.run_only = ''
+    self.email_subject = 'ERP5'
+    self.xvfb_display = '123'
+    self.profile_dir = os.path.join(instance_home, 'profile')
+
+  def usage(self, stream, msg=None):
+    if msg:
+      print >>stream, msg
+      print >>stream
+    program = os.path.basename(sys.argv[0])
+    print >>stream, __doc__ % {"program": program}
+
+  def parseArgs(self):
+    try:
+      opts, args = getopt.getopt(sys.argv[1:],
+            "hsd", ["help", "stdout", "debug",
+                   "email_to_address=", "host=", "port=", 
+                   "portal_name=", "run_only=", "user=", 
+                   "password=", "alarms=",
+                   "email_subject=", "smtp_host=", "xvfb_display="] )
+    except getopt.GetoptError, msg:
+      self.usage(sys.stderr, msg)
+      sys.exit(2)
+  
+    for opt, arg in opts:
+      if opt in ("-s", "--stdout"):
+        self.stdout = 1
+      elif opt in ("-d", "--debug"):
+        self.debug = 1
+      elif opt == '--email_to_address':
+        self.email_to_address = arg
+        self.send_mail = 1
+      elif opt == '--smtp_host':
+        self.smtp_host = arg
+      elif opt in ('-h', '--help'):
+        self.usage(sys.stdout)
+        sys.exit()
+      elif opt == "--host":
+        self.host = arg
+      elif opt == "--port":
+        self.port = int(arg)
+      elif opt == "--portal_name":
+        self.portal_name = arg
+      elif opt == "--run_only":
+        self.run_only = arg
+      elif opt == "--user":
+        user = arg
+      elif opt == "--password":
+        password = arg
+      elif opt == "--email_subject":
+        self.email_subject = arg
+      elif opt == "--xvfb_display":
+        self.xvfb_display = arg
+  
+    if not self.stdout:
+      self.send_mail = 1
+  
+    self.portal_url = "http://%s:%d/%s" % (self.host, self.port, self.portal_name)
+  
+  def openUrl(self, url):
+    f = urllib2.urlopen(url)
+    file_content = f.read()
+    f.close()
+    return file_content
+  
+  
+  def main(self):
+    self.setPreference()
+    self.unsubscribeFromTimerService()
+    self.launchFuntionalTest()
+
+  def launchFuntionalTest(self):
+    status = self.getStatus()
+    xvfb_pid = None
+    firefox_pid = None
+    try:
+      if not self.debug:
+        xvfb_pid = self.runXvfb(self.xvfb_display)
+      firefox_pid = self.runFirefox(self.xvfb_display)
+      while True:
+        sleep(10)
+        cur_status = self.getStatus()
+        if status != cur_status:
+          break
+    finally:
+        if xvfb_pid:
+          os.kill(xvfb_pid, signal.SIGTERM)
+        if firefox_pid:
+          os.kill(firefox_pid, signal.SIGTERM)
+  
+  def startZope(self):
+    os.environ['erp5_save_data_fs'] = "1"
+    os.system('%s/bin/zopectl start' % self.instance_home)
+    sleep(2) # ad hoc
+  
+  def stopZope(self):
+    os.system('%s/bin/zopectl stop' % self.instance_home)
+  
+  def runXvfb(self, xvfb_display):
+    pid = os.spawnlp(os.P_NOWAIT, 'Xvfb', 'Xvfb', 
+                     '-fbdir' , '%s' % self.xvfb_fbdir  ,
+                     ':%s' % xvfb_display)
+    display = os.environ.get('DISPLAY')
+    if display:
+      auth = Popen(['xauth', 'list', display], stdout=PIPE).communicate()[0]
+      if auth:
+        (displayname, protocolname, hexkey) = auth.split()
+        Popen(['xauth', 'add', 'localhost/unix:%s' %xvfb_display, protocolname, hexkey])
+    print 'Xvfb : %d' % pid
+    print 'Take screenshots using xwud -in %s/Xvfb_screen0' % self.xvfb_fbdir
+    return pid
+  
+  def prepareFirefox(self, host, port):
+    os.system("rm -rf %s" % self.profile_dir)
+    os.mkdir(self.profile_dir)
+    prefs_js = """
 // Don't ask if we want to switch default browsers
 user_pref("browser.shell.checkDefaultBrowser", false);
 
@@ -213,93 +213,89 @@
 // Make sure we do not use cache
 user_pref("browser.cache.check_doc_frequency", 1);
 user_pref("network.http.use-cache", false);
-//user_pref("browser.cache.disk.capacity", 0);
-//user_pref("browser.cache.disk.enable", false);
-//user_pref("browser.cache.memory.enable", false);
-//user_pref("browser.cache.offline.enable", false);
 
 // this is required to upload files
 user_pref("capability.principal.codebase.p1.granted", "UniversalFileRead");
 user_pref("signed.applets.codebase_principal_support", true);
 user_pref("capability.principal.codebase.p1.id", "http://%s");
 user_pref("capability.principal.codebase.p1.subjectName", "");""" % \
-    '%s:%s' % (host, port)
-  pref_file = open(os.path.join(profile_dir, 'prefs.js'), 'w')
-  pref_file.write(prefs_js)
-  pref_file.close()
-
-def runFirefox(xvfb_display):
-  prepareFirefox()
-  if debug:
+      '%s:%s' % (host, port)
+    pref_file = open(os.path.join(self.profile_dir, 'prefs.js'), 'w')
+    pref_file.write(prefs_js)
+    pref_file.close()
+  
+  def runFirefox(self,xvfb_display):
+    self.prepareFirefox(self.host, self.port)
+    if self.debug:
+      try:
+        shutil.copy2(os.path.expanduser('~/.Xauthority'), '%s/.Xauthority' % self.profile_dir)
+      except IOError:
+        pass
+    else:
+      os.environ['DISPLAY'] = ':%s' %xvfb_display
+    os.environ['MOZ_NO_REMOTE'] = '1'
+    os.environ['HOME'] = self.profile_dir
+    # check if old zelenium or new zelenium
     try:
-      shutil.copy2(os.path.expanduser('~/.Xauthority'), '%s/.Xauthority' % profile_dir)
-    except IOError:
-      pass
-  else:
-    os.environ['DISPLAY'] = ':%s' %xvfb_display
-  os.environ['MOZ_NO_REMOTE'] = '1'
-  os.environ['HOME'] = profile_dir
-  # check if old zelenium or new zelenium
-  try:
-    urllib2.urlopen("%s/portal_tests/core/scripts/selenium-version.js" % portal_url)
-  except urllib2.HTTPError:
-    # Zelenium 0.8
-    url_string = "%s/portal_tests/?auto=true&__ac_name=%s&__ac_password=%s" % (portal_url, user, password)
-  else:
-    # Zelenium 0.8+ or later
-    url_string = "%s/portal_tests/core/TestRunner.html?test=../test_suite_html&auto=on&resultsUrl=%s/portal_tests/postResults&__ac_name=%s&__ac_password=%s" % (portal_url, portal_url, user, password)
-
-  if run_only:
-    url_string = url_string.replace('/portal_tests/', '/portal_tests/%s/' % run_only, 1)
-  pid = os.spawnlp(os.P_NOWAIT, "firefox", "firefox", "-profile", profile_dir,
-      url_string)
-  os.environ['MOZ_NO_REMOTE'] = '0'
-  print 'firefox : %d' % pid
-  return pid
-
-def getStatus():
-  try:
-    status = openUrl('%s/portal_tests/TestTool_getResults'
-                             % (portal_url))
-  except urllib2.HTTPError, e:
-    if e.msg == "No Content" :
-      status = ""
+      urllib2.urlopen("%s/portal_tests/core/scripts/selenium-version.js" % self.portal_url)
+    except urllib2.HTTPError:
+      # Zelenium 0.8
+      url_string = "%s/portal_tests/?auto=true&__ac_name=%s&__ac_password=%s" % (self.portal_url, self.user, self.password)
     else:
-      raise
-  return status
-
-def setPreference():
-  urllib2.urlopen('%s/BTZuite_setPreference?__ac_name='
-                  '%s&__ac_password=%s&working_copy_list=%s' %
-                  (portal_url, user, password, bt5_dir_list))
-
-def unsubscribeFromTimerService():
-  urllib2.urlopen('%s/portal_activities/?unsubscribe:method='
-                  '&__ac_name=%s&__ac_password=%s' %
-                  (portal_url, user, password))
-
-def sendResult():
-  global email_subject
-  result_uri = urllib2.urlopen('%s/portal_tests/TestTool_getResults' % portal_url).readline()
-  print result_uri
-  file_content = openUrl(result_uri)
-  passes_re = re.compile('<th[^>]*>Tests passed</th>\n\s*<td[^>]*>([^<]*)')
-  failures_re = re.compile('<th[^>]*>Tests failed</th>\n\s*<td[^>]*>([^<]*)')
-  image_re = re.compile('<img[^>]*?>')
-  error_title_re = re.compile('(?:error.gif.*?>|title status_failed"><td[^>]*>)([^>]*?)</td></tr>', re.S)
-  result_re = re.compile('<div style="padding-top: 10px;">\s*<p>\s*'
-                        '<img.*?</div>\s.*?</div>\s*', re.S)
-  error_result_re = re.compile('.*(?:error.gif|title status_failed).*', re.S)
-  passes = passes_re.search(file_content).group(1)
-  failures = failures_re.search(file_content).group(1)
-  error_titles = [re.compile('\s+').sub(' ', x).strip()
-                  for x in error_title_re.findall(file_content)]
-  os.chdir('%s/Products/ERP5' % instance_home)
-  revision = pysvn.Client().info('.').revision.number
-
-  subject = "%s r%s: Functional Tests, %s Passes, %s Failures" \
-              % (email_subject, revision, passes, failures)
-  summary = """
+      # Zelenium 0.8+ or later
+      url_string = "%s/portal_tests/core/TestRunner.html?test=../test_suite_html&auto=on&resultsUrl=%s/portal_tests/postResults&__ac_name=%s&__ac_password=%s" % (self.portal_url, self.portal_url, self.user, self.password)
+  
+    if self.run_only:
+      url_string = url_string.replace('/portal_tests/', '/portal_tests/%s/' % self.run_only, 1)
+    pid = os.spawnlp(os.P_NOWAIT, "firefox", "firefox", "-profile", self.profile_dir,
+        url_string)
+    os.environ['MOZ_NO_REMOTE'] = '0'
+    print 'firefox : %d' % pid
+    return pid
+  
+  def getStatus(self):
+    try:
+      status = self.openUrl('%s/portal_tests/TestTool_getResults'
+                               % (self.portal_url))
+    except urllib2.HTTPError, e:
+      if e.msg == "No Content" :
+        status = ""
+      else:
+        raise
+    return status
+  
+  def setPreference(self):
+    urllib2.urlopen('%s/BTZuite_setPreference?__ac_name='
+                    '%s&__ac_password=%s&working_copy_list=%s' %
+                    (self.portal_url, self.user, self.password, bt5_dir_list))
+  
+  def unsubscribeFromTimerService(self):
+    urllib2.urlopen('%s/portal_activities/?unsubscribe:method='
+                    '&__ac_name=%s&__ac_password=%s' %
+                    (self.portal_url, self.user, self.password))
+  
+  def sendResult(self):
+    result_uri = urllib2.urlopen('%s/portal_tests/TestTool_getResults' % self.portal_url).readline()
+    print result_uri
+    file_content = self.openUrl(result_uri)
+    passes_re = re.compile('<th[^>]*>Tests passed</th>\n\s*<td[^>]*>([^<]*)')
+    failures_re = re.compile('<th[^>]*>Tests failed</th>\n\s*<td[^>]*>([^<]*)')
+    image_re = re.compile('<img[^>]*?>')
+    error_title_re = re.compile('(?:error.gif.*?>|title status_failed"><td[^>]*>)([^>]*?)</td></tr>', re.S)
+    result_re = re.compile('<div style="padding-top: 10px;">\s*<p>\s*'
+                          '<img.*?</div>\s.*?</div>\s*', re.S)
+    error_result_re = re.compile('.*(?:error.gif|title status_failed).*', re.S)
+    passes = passes_re.search(file_content).group(1)
+    failures = failures_re.search(file_content).group(1)
+    error_titles = [re.compile('\s+').sub(' ', x).strip()
+                    for x in error_title_re.findall(file_content)]
+    # get SVN revision used
+    os.chdir('%s/Products/ERP5' % self.instance_home)
+    revision = pysvn.Client().info('.').revision.number
+  
+    subject = "%s r%s: Functional Tests, %s Passes, %s Failures" \
+                % (self.email_subject, revision, passes, failures)
+    summary = """
 Test Summary
 
 Tests passed: %4s
@@ -307,38 +303,39 @@
 
 Following tests failed:
 
-%s""" % (passes, failures, "\n".join(error_titles))
-  detail = ''
-  for e in result_re.findall(file_content):
-    if error_result_re.match(e):
-      detail += e
-  detail = image_re.sub('', detail)
-  detail = detail.replace('<tr class="title status_failed"', '<tr class="title status_failed" style="background-color:red"')
-  detail = detail.replace('<tr class="status_failed"', '<tr class="status_failed" style="background-color:red"')
-  if detail:
-    detail = '<html><body>%s</body></html>' % detail
-  status = (not failures)
-  if send_mail:
-    sendMail(subject=subject,
-             body=summary,
-             status=status,
-             attachments=[detail],
-             from_mail='nobody at svn.erp5.org',
-             to_mail=[email_to_address],
-             smtp_host=smtp_host)
-  if stdout:
-    print '-' * 79
-    print subject
-    print '-' * 79
-    print summary
-    print '-' * 79
-    print detail
-  return int(failures)
+  
+  %s""" % (passes, failures, "\n".join(error_titles))
+    detail = ''
+    for e in result_re.findall(file_content):
+      if error_result_re.match(e):
+        detail += e
+    detail = image_re.sub('', detail)
+    detail = detail.replace('<tr class="title status_failed"', '<tr class="title status_failed" style="background-color:red"')
+    detail = detail.replace('<tr class="status_failed"', '<tr class="status_failed" style="background-color:red"')
+    if detail:
+      detail = '<html><body>%s</body></html>' % detail
+    status = (not failures)
+    if self.send_mail:
+      sendMail(subject=subject,
+               body=summary,
+               status=status,
+               attachments=[detail],
+               from_mail='nobody at svn.erp5.org',
+               to_mail=[self.email_to_address],
+               smtp_host=self.smtp_host)
+    if self.stdout:
+      print '-' * 79
+      print subject
+      print '-' * 79
+      print summary
+      print '-' * 79
+      print detail
+    return int(failures)
 
 if __name__ == "__main__":
-  parseArgs()
-  startZope()
-  atexit.register(stopZope)
-  main()
-  sys.exit(sendResult())
-
+  test_runner = FunctionalTestRunner(instance_home)
+  test_runner.parseArgs()
+  test_runner.startZope()
+  atexit.register(test_runner.stopZope)
+  test_runner.main()
+  sys.exit(test_runner.sendResult())




More information about the Erp5-report mailing list