| #!/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) |
| |
| |