#32668: Separate test-collection setup from runtests.py's setup() for use in
get_app_test_labels()
-------------------------------------+-------------------------------------
     Reporter:  Chris Jerdonek       |                    Owner:  nobody
         Type:                       |                   Status:  new
  Cleanup/optimization               |
    Component:  Testing framework    |                  Version:  dev
     Severity:  Normal               |               Resolution:
     Keywords:                       |             Triage Stage:
                                     |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Description changed by Chris Jerdonek:

Old description:

> This is another clean-up follow-up to
> [https://github.com/django/django/pull/4106 PR #4106], similar to
> ([https://github.com/django/django/pull/14276 PR #14276].
>
> TLDR: Refactor out from `runtests.py`'s
> [https://github.com/django/django/blob/54e94640ace261b14cf8cdb1fae3dc6f068a5f87/tests/runtests.py#L135
> setup()] and
> [https://github.com/django/django/blob/54e94640ace261b14cf8cdb1fae3dc6f068a5f87/tests/runtests.py#L263
> teardown()] simpler `setup_test_collection()` and
> `teardown_test_collection()` functions for use in the new
> [https://github.com/django/django/blob/54e94640ace261b14cf8cdb1fae3dc6f068a5f87/tests/runtests.py#L337-L342
> get_app_test_labels()] (used for `bisect_tests()` and `paired_tests()`).
> (The exact names aren't so important.)
>
> Longer version:
>
> Currently, `runtests.py`'s `setup()` function and its role in getting the
> list of default test labels for `bisect_tests()`, `paired_tests()`, and
> [https://github.com/django/django/blob/413c15ef2e3d3958fb641a023bc1e2d15fb2b228/tests/runtests.py#L332
> test_runner.run_tests()] is a bit complicated and harder to understand
> than it needs to be.
>
> There are a couple reasons for this. First, `setup()` is actually doing
> two kinds of setup: one for collecting the default test labels (always
> needed), and one for setting up the test run (needed only for
> [https://github.com/django/django/blob/54e94640ace261b14cf8cdb1fae3dc6f068a5f87/tests/runtests.py#L301
> django_tests()] but not `bisect_tests()` and `paired_tests()`). Second,
> the way the list of default test labels is obtained is a bit roundabout.
> Namely, a bunch of apps are added to `INSTALLED_APPS`, and then
> `runtests.py`'s `get_installed()` is called to read from
> `INSTALLED_APPS`. However, for test-collection, `INSTALLED_APPS` doesn't
> actually need to be modified. You can see a side effect of this in the
> fact that `get_installed()` doesn't just return test labels. It also
> returns the following modules, which no longer contain any tests (this is
> the thing that [https://github.com/django/django/pull/4106 PR #4106] from
> six years ago fixed):
> `django.contrib.admin`, `django.contrib.auth`,
> `django.contrib.contenttypes`, `django.contrib.flatpages`,
> `django.contrib.messages`, `django.contrib.redirects`,
> `django.contrib.sessions`, `django.contrib.sites`,
> `django.contrib.staticfiles`.
>
> By extracting out from `setup()` a `setup_test_collection()` function
> that just collects and returns the test labels, I think things will
> become a lot easier to understand and work with -- not just for
> `bisect_tests()` and `paired_tests()`, but also for the main
> `django_tests()` case.

New description:

 This is another clean-up follow-up to
 [https://github.com/django/django/pull/4106 PR #4106], similar to
 [https://github.com/django/django/pull/14276 PR #14276].

 TLDR: Refactor out from `runtests.py`'s 125-line
 
[https://github.com/django/django/blob/54e94640ace261b14cf8cdb1fae3dc6f068a5f87/tests/runtests.py#L135
 setup()] and
 
[https://github.com/django/django/blob/54e94640ace261b14cf8cdb1fae3dc6f068a5f87/tests/runtests.py#L263
 teardown()] simpler `setup_test_collection()` and
 `teardown_test_collection()` functions for use in the new
 
[https://github.com/django/django/blob/54e94640ace261b14cf8cdb1fae3dc6f068a5f87/tests/runtests.py#L337-L342
 get_app_test_labels()] (used for `bisect_tests()` and `paired_tests()`).
 (The exact names aren't so important.)

 Longer version:

 Currently, `runtests.py`'s `setup()` function and its role in getting the
 list of default test labels for `bisect_tests()`, `paired_tests()`, and
 
[https://github.com/django/django/blob/413c15ef2e3d3958fb641a023bc1e2d15fb2b228/tests/runtests.py#L332
 test_runner.run_tests()] is a bit complicated and harder to understand
 than it needs to be.

 There are a couple reasons for this. First, `setup()` is actually doing
 two kinds of setup: one for collecting the default test labels, and one
 for setting up the test run (needed only for
 
[https://github.com/django/django/blob/54e94640ace261b14cf8cdb1fae3dc6f068a5f87/tests/runtests.py#L301
 django_tests()] but never `bisect_tests()` and `paired_tests()`). Second,
 the way the list of default test labels is obtained is a bit roundabout.
 Namely, a bunch of apps are added to `INSTALLED_APPS`, and then
 `runtests.py`'s `get_installed()` is called to read from `INSTALLED_APPS`.
 However, for test-collection, `INSTALLED_APPS` doesn't actually need to be
 modified. You can see a side effect of this in the fact that
 `get_installed()` doesn't just return test labels. It also returns the
 following modules, which no longer contain any tests (this is the thing
 that [https://github.com/django/django/pull/4106 PR #4106] from six years
 ago fixed):
 `django.contrib.admin`, `django.contrib.auth`,
 `django.contrib.contenttypes`, `django.contrib.flatpages`,
 `django.contrib.messages`, `django.contrib.redirects`,
 `django.contrib.sessions`, `django.contrib.sites`,
 `django.contrib.staticfiles`.

 By extracting out from `setup()` a `setup_test_collection()` function that
 just collects and returns the top-level, filtered test labels, I think
 things will become a lot easier to understand and work with -- not just
 for `bisect_tests()` and `paired_tests()`, but also for the main
 `django_tests()` case.

--

-- 
Ticket URL: <https://code.djangoproject.com/ticket/32668#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/067.d7b09e33fe9537c9595cda1f1de7f635%40djangoproject.com.

Reply via email to