예제 #1
0
파일: cram.py 프로젝트: mcara/pandokia
 def handle_parser_options(self, opts):
     try:
         self.pdk_log = opts.pdk
     except AttributeError:
         try:
             self.pdk_log = os.environ['PDK_LOG']
         except KeyError:
             self.pdk_log = 'PDK.LOG'
     self.r = pycode.reporter(source_file=None,
                              filename=self.pdk_log,
                              test_runner='cram')
예제 #2
0
파일: cram.py 프로젝트: jhunkeler/pandokia
 def handle_parser_options(self, opts):
     try:
         self.pdk_log = opts.pdk
     except AttributeError:
         try:
             self.pdk_log = os.environ['PDK_LOG']
         except KeyError:
             self.pdk_log = 'PDK.LOG'
     self.r = pycode.reporter(
         source_file=None,
         filename=self.pdk_log,
         test_runner='cram')
예제 #3
0
 def __init__(self, fixed_filename):
     # open the pandokia log file. The same open file is used
     # for all tests being run.
     self.pdklog = pycode.reporter(fixed_filename)
예제 #4
0
def main(args):

    # We want to gather everything that happens into the test report.
    # Individual tests will suck up their own stdout, so it will
    # not end up in the output that belongs to the file.
    pycode.snarf_stdout()

    # status is pass unless something else happens
    file_status = 'P'

    # No arg processing because pandokia left everything we need
    # in the environment.
    filename = os.environ['PDK_FILE']

    # The module name is the basename of the file, without the extension.
    module_name = os.path.basename(filename)
    module_name = os.path.splitext(module_name)[0]

    file_start_time = time.time()

    if no_unittest2:
        print("%s Cannot import unittest2" % __file__)
        print(e)
        for x in sys.path:
            print("    %s" % x)
        file_status = 'E'

    else:
        # unittest2 is in very early stages of development.  Cry if we
        # don't see the version we expect, because there may be incompatible
        # changes in the future.
        if unittest2.__version__ not in unittest2_versions:
            print(
                'THIS IS NOT THE VERSION OF unittest2 THAT THE PANDOKIA RUNNER WAS WRITTEN FOR')
            print('HAVE  %s' % unittest2.__version__)
            print('EXPECT ONE OF %s' % unittest2_versions)
            file_status = 'E'   # to draw attention

        try:

            module = imp.load_source(module_name, filename)

            # This is a trick to pass a value to the initializer
            # pdk_test_result.  It would be hard to go through channels
            # because unittest2 does not have a concept for this particular
            # data.  I happen to know that it only makes a single TestRunner
            # object, so this is ok to do.
            pdk_runner.fixed_filename = module_name

            TestProgram(
                # module must be a loaded module to run tests from
                module=module,

                # argv must be a list with at least one element because
                # the TestProgram arg processing will try to read through
                # it whether we need it to or not.
                argv=['nop'],

                # provide it with our test runner, so it writes pandokia
                # logs instead of the default stuff to stdout
                testRunner=pdk_runner,

                # prevent it trying to exit when it is done
                exit=False,
            )

        # Yes, the whole file can fail or error.  This happens either
        # on import or when instantiating TestCase objects.
        except AssertionError:
            file_status = 'F'
            traceback.print_exc()

        except:
            file_status = 'E'
            traceback.print_exc()

    file_end_time = time.time()

    log = pycode.end_snarf_stdout()

    # We do not create the pandokia log entry object until after
    # everything is done.  Down inside unittest2, our code is going
    # to open the same log file.  It will close it before returning,
    # so we can open it here without conflicting.
    rpt = pycode.reporter(filename)

    # the name for the report on the file as a whole is derived from
    # the file name. the report object is already set up to do this,
    # so we do not need to provide any more parts of the test name.
    rpt.report(None, file_status, file_start_time, file_end_time, {}, {}, log)

    rpt.close()
