Ejemplo n.º 1
0
from testplan.common import entity
from testplan.common.utils import path
from testplan.common.utils import testing
from testplan.common.utils.thread import Barrier
from testplan.testing import multitest
from testplan.testing import filtering
from testplan.testing import ordering
from testplan import defaults
from testplan import report


# TODO: shouldn't need to specify these...
MTEST_DEFAULT_PARAMS = {
    "test_filter": filtering.Filter(),
    "test_sorter": ordering.NoopSorter(),
    "stdout_style": defaults.STDOUT_STYLE,
}


def test_multitest_runpath():
    """Test setting of runpath."""

    class Parent(object):
        def __init__(self, runpath):
            self.runpath = runpath

    global_runpath = os.path.join("", "var", "tmp", "global_level")
    local_runpath = os.path.join("", "var", "tmp", "local_runpath")

    par = Parent(global_runpath)
Ejemplo n.º 2
0
    def __init__(self,
                 name,
                 description=None,
                 parse_cmdline=True,
                 parser=TestplanParser,
                 interactive_port=None,
                 abort_signals=None,
                 logger_level=logger.TEST_INFO,
                 file_log_level=logger.DEBUG,
                 runpath=path.default_runpath,
                 path_cleanup=True,
                 all_tasks_local=False,
                 shuffle=None,
                 shuffle_seed=float(random.randint(1, 9999)),
                 exporters=None,
                 stdout_style=defaults.STDOUT_STYLE,
                 report_dir=defaults.REPORT_DIR,
                 xml_dir=None,
                 json_path=None,
                 http_url=None,
                 pdf_path=None,
                 pdf_style=defaults.PDF_STYLE,
                 report_tags=None,
                 report_tags_all=None,
                 merge_scheduled_parts=False,
                 browse=False,
                 ui_port=None,
                 web_server_startup_timeout=defaults.WEB_SERVER_TIMEOUT,
                 test_filter=filtering.Filter(),
                 test_sorter=ordering.NoopSorter(),
                 test_lister=None,
                 verbose=False,
                 debug=False,
                 timeout=defaults.TESTPLAN_TIMEOUT,
                 interactive_handler=TestRunnerIHandler,
                 extra_deps=None,
                 label=None,
                 **options):

        # Set mutable defaults.
        if abort_signals is None:
            abort_signals = entity.DEFAULT_RUNNABLE_ABORT_SIGNALS[:]
        if shuffle is None:
            shuffle = []
        if extra_deps is None:
            extra_deps = []
        if report_tags is None:
            report_tags = []
        if report_tags_all is None:
            report_tags_all = []

        # Define instance attributes
        self._parsed_args = argparse.Namespace()
        self._processed_args = {}
        self._default_options = {}

        super(Testplan, self).__init__(
            name=name,
            description=description,
            parse_cmdline=parse_cmdline,
            parser=parser,
            interactive_port=interactive_port,
            abort_signals=abort_signals,
            logger_level=logger_level,
            file_log_level=file_log_level,
            runpath=runpath,
            path_cleanup=path_cleanup,
            all_tasks_local=all_tasks_local,
            shuffle=shuffle,
            shuffle_seed=shuffle_seed,
            exporters=exporters,
            stdout_style=stdout_style,
            report_dir=report_dir,
            xml_dir=xml_dir,
            json_path=json_path,
            http_url=http_url,
            pdf_path=pdf_path,
            pdf_style=pdf_style,
            report_tags=report_tags,
            report_tags_all=report_tags_all,
            merge_scheduled_parts=merge_scheduled_parts,
            browse=browse,
            ui_port=ui_port,
            web_server_startup_timeout=web_server_startup_timeout,
            test_filter=test_filter,
            test_sorter=test_sorter,
            test_lister=test_lister,
            verbose=verbose,
            debug=debug,
            timeout=timeout,
            interactive_handler=interactive_handler,
            extra_deps=extra_deps,
            label=label,
            **options)

        # By default, a LocalRunner is added to store and execute the tests.
        self._runnable.add_resource(LocalRunner(), uid="local_runner")

        # Stores independent environments.
        self._runnable.add_resource(Environments(), uid="environments")
