[OE-core] [PATCH] oe-selftest: support selftests from other layers

LIU, Sharron sharron.liu at intel.com
Wed Aug 5 07:17:56 UTC 2015


[YOCTO #7865] https://bugzilla.yoctoproject.org/show_bug.cgi?id=7865

This script is extended to detect and run tests from all BBLAYERS added to
BBPATH. Tests can be put in any sub-dir, except for "files" which is treated
as test dependent files.

To detect tests, this patch goes through "lib/oeqa/selftest/" of every layer
added to BBPATH.
To support sub-dir, this patch list test module with its sub-dirs prefix.
To run tests, this patch adds tests package path into "sys.path" then reload
"oeqa.selftest".

Signed-off-by: LIU, Sharron <sharron.liu at intel.com>
---
 scripts/oe-selftest | 42 ++++++++++++++++++++++++++++++++++--------
 1 file changed, 34 insertions(+), 8 deletions(-)

diff --git a/scripts/oe-selftest b/scripts/oe-selftest
index 91e2dd2..b441a08 100755
--- a/scripts/oe-selftest
+++ b/scripts/oe-selftest
@@ -23,7 +23,15 @@
 # Call the script as: "oe-selftest" to run all the tests in in meta/lib/selftest/
 # Call the script as: "oe-selftest <module>.<Class>.<method>" to run just a single test
 # E.g: "oe-selftest bboutput.BitbakeLayers" will run just the BitbakeLayers class from meta/lib/selftest/bboutput.py
-
+#
+# The script is extended to support detecting tests from "lib/oeqa/selftest/*/"
+# from any BBLAYERS added to BBPATH. Tests can be put in any subdir,
+# except for "files" which is treated as test dependent files.
+# Eg.: meta-mylayer/lib/oeqa/selftest/subdirs/mytest.py
+# Call the script as: "oe-selftest --list-modules", you'll have
+#         subdirs.mytest
+# Call the script as: "oe-selftest --runtests subdirs.mytest", you'll have
+# the test run.
 
 import os
 import sys
@@ -41,6 +49,13 @@ import oeqa.utils.ftools as ftools
 from oeqa.utils.commands import runCmd, get_bb_var, get_test_layer
 from oeqa.selftest.base import oeSelfTest
 
+# add test cases location into the python searching path
+for l in get_bb_var('BBPATH').split(':'):
+    if os.path.exists(os.path.abspath(os.path.join(l, 'lib/oeqa/selftest'))):
+        sys.path.insert(0, os.path.abspath(os.path.join(l, 'lib')))
+# reloading this package is necessary due to "sys.path" updated
+reload(oeqa.selftest)
+
 def logger_create():
     log = logging.getLogger("selftest")
     log.setLevel(logging.DEBUG)
@@ -145,12 +160,20 @@ def get_tests(exclusive_modules=[], include_hidden=False):
     for x in exclusive_modules:
         testslist.append('oeqa.selftest.' + x)
     if not testslist:
-        for testpath in oeqa.selftest.__path__:
-            files = sorted([f for f in os.listdir(testpath) if f.endswith('.py') and not (f.startswith('_') and not include_hidden) and not f.startswith('__') and f != 'base.py'])
-            for f in files:
-                module = 'oeqa.selftest.' + f[:-3]
-                if module not in testslist:
-                    testslist.append(module)
+        # add test cases to "testslist" for every subfolder of "oeqa/selftest/"
+        def _addtest(args, dname, fnames):
+            if (os.path.basename(dname) != 'files'): # 'files' folder is skipped
+                # d is sub-dirs name. eg.: "oeqa/selftest/cfg/mytest.py", d=cfg
+                d=dname[args[0]:].replace('/','.')
+                for f in fnames:
+                    if (f.endswith('.py') and not (f.startswith('_') and not include_hidden) and not f.startswith('__') and f != 'base.py'):
+                        # test is added as "oeqa.selftest.cfg.mytest"
+                        testslist.append('oeqa.selftest'+d+'.'+f[:-3])
+        # detect test cases from all layers that added to "BBPATH"
+        for l in get_bb_var('BBPATH').split(':'):
+            testpath = os.path.join(l, 'lib', 'oeqa', 'selftest')
+            if os.path.exists(testpath):
+                os.path.walk(testpath, _addtest, [len(testpath)])
 
     return testslist
 
@@ -172,7 +195,10 @@ def main():
         log.info('Listing all available test modules:')
         testslist = get_tests(include_hidden=True)
         for test in testslist:
-            module = test.split('.')[-1]
+            # list test with its sub-dirs name relative to oeqa.selftest
+            # eg.: "oeqa.selftest.cfg.mytest" is listed as "cfg.mytest" for
+            # passing to "--run-tests <module>"
+            module = test.split('.',2)[-1]
             info = ''
             if module.startswith('_'):
                 info = ' (hidden)'
-- 
1.9.1




More information about the Openembedded-core mailing list