예제 #5
0
def process_file(filename, test_name=None, test_args=None):

    global currently_running_file_name
    currently_running_file_name = filename

    if debug:
        debug_fd.write("begin process_file\n")
        debug_fd.write("file: %s\n" % filename)
        debug_fd.write("args: %s\n" % test_args)

    global dots_mode

    dots_mode = default_dots_mode

    if dots_mode:
        dots_file.write('File: %s\n' % filename)
        dots_file.flush()

    # the module name is the basename of the file, without the extension
    module_name = os.path.basename(filename)
    module_name = os.path.splitext(module_name)[0]

    # pandokia log entry object - writes the pandokia reports
    if debug:
        debug_fd.write("test_args %s\n" % test_args)

    # we have no name for the top level of the file - bummer
    currently_running_test_name.append(None)
    # print "PUSHED",None

    if test_name is not None:
        # if we have an explicit test name, then we are run outside
        # pdkrun.  We need to set the defaults.
        rpt = pycode.reporter(test_name, setdefault=True)
    else:
        rpt = pycode.reporter(filename)

    # the pycode context managers can make use of this.
    pycode.cached_rpt = rpt

    # gather up the stdout from processing the whole file.    individual
    # tests will suck up their own stdout, so it will not end up in
    # this log.
    pycode.snarf_stdout()

    #
    file_start_time = time.time()
    file_status = 'P'

    # make sure we can import from the directory where the file is
    sys_path_save = copy.copy(sys.path)
    sys.path.insert(0, os.path.dirname(filename))

    exception_str = None

    try:

        if debug:
            debug_fd.write("process_file: about to import %s %s\n" %
                           (module_name, filename))

        # import the module
        module = imp.load_source(module_name, filename)

        if debug:
            debug_fd.write("process_file: import succeeds\n")

        if test_args:
            if debug:
                debug_fd.write("entering minipyt_external_args into module\n")
            module.minipyt_external_args = test_args

        try:
            dots_mode = module.minipyt_dots_mode
        except:
            pass

        # these are both flags and the function objects for module
        # setup/teardown and pycode function
        setup = None

        try:
            setup = module.setUp
        except AttributeError:
            pass

        if setup is not None:
            if debug:
                debug_fd.write("process_file: running setUp")
            print "setUp"
            setup()

        # look through the module for things that might be tests
        if debug:
            debug_fd.write("process_file: inspect module namespace\n")
        l = []
        for name, ob in inspect.getmembers(
                module, inspect.isfunction) + inspect.getmembers(
                    module, inspect.isclass):
            if debug:
                debug_fd.write("process_file: inspect name %s\n" % name)

            try:
                # if it has minipyt_test, that value is a flag
                # about whether it is a test or not.
                n = getattr(ob, '__test__')
                if n:
                    rname = getattr(ob, '__test_name__', name)
                    l.append((rname, ob))
                continue
            except AttributeError:
                # if it does not have __test__, we consider
                # other criteria that may make it count as a test.
                pass

            # if the name looks like a test, it is a test
            if name.startswith('test') or name.endswith('test'):
                l.append((name, ob))

        # now we have a list of all the tests in the file

        # we have an opportunity to get them in the order they were
        # defined in the file, instead of alpha.  Just need to
        # figure out how.

        try:
            test_order = module.minipyt_test_order
        except:
            test_order = 'line'

        sort_test_list(l, test_order)

        for x in l:
            name, ob = x

            # default name is the object name

            # but use nose-compatible name, if present
            rname = getattr(ob, 'compat_func_name', name)

            # but use our explicitly defined name, if present
            rname = getattr(ob, '__test_name__', rname)

            # call the appropriate runner
            if type(ob) == function:
                print 'function', name, 'as', rname
                run_test_function(rpt, module, rname, ob)
            else:
                print 'class', name, 'as', rname
                run_test_class(rpt, module, name, ob, test_order)

        # look for a pycode function - call it if necessary
        #
        # pycode functions are obsolete, but we're keeping this until
        # we get rid of a few more tests that still use it.
        pycode_fn = None
        try:
            pycode_fn = module.pycode
        except AttributeError:
            pass

        if callable(pycode_fn):
            print 'old-style pycode test detected'
            pycode_fn(1, rpt=rpt)

        print 'tests completed'

        # look for a teardown function - call it if necessary
        teardown = None

        try:
            teardown = module.tearDown
        except AttributeError:
            pass

        if teardown:
            print "tearDown"
            teardown()

    except AssertionError:
        file_status = 'F'
        traceback.print_exc()
    except:
        file_status = 'E'
        traceback.print_exc()

    # restore sys.path
    sys.path = sys_path_save

    log = pycode.end_snarf_stdout()
    file_end_time = time.time()

    tda = {}
    tra = {}

    try:
        tda = module.module_tda
    except:
        pass

    try:
        tra = module.module_tra
    except:
        pass

    if exception_str is not None:
        tra['exception'] = exception_str

    # the name for the report on the file as a whole is derived from
    # the file name. the report object is already set up to do this,
    # so we do not need to provide any more parts of the test name.
    gen_report(rpt, None, file_status, file_start_time, file_end_time, tda,
               tra, log)

    rpt.close()

    # now that we have closed it, we can't allow anyone else to use it.
    pycode.cached_rpt = None

    if dots_mode != 'N':
        dots_file.write('\n')
        dots_file.flush()

    if debug:
        debug_fd.write("End process_file\n")
