diff --git a/docs/docsite/rst/dev_guide/testing_integration.rst b/docs/docsite/rst/dev_guide/testing_integration.rst index 82482b37e8..e0871a8af0 100644 --- a/docs/docsite/rst/dev_guide/testing_integration.rst +++ b/docs/docsite/rst/dev_guide/testing_integration.rst @@ -219,6 +219,11 @@ To run integration tests for a specific module:: ansible-test network-integration --inventory /path/to/ansible/test/integration/inventory.networking vyos_vlan +To run a single test case on a specific module:: + + # Only run vyos_vlan/tests/cli/basic.yaml + ansible-test network-integration --inventory /path/to/ansible/test/integration/inventory.networking vyos_vlan --testcase basic + To run integration tests for a specific transport:: # Only run nxapi test diff --git a/test/runner/lib/config.py b/test/runner/lib/config.py index a9e4bd011b..eb6b5f665e 100644 --- a/test/runner/lib/config.py +++ b/test/runner/lib/config.py @@ -193,6 +193,7 @@ class NetworkIntegrationConfig(IntegrationConfig): self.platform = args.platform # type: list [str] self.inventory = args.inventory # type: str + self.testcase = args.testcase # type: str class UnitsConfig(TestConfig): diff --git a/test/runner/lib/executor.py b/test/runner/lib/executor.py index 4c4f5f22a2..ed878caf75 100644 --- a/test/runner/lib/executor.py +++ b/test/runner/lib/executor.py @@ -943,6 +943,10 @@ def command_integration_role(args, target, start_at_task): if args.diff: cmd += ['--diff'] + if isinstance(args, NetworkIntegrationConfig): + if args.testcase: + cmd += ['-e', 'testcase=%s' % args.testcase] + if args.verbosity: cmd.append('-' + ('v' * args.verbosity)) diff --git a/test/runner/test.py b/test/runner/test.py index f6bbfee96a..c9a3b296fc 100755 --- a/test/runner/test.py +++ b/test/runner/test.py @@ -264,6 +264,10 @@ def parse_args(): metavar='PATH', help='path to inventory used for tests') + network_integration.add_argument('--testcase', + metavar='TESTCASE', + help='limit a test to a specified testcase').completer = complete_network_testcase + windows_integration = subparsers.add_parser('windows-integration', parents=[integration], help='windows integration tests') @@ -648,6 +652,31 @@ def complete_network_platform(prefix, parsed_args, **_): return [i for i in images if i.startswith(prefix) and (not parsed_args.platform or i not in parsed_args.platform)] +def complete_network_testcase(prefix, parsed_args, **_): + """ + :type prefix: unicode + :type parsed_args: any + :rtype: list[str] + """ + testcases = [] + + # since testcases are module specific, don't autocomplete if more than one + # module is specidied + if len(parsed_args.include) != 1: + return [] + + test_dir = 'test/integration/targets/%s/tests' % parsed_args.include[0] + connections = os.listdir(test_dir) + + for conn in connections: + if os.path.isdir(os.path.join(test_dir, conn)): + for testcase in os.listdir(os.path.join(test_dir, conn)): + if testcase.startswith(prefix): + testcases.append(testcase.split('.')[0]) + + return testcases + + def complete_sanity_test(prefix, parsed_args, **_): """ :type prefix: unicode