Ejemplo n.º 1
0
def main(argv):
    
    wingtest_common.SetupSysArgv(argv)
    
    dirname = wingtest_common.process_directory_arg(argv)
    
    # Assume all args not starting with - are filenames for tests
    for i, arg in enumerate(argv):
        if not arg.startswith('-') and not os.path.isabs(arg):
            argv[i] = os.path.join(dirname, arg)
    
    argv.append('--nocapture')
    
    result = NoseTestResults(sys.stdout)
    runner = wingtest_common.XmlTestRunner(result)
    try:
        try:
            nose.run(argv=argv, testRunner=runner)
        except SystemExit:
            raise
        except Exception:
            # Note that import error from test files end up here, so this is
            # not just for runner exceptions
            if isinstance(xmlout, wingtest_common.XmlStream):
                xmlout._write_exc_info(sys.exc_info())
            else:
                exc_type, exc, tb = sys.exc_info()
                sys.excepthook(exc_type, exc, tb)
    finally:
        xmlout.finish()
Ejemplo n.º 2
0
def main(argv):
    sys.stderr.write(str(argv) + '\n')
    
    # XXX Hack to allow setting a different settings module for testing only
    if 'WING_TEST_DJANGO_SETTINGS_MODULE' in os.environ:
        os.environ['DJANGO_SETTINGS_MODULE'] = os.environ['WING_TEST_DJANGO_SETTINGS_MODULE']
        
    f, filename, info = imp.find_module('wingtest_common', [os.path.dirname(__file__)])
    try:
        wingtest_common = imp.load_module('wingtest_common', f, filename, info)
    finally:
        f.close()
        
    if 0:
        import wingtest_common
        
    class CDjangoXMLTestResult(wingtest_common.XmlTestResult):
        
        def startTest(self, test):
            unittest.TestResult.startTest(self, test)
            class_filename = self._testClassFilename(test)
            code_filename, lineno = self._sourceCodeLocation(test)
            if hasattr(test, '_dt_test'):
                name = test.id()
                if name.startswith('django.contrib.'):
                    name = name[len('django.contrib.'):]
                else:
                    parts = name.split('.')
                    name = '.'.join(parts[1:])
                parts = name.split('.')
                if '__test__' in name:
                    new_parts = []
                    for i, part in enumerate(parts):
                        if i+1 < len(parts) and parts[i+1] == '__test__':
                            pass
                        else:
                            new_parts.append(part)
                    name = '.'.join(new_parts)
                else:
                    name = '.'.join(parts[:-1]) + '.__test__'
            else:
                name = self._testDottedName(test)
            self.stream._start_test(name, class_filename,
                                    code_filename=code_filename, lineno=lineno)
            
        def _sourceCodeLocation(self, test):
            if hasattr(test, '_dt_test'):
                if not test._dt_test.lineno:
                    lineno = 0
                else:
                    lineno = test._dt_test.lineno
                return test._dt_test.filename, lineno
            else:
                return wingtest_common.XmlTestResult._sourceCodeLocation(self, test)

    testedModule = get_tested_module(argv)
    if testedModule.endswith('.__test__'):
        testedModule = testedModule[:-len('.__test__')]
    testedModuleList = testedModule and testedModule.split('.') or []
    manage_dir = init_django(argv)
    
    class MyXmlStream(wingtest_common.XmlStream):
        def _start_test(self, name, filename, lineno=None, code_filename=None):
            testPath, testFilename = os.path.split(filename)
            testPath = os.path.normpath(testPath)
            if testFilename == 'tests.py':
                appName = os.path.basename(testPath)
            else:
                appName = os.path.basename(os.path.dirname(testPath))
            if name.find('__test__') == -1 and appName != 'django':
                testname = '%s.%s' % (appName, name)
            else:
                testname = name
                if testname.endswith('__test__'):
                    parts = testname.split('.')
                    if len(parts) > 1:
                        testname = '.'.join(parts[:-1])
            sys.stderr.write('test: %s' % testname)
            
            super(MyXmlStream, self)._start_test(testname, os.path.join(manage_dir, 'manage.py'), 
                                                 lineno-1, code_filename)
                             
    xmlout = wingtest_common.CreateOutputStream(argv, xml_stream_cls=MyXmlStream)
    sys.stdout = sys.stderr = xmlout

    wingtest_common.process_directory_arg(argv)
    
    result = CDjangoXMLTestResult(sys.stdout)
    
    testedModule = '.'.join(testedModuleList[1:])
    test_labels = testedModule and [testedModule] or []
    # Add 'test' to sys.argv since some code uses it to decide if 
    # it's being tested or just run
    sys.argv = [os.path.join(manage_dir, 'manage.py'), 'test'] + test_labels
    sys.stderr.write(str(sys.argv) + '\n')
    
    from django.conf import settings
    try:
        from django.test.simple import DjangoTestRunner, DjangoTestSuiteRunner
        test_base = DjangoTestRunner
    except:
        try:
            # Django <= 1.7
            from django.test.simple import DjangoTestSuiteRunner
        except:
            # Django 1.8+
            import django
            django.setup()
            from django.test.utils import get_runner
            DjangoTestSuiteRunner = get_runner(settings)
        from unittest import TextTestRunner
        test_base = TextTestRunner

    # South (schema migration tool) does not use the 'test' command anymore
    if 'south' in settings.INSTALLED_APPS:

        try:
            # Older versions of South had this layout
            from south.management.commands.test import MigrateAndSyncCommand
        except ImportError:
            from south.management.commands import MigrateAndSyncCommand
        from django.core import management
        management.get_commands()
        
        # Point at the core syncdb command when creating tests; tests should
        # always be up to date with the most recent model structure
        if hasattr(settings, "SOUTH_TESTS_MIGRATE") and not settings.SOUTH_TESTS_MIGRATE:
            management._commands['syncdb'] = 'django.core'
        else:
            management._commands['syncdb'] = MigrateAndSyncCommand()
        
    class MyTestRunner(test_base):
        def __init__(self, testResult, **kwargs):
            super(MyTestRunner, self).__init__(**kwargs)
            self.testResult = testResult
            
        def _makeResult(self):
            return self.testResult

    class MyTestSuiteRunner(DjangoTestSuiteRunner):
        def __init__(self, testResult, **kwargs):
            super(MyTestSuiteRunner, self).__init__(**kwargs)
            self.testResult = testResult
            
        def run_suite(self, suite, **kwargs):
            return MyTestRunner(self.testResult, verbosity=self.verbosity, failfast=self.failfast).run(suite)
    
    runner = MyTestSuiteRunner(result, verbosity=0, interactive=False)
    try:
        try:
            failures = runner.run_tests(test_labels)
        except SystemExit:
            raise
        except Exception:
            # Note that import error from test files might end up here
            if isinstance(xmlout, MyXmlStream):
                xmlout._write_exc_info(sys.exc_info())
            else:
                exc_type, exc, tb = sys.exc_info()
                sys.excepthook(exc_type, exc, tb)
    finally:
        xmlout.finish()
