#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 django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/067.d7b09e33fe9537c9595cda1f1de7f635%40djangoproject.com.

Reply via email to