From bbae00a4804affa613da26d9fea498f5f5016ef9 Mon Sep 17 00:00:00 2001 From: John Eskew Date: Mon, 18 Sep 2017 15:15:42 -0400 Subject: [PATCH] Enable tox testing of system and commonlib via paver. Add support for django_version option to support Django 1.8/1.11. --- pavelib/tests.py | 66 +++++++++++++++++++---- pavelib/utils/test/suites/__init__.py | 2 +- pavelib/utils/test/suites/pytest_suite.py | 48 ++++++++++++++--- 3 files changed, 99 insertions(+), 17 deletions(-) diff --git a/pavelib/tests.py b/pavelib/tests.py index c0b06f0b5b..e2a2947803 100644 --- a/pavelib/tests.py +++ b/pavelib/tests.py @@ -30,6 +30,10 @@ __test__ = False # do not collect ("test-id=", "t", "Test id"), ("fail-fast", "x", "Fail suite on first failed test"), ("fasttest", "a", "Run without collectstatic"), + make_option( + "--django_version", dest="django_version", + help="Run against which Django version (1.8 -or- 1.11)." + ), make_option( "--eval-attr", dest="eval_attr", help="Only run tests matching given attribute expression." @@ -66,28 +70,61 @@ def test_system(options, passthrough_options): """ system = getattr(options, 'system', None) test_id = getattr(options, 'test_id', None) + django_version = getattr(options, 'django_version', None) + + assert(system in (None, 'lms', 'cms')) + assert(django_version in (None, '1.8', '1.11')) + + def _create_tox_system_test_suites(systems): + system_tests = [] + test_paths = [] + # Add all test directories for the specified systems. + for syst in systems: + test_paths.extend(suites.default_system_test_dirs(syst)) + # Remove all duplicate paths. + test_paths = list(set(test_paths)) + for test_id in test_paths: + system = test_id.split('/')[0] + syst = 'cms' + if system in ['common', 'openedx', 'lms']: + syst = 'lms' + system_tests.append(suites.SystemTestSuite( + syst, + passthrough_options=passthrough_options, + test_id=test_id, + **options.test_system + )) + return system_tests if test_id: + # Testing a single test ID. + # Ensure the proper system for the test id. if not system: system = test_id.split('/')[0] if system in ['common', 'openedx']: system = 'lms' - options.test_system['test_id'] = test_id - - if test_id or system: system_tests = [suites.SystemTestSuite( system, passthrough_options=passthrough_options, **options.test_system )] else: - system_tests = [] - for syst in ('cms', 'lms'): - system_tests.append(suites.SystemTestSuite( - syst, - passthrough_options=passthrough_options, - **options.test_system - )) + # Testing a single system -or- both systems. + if system: + systems = [system] + else: + # No specified system or test_id, so run all tests of both systems. + systems = ['cms', 'lms'] + if django_version: + system_tests = _create_tox_system_test_suites(systems) + else: + system_tests = [] + for syst in systems: + system_tests.append(suites.SystemTestSuite( + syst, + passthrough_options=passthrough_options, + **options.test_system + )) test_suite = suites.PythonTestSuite( 'python tests', @@ -107,6 +144,10 @@ def test_system(options, passthrough_options): ("test-id=", "t", "Test id"), ("failed", "f", "Run only failed tests"), ("fail-fast", "x", "Run only failed tests"), + make_option( + "--django_version", dest="django_version", + help="Run against which Django version (1.8 -or- 1.11)." + ), make_option( '-c', '--cov-args', default='', help='adds as args to coverage for the test run' @@ -124,8 +165,12 @@ def test_lib(options, passthrough_options): """ lib = getattr(options, 'lib', None) test_id = getattr(options, 'test_id', lib) + django_version = getattr(options, 'django_version', None) + + assert(django_version in (None, '1.8', '1.11')) if test_id: + # Testing a single test id. if '/' in test_id: lib = '/'.join(test_id.split('/')[0:3]) else: @@ -137,6 +182,7 @@ def test_lib(options, passthrough_options): **options.test_lib )] else: + # Testing all common/lib test dirs - plus pavelib. lib_tests = [ suites.LibTestSuite( d, diff --git a/pavelib/utils/test/suites/__init__.py b/pavelib/utils/test/suites/__init__.py index 7a84881d46..37f7f88765 100644 --- a/pavelib/utils/test/suites/__init__.py +++ b/pavelib/utils/test/suites/__init__.py @@ -2,7 +2,7 @@ TestSuite class and subclasses """ from .suite import TestSuite -from .pytest_suite import PytestSuite, SystemTestSuite, LibTestSuite +from .pytest_suite import PytestSuite, SystemTestSuite, LibTestSuite, default_system_test_dirs from .python_suite import PythonTestSuite from .js_suite import JsTestSuite from .acceptance_suite import AcceptanceTestSuite diff --git a/pavelib/utils/test/suites/pytest_suite.py b/pavelib/utils/test/suites/pytest_suite.py index 2872605b1d..9bf7a5f1bb 100644 --- a/pavelib/utils/test/suites/pytest_suite.py +++ b/pavelib/utils/test/suites/pytest_suite.py @@ -15,6 +15,27 @@ except ImportError: __test__ = False # do not collect +def default_system_test_dirs(system): + """ + Return a list of all directories in which pytest should begin a search for tests. + """ + default_test_dirs = [ + "{system}/djangoapps".format(system=system), + "common/djangoapps", + "openedx/core/djangoapps", + "openedx/tests", + "openedx/core/lib", + ] + if system in ('lms', 'cms'): + default_test_dirs.append("{system}/lib".format(system=system)) + + if system == 'lms': + default_test_dirs.append("{system}/tests.py".format(system=system)) + default_test_dirs.append("openedx/core/djangolib") + default_test_dirs.append("openedx/features") + return default_test_dirs + + class PytestSuite(TestSuite): """ A subclass of TestSuite with extra methods that are specific @@ -25,6 +46,13 @@ class PytestSuite(TestSuite): self.failed_only = kwargs.get('failed_only', False) self.fail_fast = kwargs.get('fail_fast', False) self.run_under_coverage = kwargs.get('with_coverage', True) + django_version = kwargs.get('django_version', None) + if django_version is None: + self.django_toxenv = None + elif django_version == '1.11': + self.django_toxenv = 'py27-django111' + else: + self.django_toxenv = 'py27-django18' self.report_dir = Env.REPORT_DIR / self.root # If set, put reports for run in "unique" directories. @@ -122,11 +150,15 @@ class SystemTestSuite(PytestSuite): @property def cmd(self): - cmd = [ - 'pytest', + if self.django_toxenv: + cmd = ['tox', '-e', self.django_toxenv, '--'] + else: + cmd = ['pytest'] + cmd.extend([ '--ds={}'.format('{}.envs.{}'.format(self.root, self.settings)), '--junitxml={}'.format(self.report_dir / "nosetests.xml"), - ] + self.test_options_flags + ]) + cmd.extend(self.test_options_flags) if self.verbosity < 1: cmd.append("--quiet") elif self.verbosity > 1: @@ -205,12 +237,16 @@ class LibTestSuite(PytestSuite): @property def cmd(self): - cmd = [ - "pytest", + if self.django_toxenv: + cmd = ['tox', '-e', self.django_toxenv, '--'] + else: + cmd = ['pytest'] + cmd.extend([ "-p", "no:randomly", "--junitxml=".format(self.xunit_report), - ] + self.passthrough_options + self.test_options_flags + ]) + cmd.extend(self.passthrough_options + self.test_options_flags) if self.verbosity < 1: cmd.append("--quiet") elif self.verbosity > 1: