mirror of
https://github.com/django/django.git
synced 2024-12-22 17:16:24 +00:00
Fixed #28869 -- Made tagged test classes and methods inherit tags from parents.
This commit is contained in:
parent
acd3baf2ae
commit
09530e61a0
1
AUTHORS
1
AUTHORS
@ -832,6 +832,7 @@ answer newbie questions, and generally made Django that much better:
|
|||||||
Wiktor Kołodziej <wiktor@pykonik.org>
|
Wiktor Kołodziej <wiktor@pykonik.org>
|
||||||
Wiley Kestner <wiley.kestner@gmail.com>
|
Wiley Kestner <wiley.kestner@gmail.com>
|
||||||
Wiliam Alves de Souza <wiliamsouza83@gmail.com>
|
Wiliam Alves de Souza <wiliamsouza83@gmail.com>
|
||||||
|
Will Ayd <william.ayd@icloud.com>
|
||||||
William Schwartz <wkschwartz@gmail.com>
|
William Schwartz <wkschwartz@gmail.com>
|
||||||
Will Hardy <django@willhardy.com.au>
|
Will Hardy <django@willhardy.com.au>
|
||||||
Wilson Miner <wminer@gmail.com>
|
Wilson Miner <wminer@gmail.com>
|
||||||
|
@ -831,6 +831,9 @@ class isolate_apps(TestContextDecorator):
|
|||||||
def tag(*tags):
|
def tag(*tags):
|
||||||
"""Decorator to add tags to a test class or method."""
|
"""Decorator to add tags to a test class or method."""
|
||||||
def decorator(obj):
|
def decorator(obj):
|
||||||
|
if hasattr(obj, 'tags'):
|
||||||
|
obj.tags = obj.tags.union(tags)
|
||||||
|
else:
|
||||||
setattr(obj, 'tags', set(tags))
|
setattr(obj, 'tags', set(tags))
|
||||||
return obj
|
return obj
|
||||||
return decorator
|
return decorator
|
||||||
|
@ -695,6 +695,7 @@ subviews
|
|||||||
subwidget
|
subwidget
|
||||||
subwidgets
|
subwidgets
|
||||||
superclass
|
superclass
|
||||||
|
superclasses
|
||||||
superset
|
superset
|
||||||
swappable
|
swappable
|
||||||
symlink
|
symlink
|
||||||
|
@ -1619,6 +1619,25 @@ You can also tag a test case::
|
|||||||
class SampleTestCase(TestCase):
|
class SampleTestCase(TestCase):
|
||||||
...
|
...
|
||||||
|
|
||||||
|
Subclasses inherit tags from superclasses, and methods inherit tags from their
|
||||||
|
class. Given::
|
||||||
|
|
||||||
|
@tag('foo')
|
||||||
|
class SampleTestCaseChild(SampleTestCase):
|
||||||
|
|
||||||
|
@tag('bar')
|
||||||
|
def test(self):
|
||||||
|
...
|
||||||
|
|
||||||
|
``SampleTestCaseChild.test`` will be labeled with ``'slow'``, ``'core'``,
|
||||||
|
``'bar'``, and ``'foo'``.
|
||||||
|
|
||||||
|
.. versionchanged:: 2.1
|
||||||
|
|
||||||
|
In older versions, tagged tests don't inherit tags from classes, and
|
||||||
|
tagged subclasses don't inherit tags from superclasses. For example,
|
||||||
|
``SampleTestCaseChild.test`` is labeled only with ``'bar'``.
|
||||||
|
|
||||||
Then you can choose which tests to run. For example, to run only fast tests:
|
Then you can choose which tests to run. For example, to run only fast tests:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
@ -198,3 +198,15 @@ class DiscoverRunnerTest(TestCase):
|
|||||||
self.assertEqual(runner.build_suite(['test_runner_apps.tagged.tests']).countTestCases(), 0)
|
self.assertEqual(runner.build_suite(['test_runner_apps.tagged.tests']).countTestCases(), 0)
|
||||||
runner = DiscoverRunner(exclude_tags=['slow'])
|
runner = DiscoverRunner(exclude_tags=['slow'])
|
||||||
self.assertEqual(runner.build_suite(['test_runner_apps.tagged.tests']).countTestCases(), 0)
|
self.assertEqual(runner.build_suite(['test_runner_apps.tagged.tests']).countTestCases(), 0)
|
||||||
|
|
||||||
|
def test_tag_inheritance(self):
|
||||||
|
def count_tests(**kwargs):
|
||||||
|
suite = DiscoverRunner(**kwargs).build_suite(['test_runner_apps.tagged.tests_inheritance'])
|
||||||
|
return suite.countTestCases()
|
||||||
|
|
||||||
|
self.assertEqual(count_tests(tags=['foo']), 4)
|
||||||
|
self.assertEqual(count_tests(tags=['bar']), 2)
|
||||||
|
self.assertEqual(count_tests(tags=['baz']), 2)
|
||||||
|
self.assertEqual(count_tests(tags=['foo'], exclude_tags=['bar']), 2)
|
||||||
|
self.assertEqual(count_tests(tags=['foo'], exclude_tags=['bar', 'baz']), 1)
|
||||||
|
self.assertEqual(count_tests(exclude_tags=['foo']), 0)
|
||||||
|
29
tests/test_runner_apps/tagged/tests_inheritance.py
Normal file
29
tests/test_runner_apps/tagged/tests_inheritance.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
from unittest import TestCase
|
||||||
|
|
||||||
|
from django.test import tag
|
||||||
|
|
||||||
|
|
||||||
|
@tag('foo')
|
||||||
|
class FooBase(TestCase):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class Foo(FooBase):
|
||||||
|
|
||||||
|
def test_no_new_tags(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@tag('baz')
|
||||||
|
def test_new_func_tag(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@tag('bar')
|
||||||
|
class FooBar(FooBase):
|
||||||
|
|
||||||
|
def test_new_class_tag_only(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@tag('baz')
|
||||||
|
def test_new_class_and_func_tags(self):
|
||||||
|
pass
|
Loading…
Reference in New Issue
Block a user