Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace nose with pytest #34778

Merged
merged 38 commits into from
Nov 11, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
77ca2d2
Remove pytest compatibility module
millerdev Sep 9, 2024
aba41f6
Initial pytest implementation
millerdev Sep 7, 2024
ec95345
Remove nose test settings
millerdev Apr 19, 2024
18b98e9
Show helpful error on ./manage.py test
millerdev Jun 11, 2024
4d44b95
Adapt patches nose plugin to pytest
millerdev Sep 4, 2024
40b26c2
Adapt redislocks nose plugin to pytest
millerdev Sep 4, 2024
3d22e5c
Add pytest-unmagic plugin for fixtures
millerdev Oct 23, 2024
e56d177
Adapt classCleanup tests to pytest
millerdev May 28, 2024
2efd892
Uninstall ddtrace ModuleWatchdog when testing
millerdev Sep 5, 2024
66663ce
Adapt reusedb feature to pytest - some tests passing
millerdev Oct 17, 2024
8372914
Use ExitStack for cleaner test database tear down
millerdev May 8, 2024
c3b3c75
Rename methods and function
millerdev May 8, 2024
1ae6ea1
Move DeferredDatabaseContext methods to functions
millerdev May 8, 2024
a834219
Implement db blocker for Couch
millerdev Sep 4, 2024
aa24be1
Setup databases on first db unblock
millerdev Jul 29, 2024
9613cdf
Do not unblock db for SimpleTestCase tests
millerdev Jul 26, 2024
3d5c1a1
Observe pytest-django's database options
millerdev Jun 11, 2024
a513405
Adapt dividedwerun nose plugin to pytest
millerdev Sep 4, 2024
0ca69fd
Remove djangomigrations plugin
millerdev May 28, 2024
069391e
Add test markers: es_test, sharded, slow
millerdev Sep 7, 2024
9b8137f
Remove obsolete and disabled nose plugins
millerdev May 29, 2024
912e55c
Move timelimit decorator to its own module
millerdev Sep 17, 2024
421f770
Adapt (part of) timing nose plugin to pytest
millerdev May 30, 2024
9b523cd
More nose.tools: assert_raises, assert_equal, ...
millerdev Jun 11, 2024
e305b74
Add 'skip_setup_users' marker
millerdev Sep 7, 2024
68219e5
Convert "yield" tests to parametrized tests
millerdev Jun 13, 2024
5ae9b5e
Remove nose test utilities module
millerdev Jun 14, 2024
c58537c
Align test discovery with nose
millerdev Sep 5, 2024
214546f
Fix parametrized test that hit Couch
millerdev Jun 14, 2024
2253349
make requirements
millerdev Jun 14, 2024
e7650e0
Switch github actions from nose to pytest
millerdev Jun 14, 2024
509dddc
Ignore unclosed file warnings in tests
millerdev Jul 24, 2024
05d1a10
Work around pytest capture plugin
millerdev Jul 30, 2024
e33e25f
Adapt champ tests to pytest
millerdev Aug 6, 2024
cd7c0a8
Adapt inddex tests to pytest
millerdev Sep 2, 2024
946173a
Adapt up_nrhm tests to pytest
millerdev Sep 2, 2024
ca33bd1
Update testing documentation: nose -> pytest
millerdev Oct 21, 2024
7ebdc62
Merge branch 'master' into dm/pytest
millerdev Oct 24, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion corehq/warnings.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
]


def configure_warnings(is_testing):
def configure_warnings(is_testing=False):
strict = is_testing or os.environ.get("CCHQ_STRICT_WARNINGS")
if strict:
augment_warning_messages()
Expand Down
47 changes: 5 additions & 42 deletions manage.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@


def main():
if len(sys.argv) > 1 and sys.argv[1] == 'test':
sys.exit("pytest is used to run HQ tests. See 'pytest --help' for options")

# important to apply gevent monkey patches before running any other code
# applying this later can lead to inconsistencies and threading issues
# but compressor doesn't like it
Expand Down Expand Up @@ -40,10 +43,9 @@ def main():
run_patches()

from corehq.warnings import configure_warnings
configure_warnings(is_testing(sys.argv))
configure_warnings()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should configure_warnings() take the CCHQ_TESTING env var into account?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fair question. Should a management command (that is not running tests) fail because of warnings if CCHQ_TESTING is set? For example, if you are running CCHQ_TESTING=1 ./manage.py migrate to migrate your test database, should it crash if warnings are emitted? I think that might be more annoying than helpful, but I'm happy to hear arguments in favor.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We reckoned that CCHQ_TESTING=1 ./manage.py dbshell would useful for inspecting the test database.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are you saying you agree that that command should not crash on a warning? That's my position.


set_default_settings_path(sys.argv)
set_nosetests_verbosity(sys.argv)
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)

Expand Down Expand Up @@ -159,51 +161,12 @@ def unpatch_sys_modules():


def set_default_settings_path(argv):
if is_testing(argv):
os.environ.setdefault('CCHQ_TESTING', '1')
if os.environ.get('CCHQ_TESTING') == '1':
module = 'testsettings'
else:
module = 'settings'
os.environ.setdefault("DJANGO_SETTINGS_MODULE", module)


def is_testing(argv):
return len(argv) > 1 and argv[1] == 'test' or os.environ.get('CCHQ_TESTING') == '1'


def set_nosetests_verbosity(argv):
"""Increase nose output verbosity with -v... argument

-v: print test names
-vv: do not capture stdout
-vvv: do not capture logging
-vvvv: enable nose internal logging
"""
import logging

def set_verbosity(arg, i):
args = []
verbosity = sum(1 for c in arg if c == "v") + 1
if len(arg) > verbosity:
# preserve other single-letter arguments (ex: -xv)
args.append("".join(c for c in arg if c != "v"))
if verbosity > 2:
args.append("--nocapture")
if verbosity > 3:
verbosity -= 1
args.append("--nologcapture")
logging.basicConfig(level=logging.NOTSET)
logging.getLogger().info(
"Adjust logging with testsettings._set_logging_levels")
args.append("--nose-verbosity=%s" % verbosity)
argv[i:i + 1] = args

if len(argv) > 1 and argv[1] == 'test':
for i, arg in reversed(list(enumerate(argv))):
if arg[:1] == "-" and arg[1] != "-" and any(c == 'v' for c in arg):
set_verbosity(arg, i)
break


if __name__ == "__main__":
main()