예제 #6
0
 def __init__(self, fixed_filename):
     # open the pandokia log file. The same open file is used
     # for all tests being run.
     self.pdklog = pycode.reporter(fixed_filename)
예제 #7
0
def main(args):

    # We want to gather everything that happens into the test report.
    # Individual tests will suck up their own stdout, so it will
    # not end up in the output that belongs to the file.
    pycode.snarf_stdout()

    # status is pass unless something else happens
    file_status = 'P'

    # No arg processing because pandokia left everything we need
    # in the environment.
    filename = os.environ['PDK_FILE']

    # The module name is the basename of the file, without the extension.
    module_name = os.path.basename(filename)
    module_name = os.path.splitext(module_name)[0]

    file_start_time = time.time()

    if no_unittest2:
        print("%s Cannot import unittest2" % __file__)
        print(e)
        for x in sys.path:
            print("    %s" % x)
        file_status = 'E'

    else:
        # unittest2 is in very early stages of development.  Cry if we
        # don't see the version we expect, because there may be incompatible
        # changes in the future.
        if unittest2.__version__ not in unittest2_versions:
            print(
                'THIS IS NOT THE VERSION OF unittest2 THAT THE PANDOKIA RUNNER WAS WRITTEN FOR'
            )
            print('HAVE  %s' % unittest2.__version__)
            print('EXPECT ONE OF %s' % unittest2_versions)
            file_status = 'E'  # to draw attention

        try:

            module = imp.load_source(module_name, filename)

            # This is a trick to pass a value to the initializer
            # pdk_test_result.  It would be hard to go through channels
            # because unittest2 does not have a concept for this particular
            # data.  I happen to know that it only makes a single TestRunner
            # object, so this is ok to do.
            pdk_runner.fixed_filename = module_name

            TestProgram(
                # module must be a loaded module to run tests from
                module=module,

                # argv must be a list with at least one element because
                # the TestProgram arg processing will try to read through
                # it whether we need it to or not.
                argv=['nop'],

                # provide it with our test runner, so it writes pandokia
                # logs instead of the default stuff to stdout
                testRunner=pdk_runner,

                # prevent it trying to exit when it is done
                exit=False,
            )

        # Yes, the whole file can fail or error.  This happens either
        # on import or when instantiating TestCase objects.
        except AssertionError:
            file_status = 'F'
            traceback.print_exc()

        except:
            file_status = 'E'
            traceback.print_exc()

    file_end_time = time.time()

    log = pycode.end_snarf_stdout()

    # We do not create the pandokia log entry object until after
    # everything is done.  Down inside unittest2, our code is going
    # to open the same log file.  It will close it before returning,
    # so we can open it here without conflicting.
    rpt = pycode.reporter(filename)

    # the name for the report on the file as a whole is derived from
    # the file name. the report object is already set up to do this,
    # so we do not need to provide any more parts of the test name.
    rpt.report(None, file_status, file_start_time, file_end_time, {}, {}, log)

    rpt.close()