{"id":46208872,"url":"https://github.com/devexperts/switchboard","last_synced_at":"2026-03-03T08:49:56.450Z","repository":{"id":47584367,"uuid":"351802965","full_name":"devexperts/switchboard","owner":"devexperts","description":"Toolset designed to collect, parse, filter and group automated tests from code, transform the result and perform the required further actions.","archived":false,"fork":false,"pushed_at":"2024-12-02T17:29:20.000Z","size":311,"stargazers_count":13,"open_issues_count":6,"forks_count":4,"subscribers_count":8,"default_branch":"main","last_synced_at":"2024-12-02T18:37:32.917Z","etag":null,"topics":["autotests","continuous-integration","testcase-generator","testrunner"],"latest_commit_sha":null,"homepage":"https://testfailed.com/switchboard","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/devexperts.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-03-26T14:07:52.000Z","updated_at":"2024-12-02T17:29:21.000Z","dependencies_parsed_at":"2024-12-02T18:39:34.349Z","dependency_job_id":null,"html_url":"https://github.com/devexperts/switchboard","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/devexperts/switchboard","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devexperts%2Fswitchboard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devexperts%2Fswitchboard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devexperts%2Fswitchboard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devexperts%2Fswitchboard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devexperts","download_url":"https://codeload.github.com/devexperts/switchboard/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devexperts%2Fswitchboard/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30038538,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-03T06:58:30.252Z","status":"ssl_error","status_checked_at":"2026-03-03T06:58:15.329Z","response_time":61,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["autotests","continuous-integration","testcase-generator","testrunner"],"created_at":"2026-03-03T08:49:55.781Z","updated_at":"2026-03-03T08:49:56.444Z","avatar_url":"https://github.com/devexperts.png","language":"Java","readme":"# Switchboard\n\n###### Test Case Processing Toolset\nSwitchboard is designed to collect, parse, filter and group tests from code,\ntransform the result and perform the required actions on it.\n\n## Concept\nThe toolset consists of an `API` module, a `Core` module, a `Runner` and an extendable set of `Integration` modules.\n\n##### Test\nAn entity representing a single test (e.g. TestNG or JUnit test, a Cucumber scenario, etc.) consisting of an identifier and its `Attributes`.\n\n##### TestRun\nAn entity representing a group of Tests consisting of an identifier, its `Attributes` and a set of tests.\n\n##### Integration\nEach Integration module provides specific features implementation or access to interaction with software,\ne.g. `cukes` integration can collect Cucumber test data from .feature files, `jira` integration provides access\nto Atlassian Jira REST API functionality etc.\nEach integration is autonomous and is run within its own classpath to evade dependency conflicts.\n\n##### IntegrationComponent\nAn implementation of a single atomic component of an integration.\nAll components are executed during integration run in the following sequence:\n- `TestExtractor` components supplying Tests from an external source, e.g. files, DB, URL etc.\n- `TestProcessor` components complementing, decoding, splitting etc. specified tests.\n- `TestFilter` components filtering processed Tests.\n- `TestSplitter` components splitting tests into TestRuns by specified attributes.\n- `TestRunProcessor` components processing (complementing, decoding, splitting etc) tests runs.\n- `TestRunConsumer` components consuming the prepared TestRuns (e.g. test runner, report collector etc.).\n  Each IntegrationComponent is run within the context of an integration it is specified in.\n\n## How to run\nA Switchboard is run by Runner module:\n```java -jar {path-to-runner-jar} -c {path-to-configuration} -i {path-to-libs}```\nwith 2 parameters:\n- -c - JSON configuration file path\n- -i - Paths to integration lib jars and/or directories with libs; glob pattern is supported.\n\nRunner executes all components marked as runnable (`\"runnable\": true` in JSON  config).\n\n## Configuration\nEach Integration or Integration set configuration is stored as a JSON, describing the structure,\nexecution order and execution parameters.\n\n### Example\nThis configuration will:\n- collect Cucumber test cases\n- filter tests marked with `MarkerAnnotation1` attribute\n- create test batches grouped by 5 tests at most\n- log the result into the console\n\n```yaml\n{\n  \"@class\": \"com.devexperts.switchboard.integrations.cukes.CukesIntegration\",\n  \"identifier\": \"CukesIntegration-1\",\n  \"runnable\": false,\n  \"testExtractors\": [\n    {\n      \"@class\": \"com.devexperts.switchboard.integrations.cukes.CukesTestExtractor\",\n      \"identifier\": \"CukesTestExtractor-1\",\n      \"testLocations\": [\n        \"src/test/resources/test_classes\"\n      ],\n      \"filePattern\": \"regex:.*.feature\",\n      \"cucumberNativeFilters\": \"\",\n      \"basePath\": \"src/test/resources\"\n    }\n  ],\n  \"testProcessors\": [],\n  \"testFilters\": [\n    {\n      \"@class\": \"com.devexperts.switchboard.impl.filters.AttributesFilter\",\n      \"identifier\": \"AttributesFilter-1\",\n      \"attributePredicate\": {\n        \"@class\": \"com.devexperts.switchboard.entities.attributes.AttributeIsPresent\",\n        \"attributeKeyRegex\": \"MarkerAnnotation1\"\n      }\n    }\n  ],\n  \"testSplitters\": [\n    {\n      \"@class\": \"com.devexperts.switchboard.impl.splitters.TestCountSplitter\",\n      \"identifier\": \"TestCountSplitter-1\",\n      \"count\": 5\n    }\n  ],\n  \"testRunProcessors\": [],\n  \"testRunConsumers\": [\n    {\n      \"@class\": \"com.devexperts.switchboard.impl.consumers.LoggingTestRunConsumer\",\n      \"identifier\": \"TestLoggingConsumer-1\"\n    }\n  ]\n}\n```\n\n##### ComponentReference\nAny integration components can be used in other Integrations using a `ComponentReference` wrapper.\nA special component type `ComponentReference` can be used to wrap a component of an integration\nexecuted during another Integration run. Component wrapped by ComponentReference is run within the context of its source integration.\n\n### Environment variables in the configuration\nIf a value in configuration should be resolved from the environment during execution the variable should be set as `%variable_name%`.\nHere's how you can set Jira password from `JIRA_PASSWORD` environment variable:\n```yaml\n[\n  {\n    \"@class\": \"com.devexperts.switchboard.integrations.javaparser.JavaParserIntegration\",\n    \"identifier\": \"JavaParserIntegration - runnable\",\n    \"runnable\": true,\n    ...\n    \"uri\": \"https://jira.somewhere.elsewhere.com\",\n    \"login\": \"somebody\",\n    \"password\": \"%JIRA_PASSWORD%\"\n  }\n]\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevexperts%2Fswitchboard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevexperts%2Fswitchboard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevexperts%2Fswitchboard/lists"}