156 lines
4.3 KiB
Python
Executable File
156 lines
4.3 KiB
Python
Executable 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)
|
|
|
|
|