Ejemplo n.º 3
0
    def main_wrapper(cls,
                     name,
                     description=None,
                     parse_cmdline=True,
                     parser=TestplanParser,
                     interactive_port=None,
                     abort_signals=None,
                     logger_level=logger.TEST_INFO,
                     file_log_level=logger.DEBUG,
                     runpath=path.default_runpath,
                     path_cleanup=True,
                     all_tasks_local=False,
                     shuffle=None,
                     shuffle_seed=float(random.randint(1, 9999)),
                     exporters=None,
                     stdout_style=defaults.STDOUT_STYLE,
                     report_dir=defaults.REPORT_DIR,
                     xml_dir=None,
                     json_path=None,
                     http_url=None,
                     pdf_path=None,
                     pdf_style=defaults.PDF_STYLE,
                     report_tags=None,
                     report_tags_all=None,
                     merge_scheduled_parts=False,
                     browse=False,
                     ui_port=None,
                     web_server_startup_timeout=defaults.WEB_SERVER_TIMEOUT,
                     test_filter=filtering.Filter(),
                     test_sorter=ordering.NoopSorter(),
                     test_lister=None,
                     verbose=False,
                     debug=False,
                     timeout=defaults.TESTPLAN_TIMEOUT,
                     interactive_handler=TestRunnerIHandler,
                     extra_deps=None,
                     label=None,
                     **options):
        """
        Decorator that will be used for wrapping `main` methods in test scripts.

        It accepts all arguments of a
        :py:class:`~testplan.base.Testplan` entity.
        """
        def test_plan_inner(definition):
            """
            This is being passed the user-defined testplan entry point.
            """
            def test_plan_inner_inner():
                """
                This is the callable returned in the end, it executes the plan
                and the associated reporting
                """
                plan = cls(
                    name=name,
                    description=description,
                    parse_cmdline=parse_cmdline,
                    parser=parser,
                    interactive_port=interactive_port,
                    abort_signals=abort_signals,
                    logger_level=logger_level,
                    file_log_level=file_log_level,
                    runpath=runpath,
                    path_cleanup=path_cleanup,
                    all_tasks_local=all_tasks_local,
                    shuffle=shuffle,
                    shuffle_seed=shuffle_seed,
                    exporters=exporters,
                    stdout_style=stdout_style,
                    report_dir=report_dir,
                    xml_dir=xml_dir,
                    json_path=json_path,
                    http_url=http_url,
                    pdf_path=pdf_path,
                    pdf_style=pdf_style,
                    report_tags=report_tags,
                    report_tags_all=report_tags_all,
                    merge_scheduled_parts=merge_scheduled_parts,
                    browse=browse,
                    ui_port=ui_port,
                    web_server_startup_timeout=web_server_startup_timeout,
                    test_filter=test_filter,
                    test_sorter=test_sorter,
                    test_lister=test_lister,
                    verbose=verbose,
                    debug=debug,
                    timeout=timeout,
                    interactive_handler=interactive_handler,
                    extra_deps=extra_deps,
                    label=label,
                    **options)
                try:
                    if arity(definition) == 2:
                        returned = definition(plan, plan.parser)
                    else:
                        returned = definition(plan)
                except Exception:
                    print("Exception in test_plan definition, aborting plan..")
                    plan.abort()
                    raise

                plan_result = plan.run()
                plan_result.decorated_value = returned
                return plan_result

            return test_plan_inner_inner

        return test_plan_inner
Ejemplo n.º 4
0
    @testcase
    def test_aaa(self, env, result):
        pass

    @testcase(parameters=[3, 2, 1])
    def test_yyy(self, env, result, val):
        pass


