summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2017-01-25 19:14:18 -0500
committerNed Batchelder <ned@nedbatchelder.com>2017-01-25 19:14:18 -0500
commit2d124b93708636179f5c611eb698ac68901c5931 (patch)
treec9a8f8307b9d06c803ad992234736e2a4e1d9a8a /tests
parent0c2166d7f7a438f3c35f30ebdaf0bf5ee8ed91b7 (diff)
downloadpython-coveragepy-git-2d124b93708636179f5c611eb698ac68901c5931.tar.gz
Use a metaclass to convert StopEverything to SkipTest
Diffstat (limited to 'tests')
-rw-r--r--tests/coveragetest.py30
-rw-r--r--tests/test_api.py4
2 files changed, 30 insertions, 4 deletions
diff --git a/tests/coveragetest.py b/tests/coveragetest.py
index f71fcb67..bd5cf9af 100644
--- a/tests/coveragetest.py
+++ b/tests/coveragetest.py
@@ -13,6 +13,7 @@ import re
import shlex
import shutil
import sys
+import types
from unittest_mixins import (
EnvironmentAwareMixin, StdStreamCapturingMixin, TempDirMixin,
@@ -21,11 +22,12 @@ from unittest_mixins import (
import coverage
from coverage import env
-from coverage.backunittest import TestCase
+from coverage.backunittest import TestCase, unittest
from coverage.backward import StringIO, import_local_file, string_class, shlex_quote
from coverage.backward import invalidate_import_caches
from coverage.cmdline import CoverageScript
from coverage.debug import _TEST_NAME_FILE, DebugControl
+from coverage.misc import StopEverything
from tests.helpers import run_command
@@ -34,12 +36,36 @@ from tests.helpers import run_command
OK, ERR = 0, 1
+class SkipConvertingMetaclass(type):
+ """Decorate all test methods to convert StopEverything to SkipTest."""
+ def __new__(mcs, name, bases, attrs):
+ for attr_name, attr_value in attrs.items():
+ if attr_name.startswith('test_') and isinstance(attr_value, types.FunctionType):
+ attrs[attr_name] = mcs.convert_skip_exceptions(attr_value)
+
+ return super(SkipConvertingMetaclass, mcs).__new__(mcs, name, bases, attrs)
+
+ @classmethod
+ def convert_skip_exceptions(mcs, method):
+ """The decorator that wraps test methods."""
+ def wrapper(*args, **kwargs):
+ """Run the test method, and convert StopEverything to SkipTest."""
+ try:
+ result = method(*args, **kwargs)
+ except StopEverything:
+ raise unittest.SkipTest("StopEverything!")
+ return result
+ return wrapper
+
+CoverageTestMethodsMixin = SkipConvertingMetaclass('CoverageTestMethodsMixin', (), {})
+
class CoverageTest(
EnvironmentAwareMixin,
StdStreamCapturingMixin,
TempDirMixin,
DelayedAssertionMixin,
- TestCase
+ CoverageTestMethodsMixin,
+ TestCase,
):
"""A base class for coverage.py test cases."""
diff --git a/tests/test_api.py b/tests/test_api.py
index 71d3fd6f..6d87fc01 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -15,7 +15,7 @@ from coverage.backward import StringIO
from coverage.misc import CoverageException
from coverage.report import Reporter
-from tests.coveragetest import CoverageTest
+from tests.coveragetest import CoverageTest, CoverageTestMethodsMixin
class ApiTest(CoverageTest):
@@ -385,7 +385,7 @@ class UsingModulesMixin(object):
sys.path.append("../moremodules")
-class OmitIncludeTestsMixin(UsingModulesMixin):
+class OmitIncludeTestsMixin(UsingModulesMixin, CoverageTestMethodsMixin):
"""Test methods for coverage methods taking include and omit."""
def filenames_in(self, summary, filenames):