/bitbake/lib/toaster/contrib/tts/toasteruitest/run_toastertests.py
Python | 155 lines | 82 code | 43 blank | 30 comment | 18 complexity | 2ac63ed15bdc44d5cc779bb9d82d64c2 MD5 | raw file
- #!/usr/bin/python
- # Copyright
- # DESCRIPTION
- # This is script for running all selected toaster cases on
- # selected web browsers manifested in toaster_test.cfg.
- # 1. How to start toaster in yocto:
- # $ source poky/oe-init-build-env
- # $ source toaster start
- # $ bitbake core-image-minimal
- # 2. How to install selenium on Ubuntu:
- # $ sudo apt-get install scrot python-pip
- # $ sudo pip install selenium
- # 3. How to install selenium addon in firefox:
- # Download the lastest firefox addon from http://release.seleniumhq.org/selenium-ide/
- # Then install it. You can also install firebug and firepath addon
- # 4. How to start writing a new case:
- # All you need to do is to implement the function test_xxx() and pile it on.
- # 5. How to test with Chrome browser
- # Download/install chrome on host
- # Download chromedriver from https://code.google.com/p/chromedriver/downloads/list according to your host type
- # put chromedriver in PATH, (e.g. /usr/bin/, bear in mind to chmod)
- # For windows host, you may put chromedriver.exe in the same directory as chrome.exe
- import unittest, sys, os, platform
- import ConfigParser
- import argparse
- from toaster_automation_test import toaster_cases
- def get_args_parser():
- description = "Script that runs toaster auto tests."
- parser = argparse.ArgumentParser(description=description)
- parser.add_argument('--run-all-tests', required=False, action="store_true", dest="run_all_tests", default=False,
- help='Run all tests.')
- parser.add_argument('--run-suite', required=False, dest='run_suite', default=False,
- help='run suite (defined in cfg file)')
- return parser
- def get_tests():
- testslist = []
- prefix = 'toaster_automation_test.toaster_cases'
- for t in dir(toaster_cases):
- if t.startswith('test_'):
- testslist.append('.'.join((prefix, t)))
- return testslist
- def get_tests_from_cfg(suite=None):
- testslist = []
- config = ConfigParser.SafeConfigParser()
- config.read('toaster_test.cfg')
- if suite is not None:
- target_suite = suite.lower()
- # TODO: if suite is valid suite
- else:
- target_suite = platform.system().lower()
- try:
- tests_from_cfg = eval(config.get('toaster_test_' + target_suite, 'test_cases'))
- except:
- print('Failed to get test cases from cfg file. Make sure the format is correct.')
- return None
- prefix = 'toaster_automation_test.toaster_cases.test_'
- for t in tests_from_cfg:
- testslist.append(prefix + str(t))
- return testslist
- def main():
- # In case this script is called from other directory
- os.chdir(os.path.abspath(sys.path[0]))
- parser = get_args_parser()
- args = parser.parse_args()
- if args.run_all_tests:
- testslist = get_tests()
- elif args.run_suite:
- testslist = get_tests_from_cfg(args.run_suite)
- os.environ['TOASTER_SUITE'] = args.run_suite
- else:
- testslist = get_tests_from_cfg()
- if not testslist:
- print('Failed to get test cases.')
- exit(1)
- suite = unittest.TestSuite()
- loader = unittest.TestLoader()
- loader.sortTestMethodsUsing = None
- runner = unittest.TextTestRunner(verbosity=2, resultclass=buildResultClass(args))
- for test in testslist:
- try:
- suite.addTests(loader.loadTestsFromName(test))
- except:
- return 1
- result = runner.run(suite)
- if result.wasSuccessful():
- return 0
- else:
- return 1
- def buildResultClass(args):
- """Build a Result Class to use in the testcase execution"""
- class StampedResult(unittest.TextTestResult):
- """
- Custom TestResult that prints the time when a test starts. As toaster-auto
- can take a long time (ie a few hours) to run, timestamps help us understand
- what tests are taking a long time to execute.
- """
- def startTest(self, test):
- import time
- self.stream.write(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + " - ")
- super(StampedResult, self).startTest(test)
- return StampedResult
- if __name__ == "__main__":
- try:
- ret = main()
- except:
- ret = 1
- import traceback
- traceback.print_exc()
- finally:
- if os.getenv('TOASTER_SUITE'):
- del os.environ['TOASTER_SUITE']
- sys.exit(ret)