zulip/tools/test-backend
Tim Abbott be53c9e39e tests: Check for presence of typing in venv guard.
Since relatively few systems have the typing module, this makes the
checks for whether the user is properly running our test scripts in
the virtualenv more likely to trigger well.
2016-06-06 13:41:34 -07:00

100 lines
3.4 KiB
Python
Executable File

#!/usr/bin/env python
from __future__ import print_function
import optparse
import os
import sys
import subprocess
try:
import django
from django.conf import settings
from django.test.utils import get_runner
# We don't actually need typing, but it's a good guard for being
# outside a Zulip virtualenv.
import typing
except ImportError as e:
print("ImportError: {}".format(e))
print("You need to run the Zulip tests inside a Zulip dev environment.")
print("If you are using Vagrant, you can `vagrant ssh` to enter the Vagrant guest.")
sys.exit(1)
if __name__ == "__main__":
TOOLS_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.dirname(TOOLS_DIR))
os.environ['DJANGO_SETTINGS_MODULE'] = 'zproject.test_settings'
# "-u" uses unbuffered IO, which is important when wrapping it in subprocess
os.environ['PYTHONUNBUFFERED'] = 'y'
django.setup()
parser = optparse.OptionParser()
parser.add_option('--nonfatal-errors', action="store_false", default=True,
dest="fatal_errors", help="Continue past test failures to run all tests")
parser.add_option('--coverage', dest='coverage',
action="store_true",
default=False, help='Compute test coverage.')
parser.add_option('--profile', dest='profile',
action="store_true",
default=False, help='Profile test runtime.')
parser.add_option('--no-shallow', dest='no_shallow',
action="store_true",
default=False,
help="Don't allow shallow testing of templates")
parser.add_option('--verbose', dest='verbose',
action="store_true",
default=False,
help="Show detailed output")
(options, args) = parser.parse_args()
if len(args) == 0:
suites = ["zerver.tests"]
else:
suites = args
if options.coverage:
import coverage
cov = coverage.Coverage(omit="*/zulip-venv-cache/*")
cov.start()
if options.profile:
import cProfile
prof = cProfile.Profile()
prof.enable()
subprocess.call(os.path.join(TOOLS_DIR, 'setup', 'generate-fixtures'))
TestRunner = get_runner(settings)
test_runner = TestRunner()
failures = test_runner.run_tests(suites, fatal_errors=options.fatal_errors)
templates_not_rendered = test_runner.get_shallow_tested_templates()
if templates_not_rendered:
missed_count = len(templates_not_rendered)
if options.no_shallow or options.verbose:
print("*** Shallow tested templates: {}".format(missed_count))
if options.verbose:
for template in templates_not_rendered:
print('--- {}'.format(template))
if options.no_shallow:
failures = True
if options.coverage:
cov.stop()
cov.save()
print("Printing coverage data")
cov.report(show_missing=False)
cov.html_report()
print("HTML report saved to htmlcov/")
if options.profile:
prof.disable()
prof.dump_stats("/tmp/profile.data")
print("Profile data saved to /tmp/profile.data")
print("You can visualize it using e.g. `runsnake /tmp/profile.data`")
if failures:
print('FAILED!')
else:
print('DONE!')
sys.exit(bool(failures))