@pytest.mark.parametrize(
    "sorter, report_ctx",
    (
        # Case 1, noop, original declaration & insertion order
        (
            ordering.NoopSorter(),
            [(
                "Multitest",
                [
                    (
                        "Beta",
                        [
                            "test_ccc",
                            "test_xxx",
                            (
                                "test_bbb",
                                ["test_bbb <val=0>", "test_bbb <val=1>"],
                            ),
                            "test_aaa",
                            (
                                "test_yyy",
Ejemplo n.º 5
0
 def get_options(cls):
     return {
         'name':
         str,
         ConfigOption('description', default=None):
         Or(str, None),
         ConfigOption('logger_level', default=logger.TEST_INFO):
         int,
         ConfigOption('file_log_level', default=logger.DEBUG):
         Or(int, None),
         ConfigOption(
             'runpath',
             default=default_runpath,
         ):
         Or(None, str, lambda x: callable(x)),
         ConfigOption('path_cleanup', default=True):
         bool,
         ConfigOption('all_tasks_local', default=False):
         bool,
         ConfigOption('shuffle', default=[]):
         list,  # list of string choices
         ConfigOption('shuffle_seed',
                      default=float(random.randint(1, 9999))):
         float,
         ConfigOption('exporters', default=None):
         Use(get_exporters),
         ConfigOption('stdout_style', default=defaults.STDOUT_STYLE):
         Style,
         ConfigOption('report_dir', default=defaults.REPORT_DIR):
         Or(str, None),
         ConfigOption(
             'xml_dir',
             default=None,
         ):
         Or(str, None),
         ConfigOption(
             'pdf_path',
             default=None,
         ):
         Or(str, None),
         ConfigOption(
             'json_path',
             default=None,
         ):
         Or(str, None),
         ConfigOption('http_url', default=None):
         Or(str, None),
         ConfigOption(
             'pdf_style',
             default=defaults.PDF_STYLE,
         ):
         Style,
         ConfigOption('report_tags', default=[]):
         [Use(tagging.validate_tag_value)],
         ConfigOption('report_tags_all', default=[]):
         [Use(tagging.validate_tag_value)],
         ConfigOption('merge_scheduled_parts', default=False):
         bool,
         ConfigOption('browse', default=None):
         Or(None, bool),
         ConfigOption('ui_port', default=None):
         Or(None, int),
         ConfigOption('web_server_startup_timeout',
                      default=defaults.WEB_SERVER_TIMEOUT):
         int,
         ConfigOption('test_filter', default=filtering.Filter()):
         filtering.BaseFilter,
         ConfigOption('test_sorter', default=ordering.NoopSorter()):
         ordering.BaseSorter,
         # Test lister is None by default, otherwise Testplan would
         # list tests, not run them
         ConfigOption('test_lister', default=None):
         Or(None, listing.BaseLister),
         ConfigOption('verbose', default=False):
         bool,
         ConfigOption('debug', default=False):
         bool,
         ConfigOption('timeout', default=None):
         Or(None, And(Or(int, float), lambda t: t >= 0)),
         ConfigOption('interactive_handler', default=TestRunnerIHandler):
         object,
         ConfigOption('extra_deps', default=[]):
         list
     }
Ejemplo n.º 6
0
 def get_options(cls):
     return {
         "name":
         str,
         ConfigOption("description", default=None):
         Or(str, None),
         ConfigOption("logger_level", default=logger.TEST_INFO):
         int,
         ConfigOption("file_log_level", default=logger.DEBUG):
         int,
         ConfigOption("runpath", default=default_runpath):
         Or(None, str, lambda x: callable(x)),
         ConfigOption("path_cleanup", default=True):
         bool,
         ConfigOption("all_tasks_local", default=False):
         bool,
         ConfigOption("shuffle", default=[]):
         list,  # list of string choices
         ConfigOption("shuffle_seed",
                      default=float(random.randint(1, 9999))):
         float,
         ConfigOption("exporters", default=None):
         Use(get_exporters),
         ConfigOption("stdout_style", default=defaults.STDOUT_STYLE):
         Style,
         ConfigOption("report_dir", default=defaults.REPORT_DIR):
         Or(str, None),
         ConfigOption("xml_dir", default=None):
         Or(str, None),
         ConfigOption("pdf_path", default=None):
         Or(str, None),
         ConfigOption("json_path", default=None):
         Or(str, None),
         ConfigOption("http_url", default=None):
         Or(str, None),
         ConfigOption("pdf_style", default=defaults.PDF_STYLE):
         Style,
         ConfigOption("report_tags", default=[]):
         [Use(tagging.validate_tag_value)],
         ConfigOption("report_tags_all", default=[]):
         [Use(tagging.validate_tag_value)],
         ConfigOption("merge_scheduled_parts", default=False):
         bool,
         ConfigOption("browse", default=False):
         bool,
         ConfigOption("ui_port", default=None):
         Or(None, int),
         ConfigOption(
             "web_server_startup_timeout",
             default=defaults.WEB_SERVER_TIMEOUT,
         ):
         int,
         ConfigOption("test_filter", default=filtering.Filter()):
         filtering.BaseFilter,
         ConfigOption("test_sorter", default=ordering.NoopSorter()):
         ordering.BaseSorter,
         # Test lister is None by default, otherwise Testplan would
         # list tests, not run them
         ConfigOption("test_lister", default=None):
         Or(None, listing.BaseLister),
         ConfigOption("verbose", default=False):
         bool,
         ConfigOption("debug", default=False):
         bool,
         ConfigOption("timeout", default=defaults.TESTPLAN_TIMEOUT):
         Or(None, And(int, lambda t: t >= 0)),
         # active_loop_sleep impacts cpu usage in interactive mode
         ConfigOption("active_loop_sleep", default=0.05):
         float,
         ConfigOption("interactive_handler", default=TestRunnerIHandler):
         object,
         ConfigOption("extra_deps", default=[]):
         [Or(str, lambda x: inspect.ismodule(x))],
         ConfigOption("label", default=None):
         Or(None, str),
     }
Ejemplo n.º 7
0
    'Secondary',
    '  Gamma',
    '    test_c',
    '    test_b',
    '    test_a',
)


@pytest.mark.parametrize(
    'listing_obj,filter_obj,sorter_obj,expected_output',
    [
        # Basic name listing
        (
            listing.ExpandedNameLister(),
            filtering.Filter(),
            ordering.NoopSorter(),
            DEFAULT_NAME_OUTPUT,
        ),
        # Basic pattern listing
        (listing.ExpandedPatternLister(), filtering.Filter(),
         ordering.NoopSorter(), DEFAULT_PATTERN_OUTPUT),
        # Basic count listing
        (listing.CountLister(), filtering.Filter(), ordering.NoopSorter(),
         to_stdout(
             'Primary: (2 suites, 6 testcases)',
             'Secondary: (1 suite, 3 testcases)',
         )),
        # Custom sort & name listing
        (listing.ExpandedNameLister(), filtering.Filter(),
         ordering.AlphanumericSorter(),
         to_stdout(
Ejemplo n.º 8
0
 def get_options(cls):
     return {
         'name':
         str,
         ConfigOption('logger_level', default=TEST_INFO):
         int,
         ConfigOption('runpath',
                      default=default_runpath,
                      block_propagation=False):
         Or(None, str, lambda x: callable(x)),
         ConfigOption('path_cleanup', default=True):
         bool,
         ConfigOption('all_tasks_local', default=False):
         bool,
         ConfigOption('shuffle', default=[]):
         list,  # list of string choices
         ConfigOption('shuffle_seed',
                      default=float(random.randint(1, 9999))):
         float,
         ConfigOption('exporters', default=None):
         Use(get_exporters),
         ConfigOption('stdout_style',
                      default=defaults.STDOUT_STYLE,
                      block_propagation=False):
         Style,
         ConfigOption('report_dir',
                      default=defaults.REPORT_DIR,
                      block_propagation=False):
         str,
         ConfigOption('xml_dir', default=None, block_propagation=False):
         Or(str, None),
         ConfigOption('pdf_path', default=None, block_propagation=False):
         Or(str, None),
         ConfigOption('json_path', default=None, block_propagation=False):
         Or(str, None),
         ConfigOption('pdf_style',
                      default=defaults.PDF_STYLE,
                      block_propagation=False):
         Style,
         ConfigOption('report_tags', default=[], block_propagation=False):
         [Use(tagging.validate_tag_value)],
         ConfigOption('report_tags_all',
                      default=[],
                      block_propagation=False):
         [Use(tagging.validate_tag_value)],
         ConfigOption('browse', default=False):
         bool,
         ConfigOption('test_filter',
                      default=filtering.Filter(),
                      block_propagation=False):
         filtering.BaseFilter,
         ConfigOption('test_sorter',
                      default=ordering.NoopSorter(),
                      block_propagation=False):
         ordering.BaseSorter,
         # Test lister is None by default, otherwise Testplan would
         # list tests, not run them
         ConfigOption('test_lister', default=None, block_propagation=False):
         Or(None, listing.BaseLister),
         ConfigOption('verbose', default=False, block_propagation=False):
         bool,
         ConfigOption('debug', default=False, block_propagation=False):
         bool
     }