Ejemplo n.º 3
0
def main(argv):
    sys.stderr.write(str(argv) + '\n')

    # XXX Hack to allow setting a different settings module for testing only
    if 'WING_TEST_DJANGO_SETTINGS_MODULE' in os.environ:
        os.environ['DJANGO_SETTINGS_MODULE'] = os.environ[
            'WING_TEST_DJANGO_SETTINGS_MODULE']

    f, filename, info = imp.find_module('wingtest_common',
                                        [os.path.dirname(__file__)])
    try:
        wingtest_common = imp.load_module('wingtest_common', f, filename, info)
    finally:
        f.close()

    if 0:
        import wingtest_common

    class CDjangoXMLTestResult(wingtest_common.XmlTestResult):
        def startTest(self, test):
            unittest.TestResult.startTest(self, test)
            class_filename = self._testClassFilename(test)
            code_filename, lineno = self._sourceCodeLocation(test)
            if hasattr(test, '_dt_test'):
                name = test.id()
                if name.startswith('django.contrib.'):
                    name = name[len('django.contrib.'):]
                else:
                    parts = name.split('.')
                    name = '.'.join(parts[1:])
                parts = name.split('.')
                if '__test__' in name:
                    new_parts = []
                    for i, part in enumerate(parts):
                        if i + 1 < len(parts) and parts[i + 1] == '__test__':
                            pass
                        else:
                            new_parts.append(part)
                    name = '.'.join(new_parts)
                else:
                    name = '.'.join(parts[:-1]) + '.__test__'
            else:
                name = self._testDottedName(test)
            self.stream._start_test(name,
                                    class_filename,
                                    code_filename=code_filename,
                                    lineno=lineno)

        def _sourceCodeLocation(self, test):
            if hasattr(test, '_dt_test'):
                if not test._dt_test.lineno:
                    lineno = 0
                else:
                    lineno = test._dt_test.lineno
                return test._dt_test.filename, lineno
            else:
                return wingtest_common.XmlTestResult._sourceCodeLocation(
                    self, test)

    testedModule = get_tested_module(argv)
    if testedModule.endswith('.__test__'):
        testedModule = testedModule[:-len('.__test__')]
    testedModuleList = testedModule and testedModule.split('.') or []
    manage_dir = init_django(argv)

    class MyXmlStream(wingtest_common.XmlStream):
        def _start_test(self, name, filename, lineno=None, code_filename=None):
            testPath, testFilename = os.path.split(filename)
            testPath = os.path.normpath(testPath)
            if testFilename == 'tests.py':
                appName = os.path.basename(testPath)
            else:
                appName = os.path.basename(os.path.dirname(testPath))
            if name.find('__test__') == -1 and appName != 'django':
                testname = '%s.%s' % (appName, name)
            else:
                testname = name
                if testname.endswith('__test__'):
                    parts = testname.split('.')
                    if len(parts) > 1:
                        testname = '.'.join(parts[:-1])
            sys.stderr.write('test: %s' % testname)

            super(MyXmlStream,
                  self)._start_test(testname,
                                    os.path.join(manage_dir, 'manage.py'),
                                    lineno - 1, code_filename)

    xmlout = wingtest_common.CreateOutputStream(argv,
                                                xml_stream_cls=MyXmlStream)
    sys.stdout = sys.stderr = xmlout

    wingtest_common.process_directory_arg(argv)

    result = CDjangoXMLTestResult(sys.stdout)

    testedModule = '.'.join(testedModuleList[1:])
    test_labels = testedModule and [testedModule] or []
    # Add 'test' to sys.argv since some code uses it to decide if
    # it's being tested or just run
    sys.argv = [os.path.join(manage_dir, 'manage.py'), 'test'] + test_labels
    sys.stderr.write(str(sys.argv) + '\n')

    from django.conf import settings
    try:
        from django.test.simple import DjangoTestRunner, DjangoTestSuiteRunner
        test_base = DjangoTestRunner
    except:
        try:
            # Django <= 1.7
            from django.test.simple import DjangoTestSuiteRunner
        except:
            # Django 1.8+
            import django
            django.setup()
            from django.test.utils import get_runner
            DjangoTestSuiteRunner = get_runner(settings)
        from unittest import TextTestRunner
        test_base = TextTestRunner

    # South (schema migration tool) does not use the 'test' command anymore
    if 'south' in settings.INSTALLED_APPS:

        try:
            # Older versions of South had this layout
            from south.management.commands.test import MigrateAndSyncCommand
        except ImportError:
            from south.management.commands import MigrateAndSyncCommand
        from django.core import management
        management.get_commands()

        # Point at the core syncdb command when creating tests; tests should
        # always be up to date with the most recent model structure
        if hasattr(settings,
                   "SOUTH_TESTS_MIGRATE") and not settings.SOUTH_TESTS_MIGRATE:
            management._commands['syncdb'] = 'django.core'
        else:
            management._commands['syncdb'] = MigrateAndSyncCommand()

    class MyTestRunner(test_base):
        def __init__(self, testResult, **kwargs):
            super(MyTestRunner, self).__init__(**kwargs)
            self.testResult = testResult

        def _makeResult(self):
            return self.testResult

    class MyTestSuiteRunner(DjangoTestSuiteRunner):
        def __init__(self, testResult, **kwargs):
            super(MyTestSuiteRunner, self).__init__(**kwargs)
            self.testResult = testResult

        def run_suite(self, suite, **kwargs):
            return MyTestRunner(self.testResult,
                                verbosity=self.verbosity,
                                failfast=self.failfast).run(suite)

    runner = MyTestSuiteRunner(result, verbosity=0, interactive=False)
    try:
        try:
            failures = runner.run_tests(test_labels)
        except SystemExit:
            raise
        except Exception:
            # Note that import error from test files might end up here
            if isinstance(xmlout, MyXmlStream):
                xmlout._write_exc_info(sys.exc_info())
            else:
                exc_type, exc, tb = sys.exc_info()
                sys.excepthook(exc_type, exc, tb)
    finally:
        xmlout.finish()