diff --git a/meta/lib/oeqa/core/tests/cases/skips.py b/meta/lib/oeqa/core/tests/cases/skips.py
new file mode 100644
index 00000000000..a24ee8d1c04
--- /dev/null
+++ b/meta/lib/oeqa/core/tests/cases/skips.py
@@ -0,0 +1,24 @@
+#
+# Copyright OpenEmbedded Contributors
+#
+# SPDX-License-Identifier: MIT
+#
+
+from oeqa.core.case import OETestCase
+
+class SkipsClassTest(OETestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        raise Exception("setUpClass of a skipped class shouldn't run")
+
+    def testSkipsClass(self):
+        pass
+
+class SkipsTest(OETestCase):
+
+    def testSkipsSkipped(self):
+        self.fail("Skipped test shouldn't run")
+
+    def testSkipsRun(self):
+        pass
diff --git a/meta/lib/oeqa/core/tests/cases/tdvars.py b/meta/lib/oeqa/core/tests/cases/tdvars.py
new file mode 100644
index 00000000000..60313600754
--- /dev/null
+++ b/meta/lib/oeqa/core/tests/cases/tdvars.py
@@ -0,0 +1,13 @@
+#
+# Copyright OpenEmbedded Contributors
+#
+# SPDX-License-Identifier: MIT
+#
+
+from oeqa.core.case import OETestCase
+
+class TdVarsMissingTest(OETestCase):
+    td_vars = ['NOT_IN_TD']
+
+    def testTdVarsMissing(self):
+        pass
diff --git a/meta/lib/oeqa/core/tests/test_runner.py b/meta/lib/oeqa/core/tests/test_runner.py
index a9aac5ddf66..70107d1e25d 100755
--- a/meta/lib/oeqa/core/tests/test_runner.py
+++ b/meta/lib/oeqa/core/tests/test_runner.py
@@ -56,6 +56,27 @@ class TestResultStatus(TestBase):
             'resultsmodule.ResultsModuleTest.testModuleError': 'ERROR',
         })
 
+    def test_skip_tests(self):
+        # Tests and classes can be skipped by id prefix; a skipped class must
+        # not run its setUpClass()
+        tc = self._testLoader(modules=['skips'])
+        result = tc.runTests(skips=['skips.SkipsClassTest', 'skips.SkipsTest.testSkipsSkipped'])
+        statuses = {case_id: result._getTestResultDetails(case)[0]
+                    for case_id, case in tc._registry['cases'].items()}
+        self.assertEqual(statuses, {
+            'skips.SkipsClassTest.testSkipsClass': 'SKIPPED',
+            'skips.SkipsTest.testSkipsSkipped': 'SKIPPED',
+            'skips.SkipsTest.testSkipsRun': 'PASSED',
+        })
+
+    def test_td_vars(self):
+        tc = self._testLoader(modules=['tdvars'])
+        result = tc.runTests()
+        statuses = {case_id: result._getTestResultDetails(case)[0]
+                    for case_id, case in tc._registry['cases'].items()}
+        self.assertEqual(statuses, {'tdvars.TdVarsMissingTest.testTdVarsMissing': 'ERROR'})
+        self.assertIn("OEQAMissingVariable", result.errors[0][1])
+
     def test_subtest_status(self):
         self.assertEqual(self._statuses(['subtest']), {
             'subtest.SubTestTest.testSubTestFail': 'FAILED',
