Skip to content

Split Tests

Actions

About

Splits test suite for parallelization with equal time
v1
Latest
Star (33)

split-tests

Github Action for splitting a test suite into equal time groups for parallel execution.

Introduction

This actions allows you to split up a suite of tests so they can be executed in parallel across a fleet of runners. The overall goal is to reduce developer feedback time by distributing the load.

Runs on ubuntu (Linux) runners only — split_tests is installed as a Linux binary.

Usage

Splitting Methods

File Count (Default)

This is a naive split into an even number of files per group. It is the default splitting method.

Line Count

Another naive split, but this time based on the number of lines per test. It is used by setting line-count: true

JUnit Report

This is the most intelligent split mechanism, using previous execution durations for each test from the JUnit report. It is used by setting the junit-path to the location of a previous execution's JUnit results report in your repository

Inputs

NAMEDESCRIPTIONTYPEREQUIREDDEFAULT
split-indexIndex of this instance executing the testsinteger
split-totalTotal number of instances executing the testsinteger
globGlob pattern to find test files (default "spec/**/*_spec.rb")stringspec/**/*_spec.rb
exclude-globGlob pattern to exclude test filesstring""
junit-pathPath to a JUnit XML report to use for test timingsstring""
line-countUse line count to estimate test durationboolfalse

Outputs

NAMEDESCRIPTIONTYPE
test-suiteA subset of tests, based on the the split index and split typestring
split-indexIndex of this instance executing the testsnumber
split-totalTotal number of instances executing the testsnumber

Example Workflow

env:
total-runners: 5jobs:
runner-indexes:
runs-on: ubuntu-latestname: Generate runner indexesoutputs:
json: ${{ steps.generate-index-list.outputs.json }}steps:
- id: generate-index-listrun: | MAX_INDEX=$((${{ env.total-runners }}-1)) INDEX_LIST=$(seq 0 ${MAX_INDEX}) INDEX_JSON=$(jq --null-input --compact-output '. |= [inputs]' <<< ${INDEX_LIST}) echo "json=${INDEX_JSON}" >> "$GITHUB_OUTPUT"run-parallel-tests:
runs-on: ubuntu-latestname: "Runner #${{ matrix.runner-index }}: Run test suite in parallel"needs:
- runner-indexesstrategy:
matrix:
runner-index: ${{ fromjson(needs.runner-indexes.outputs.json) }}steps:
- uses: actions/checkout@v4
- uses: scruplelesswizard/split-tests@v1id: split-testsname: Split testswith:
glob: examples/spec/**/*_spec.rbsplit-total: ${{ env.total-runners }}split-index: ${{ matrix.runner-index }}
- run: 'echo "This runner will execute the following tests: ${{ steps.split-tests.outputs.test-suite }}"'

The complete workflow can be found at .github/workflows/example.yaml

Dependencies

This action uses leonid-shevtsov/split_tests under-the-hood to accomplish the test splitting

Split Tests is not certified by GitHub. It is provided by a third-party and is governed by separate terms of service, privacy policy, and support documentation.

About

Splits test suite for parallelization with equal time
v1
Latest

Split Tests is not certified by GitHub. It is provided by a third-party and is governed by separate terms of service, privacy policy, and support documentation.

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Split Tests · Actions · GitHub Marketplace · GitHub
Skip to content

Split Tests

Actions

About

Splits test suite for parallelization with equal time
v1
Latest
Star (33)

split-tests

Github Action for splitting a test suite into equal time groups for parallel execution.

Introduction

This actions allows you to split up a suite of tests so they can be executed in parallel across a fleet of runners. The overall goal is to reduce developer feedback time by distributing the load.

Runs on ubuntu (Linux) runners only — split_tests is installed as a Linux binary.

Usage

Splitting Methods

File Count (Default)

This is a naive split into an even number of files per group. It is the default splitting method.

Line Count

Another naive split, but this time based on the number of lines per test. It is used by setting line-count: true

JUnit Report

This is the most intelligent split mechanism, using previous execution durations for each test from the JUnit report. It is used by setting the junit-path to the location of a previous execution's JUnit results report in your repository

Inputs

NAMEDESCRIPTIONTYPEREQUIREDDEFAULT
split-indexIndex of this instance executing the testsinteger
split-totalTotal number of instances executing the testsinteger
globGlob pattern to find test files (default "spec/**/*_spec.rb")stringspec/**/*_spec.rb
exclude-globGlob pattern to exclude test filesstring""
junit-pathPath to a JUnit XML report to use for test timingsstring""
line-countUse line count to estimate test durationboolfalse

Outputs

NAMEDESCRIPTIONTYPE
test-suiteA subset of tests, based on the the split index and split typestring
split-indexIndex of this instance executing the testsnumber
split-totalTotal number of instances executing the testsnumber

Example Workflow

env:
total-runners: 5jobs:
runner-indexes:
runs-on: ubuntu-latestname: Generate runner indexesoutputs:
json: ${{ steps.generate-index-list.outputs.json }}steps:
- id: generate-index-listrun: | MAX_INDEX=$((${{ env.total-runners }}-1)) INDEX_LIST=$(seq 0 ${MAX_INDEX}) INDEX_JSON=$(jq --null-input --compact-output '. |= [inputs]' <<< ${INDEX_LIST}) echo "json=${INDEX_JSON}" >> "$GITHUB_OUTPUT"run-parallel-tests:
runs-on: ubuntu-latestname: "Runner #${{ matrix.runner-index }}: Run test suite in parallel"needs:
- runner-indexesstrategy:
matrix:
runner-index: ${{ fromjson(needs.runner-indexes.outputs.json) }}steps:
- uses: actions/checkout@v4
- uses: scruplelesswizard/split-tests@v1id: split-testsname: Split testswith:
glob: examples/spec/**/*_spec.rbsplit-total: ${{ env.total-runners }}split-index: ${{ matrix.runner-index }}
- run: 'echo "This runner will execute the following tests: ${{ steps.split-tests.outputs.test-suite }}"'

The complete workflow can be found at .github/workflows/example.yaml

Dependencies

This action uses leonid-shevtsov/split_tests under-the-hood to accomplish the test splitting

Split Tests is not certified by GitHub. It is provided by a third-party and is governed by separate terms of service, privacy policy, and support documentation.

About

Splits test suite for parallelization with equal time
v1
Latest

Split Tests is not certified by GitHub. It is provided by a third-party and is governed by separate terms of service, privacy policy, and support documentation.

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Split Tests · Actions · GitHub Marketplace · GitHub
Skip to content

Split Tests

Actions

About

Splits test suite for parallelization with equal time
v1
Latest
Star (33)

split-tests

Github Action for splitting a test suite into equal time groups for parallel execution.

Introduction

This actions allows you to split up a suite of tests so they can be executed in parallel across a fleet of runners. The overall goal is to reduce developer feedback time by distributing the load.

Runs on ubuntu (Linux) runners only — split_tests is installed as a Linux binary.

Usage

Splitting Methods

File Count (Default)

This is a naive split into an even number of files per group. It is the default splitting method.

Line Count

Another naive split, but this time based on the number of lines per test. It is used by setting line-count: true

JUnit Report

This is the most intelligent split mechanism, using previous execution durations for each test from the JUnit report. It is used by setting the junit-path to the location of a previous execution's JUnit results report in your repository

Inputs

NAMEDESCRIPTIONTYPEREQUIREDDEFAULT
split-indexIndex of this instance executing the testsinteger
split-totalTotal number of instances executing the testsinteger
globGlob pattern to find test files (default "spec/**/*_spec.rb")stringspec/**/*_spec.rb
exclude-globGlob pattern to exclude test filesstring""
junit-pathPath to a JUnit XML report to use for test timingsstring""
line-countUse line count to estimate test durationboolfalse

Outputs

NAMEDESCRIPTIONTYPE
test-suiteA subset of tests, based on the the split index and split typestring
split-indexIndex of this instance executing the testsnumber
split-totalTotal number of instances executing the testsnumber

Example Workflow

env:
total-runners: 5jobs:
runner-indexes:
runs-on: ubuntu-latestname: Generate runner indexesoutputs:
json: ${{ steps.generate-index-list.outputs.json }}steps:
- id: generate-index-listrun: | MAX_INDEX=$((${{ env.total-runners }}-1)) INDEX_LIST=$(seq 0 ${MAX_INDEX}) INDEX_JSON=$(jq --null-input --compact-output '. |= [inputs]' <<< ${INDEX_LIST}) echo "json=${INDEX_JSON}" >> "$GITHUB_OUTPUT"run-parallel-tests:
runs-on: ubuntu-latestname: "Runner #${{ matrix.runner-index }}: Run test suite in parallel"needs:
- runner-indexesstrategy:
matrix:
runner-index: ${{ fromjson(needs.runner-indexes.outputs.json) }}steps:
- uses: actions/checkout@v4
- uses: scruplelesswizard/split-tests@v1id: split-testsname: Split testswith:
glob: examples/spec/**/*_spec.rbsplit-total: ${{ env.total-runners }}split-index: ${{ matrix.runner-index }}
- run: 'echo "This runner will execute the following tests: ${{ steps.split-tests.outputs.test-suite }}"'

The complete workflow can be found at .github/workflows/example.yaml

Dependencies

This action uses leonid-shevtsov/split_tests under-the-hood to accomplish the test splitting

Split Tests is not certified by GitHub. It is provided by a third-party and is governed by separate terms of service, privacy policy, and support documentation.

About

Splits test suite for parallelization with equal time
v1
Latest

Split Tests is not certified by GitHub. It is provided by a third-party and is governed by separate terms of service, privacy policy, and support documentation.

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Split Tests · Actions · GitHub Marketplace · GitHub
Skip to content

Split Tests

Actions

About

Splits test suite for parallelization with equal time
v1
Latest
Star (33)

split-tests

Github Action for splitting a test suite into equal time groups for parallel execution.

Introduction

This actions allows you to split up a suite of tests so they can be executed in parallel across a fleet of runners. The overall goal is to reduce developer feedback time by distributing the load.

Runs on ubuntu (Linux) runners only — split_tests is installed as a Linux binary.

Usage

Splitting Methods

File Count (Default)

This is a naive split into an even number of files per group. It is the default splitting method.

Line Count

Another naive split, but this time based on the number of lines per test. It is used by setting line-count: true

JUnit Report

This is the most intelligent split mechanism, using previous execution durations for each test from the JUnit report. It is used by setting the junit-path to the location of a previous execution's JUnit results report in your repository

Inputs

NAMEDESCRIPTIONTYPEREQUIREDDEFAULT
split-indexIndex of this instance executing the testsinteger
split-totalTotal number of instances executing the testsinteger
globGlob pattern to find test files (default "spec/**/*_spec.rb")stringspec/**/*_spec.rb
exclude-globGlob pattern to exclude test filesstring""
junit-pathPath to a JUnit XML report to use for test timingsstring""
line-countUse line count to estimate test durationboolfalse

Outputs

NAMEDESCRIPTIONTYPE
test-suiteA subset of tests, based on the the split index and split typestring
split-indexIndex of this instance executing the testsnumber
split-totalTotal number of instances executing the testsnumber

Example Workflow

env:
total-runners: 5jobs:
runner-indexes:
runs-on: ubuntu-latestname: Generate runner indexesoutputs:
json: ${{ steps.generate-index-list.outputs.json }}steps:
- id: generate-index-listrun: | MAX_INDEX=$((${{ env.total-runners }}-1)) INDEX_LIST=$(seq 0 ${MAX_INDEX}) INDEX_JSON=$(jq --null-input --compact-output '. |= [inputs]' <<< ${INDEX_LIST}) echo "json=${INDEX_JSON}" >> "$GITHUB_OUTPUT"run-parallel-tests:
runs-on: ubuntu-latestname: "Runner #${{ matrix.runner-index }}: Run test suite in parallel"needs:
- runner-indexesstrategy:
matrix:
runner-index: ${{ fromjson(needs.runner-indexes.outputs.json) }}steps:
- uses: actions/checkout@v4
- uses: scruplelesswizard/split-tests@v1id: split-testsname: Split testswith:
glob: examples/spec/**/*_spec.rbsplit-total: ${{ env.total-runners }}split-index: ${{ matrix.runner-index }}
- run: 'echo "This runner will execute the following tests: ${{ steps.split-tests.outputs.test-suite }}"'

The complete workflow can be found at .github/workflows/example.yaml

Dependencies

This action uses leonid-shevtsov/split_tests under-the-hood to accomplish the test splitting

Split Tests is not certified by GitHub. It is provided by a third-party and is governed by separate terms of service, privacy policy, and support documentation.

About

Splits test suite for parallelization with equal time
v1
Latest

Split Tests is not certified by GitHub. It is provided by a third-party and is governed by separate terms of service, privacy policy, and support documentation.

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Split Tests · Actions · GitHub Marketplace · GitHub
Skip to content

Split Tests

Actions

About

Splits test suite for parallelization with equal time
v1
Latest
Star (33)

split-tests

Github Action for splitting a test suite into equal time groups for parallel execution.

Introduction

This actions allows you to split up a suite of tests so they can be executed in parallel across a fleet of runners. The overall goal is to reduce developer feedback time by distributing the load.

Runs on ubuntu (Linux) runners only — split_tests is installed as a Linux binary.

Usage

Splitting Methods

File Count (Default)

This is a naive split into an even number of files per group. It is the default splitting method.

Line Count

Another naive split, but this time based on the number of lines per test. It is used by setting line-count: true

JUnit Report

This is the most intelligent split mechanism, using previous execution durations for each test from the JUnit report. It is used by setting the junit-path to the location of a previous execution's JUnit results report in your repository

Inputs

NAMEDESCRIPTIONTYPEREQUIREDDEFAULT
split-indexIndex of this instance executing the testsinteger
split-totalTotal number of instances executing the testsinteger
globGlob pattern to find test files (default "spec/**/*_spec.rb")stringspec/**/*_spec.rb
exclude-globGlob pattern to exclude test filesstring""
junit-pathPath to a JUnit XML report to use for test timingsstring""
line-countUse line count to estimate test durationboolfalse

Outputs

NAMEDESCRIPTIONTYPE
test-suiteA subset of tests, based on the the split index and split typestring
split-indexIndex of this instance executing the testsnumber
split-totalTotal number of instances executing the testsnumber

Example Workflow

env:
total-runners: 5jobs:
runner-indexes:
runs-on: ubuntu-latestname: Generate runner indexesoutputs:
json: ${{ steps.generate-index-list.outputs.json }}steps:
- id: generate-index-listrun: | MAX_INDEX=$((${{ env.total-runners }}-1)) INDEX_LIST=$(seq 0 ${MAX_INDEX}) INDEX_JSON=$(jq --null-input --compact-output '. |= [inputs]' <<< ${INDEX_LIST}) echo "json=${INDEX_JSON}" >> "$GITHUB_OUTPUT"run-parallel-tests:
runs-on: ubuntu-latestname: "Runner #${{ matrix.runner-index }}: Run test suite in parallel"needs:
- runner-indexesstrategy:
matrix:
runner-index: ${{ fromjson(needs.runner-indexes.outputs.json) }}steps:
- uses: actions/checkout@v4
- uses: scruplelesswizard/split-tests@v1id: split-testsname: Split testswith:
glob: examples/spec/**/*_spec.rbsplit-total: ${{ env.total-runners }}split-index: ${{ matrix.runner-index }}
- run: 'echo "This runner will execute the following tests: ${{ steps.split-tests.outputs.test-suite }}"'

The complete workflow can be found at .github/workflows/example.yaml

Dependencies

This action uses leonid-shevtsov/split_tests under-the-hood to accomplish the test splitting

Split Tests is not certified by GitHub. It is provided by a third-party and is governed by separate terms of service, privacy policy, and support documentation.

About

Splits test suite for parallelization with equal time
v1
Latest

Split Tests is not certified by GitHub. It is provided by a third-party and is governed by separate terms of service, privacy policy, and support documentation.

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Split Tests · Actions · GitHub Marketplace · GitHub
Skip to content

Split Tests

Actions

About

Splits test suite for parallelization with equal time
v1
Latest
Star (33)

split-tests

Github Action for splitting a test suite into equal time groups for parallel execution.

Introduction

This actions allows you to split up a suite of tests so they can be executed in parallel across a fleet of runners. The overall goal is to reduce developer feedback time by distributing the load.

Runs on ubuntu (Linux) runners only — split_tests is installed as a Linux binary.

Usage

Splitting Methods

File Count (Default)

This is a naive split into an even number of files per group. It is the default splitting method.

Line Count

Another naive split, but this time based on the number of lines per test. It is used by setting line-count: true

JUnit Report

This is the most intelligent split mechanism, using previous execution durations for each test from the JUnit report. It is used by setting the junit-path to the location of a previous execution's JUnit results report in your repository

Inputs

NAMEDESCRIPTIONTYPEREQUIREDDEFAULT
split-indexIndex of this instance executing the testsinteger
split-totalTotal number of instances executing the testsinteger
globGlob pattern to find test files (default "spec/**/*_spec.rb")stringspec/**/*_spec.rb
exclude-globGlob pattern to exclude test filesstring""
junit-pathPath to a JUnit XML report to use for test timingsstring""
line-countUse line count to estimate test durationboolfalse

Outputs

NAMEDESCRIPTIONTYPE
test-suiteA subset of tests, based on the the split index and split typestring
split-indexIndex of this instance executing the testsnumber
split-totalTotal number of instances executing the testsnumber

Example Workflow

env:
total-runners: 5jobs:
runner-indexes:
runs-on: ubuntu-latestname: Generate runner indexesoutputs:
json: ${{ steps.generate-index-list.outputs.json }}steps:
- id: generate-index-listrun: | MAX_INDEX=$((${{ env.total-runners }}-1)) INDEX_LIST=$(seq 0 ${MAX_INDEX}) INDEX_JSON=$(jq --null-input --compact-output '. |= [inputs]' <<< ${INDEX_LIST}) echo "json=${INDEX_JSON}" >> "$GITHUB_OUTPUT"run-parallel-tests:
runs-on: ubuntu-latestname: "Runner #${{ matrix.runner-index }}: Run test suite in parallel"needs:
- runner-indexesstrategy:
matrix:
runner-index: ${{ fromjson(needs.runner-indexes.outputs.json) }}steps:
- uses: actions/checkout@v4
- uses: scruplelesswizard/split-tests@v1id: split-testsname: Split testswith:
glob: examples/spec/**/*_spec.rbsplit-total: ${{ env.total-runners }}split-index: ${{ matrix.runner-index }}
- run: 'echo "This runner will execute the following tests: ${{ steps.split-tests.outputs.test-suite }}"'

The complete workflow can be found at .github/workflows/example.yaml

Dependencies

This action uses leonid-shevtsov/split_tests under-the-hood to accomplish the test splitting

Split Tests is not certified by GitHub. It is provided by a third-party and is governed by separate terms of service, privacy policy, and support documentation.

About

Splits test suite for parallelization with equal time
v1
Latest

Split Tests is not certified by GitHub. It is provided by a third-party and is governed by separate terms of service, privacy policy, and support documentation.

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Split Tests · Actions · GitHub Marketplace · GitHub
Skip to content

Split Tests

Actions

About

Splits test suite for parallelization with equal time
v1
Latest
Star (33)

split-tests

Github Action for splitting a test suite into equal time groups for parallel execution.

Introduction

This actions allows you to split up a suite of tests so they can be executed in parallel across a fleet of runners. The overall goal is to reduce developer feedback time by distributing the load.

Runs on ubuntu (Linux) runners only — split_tests is installed as a Linux binary.

Usage

Splitting Methods

File Count (Default)

This is a naive split into an even number of files per group. It is the default splitting method.

Line Count

Another naive split, but this time based on the number of lines per test. It is used by setting line-count: true

JUnit Report

This is the most intelligent split mechanism, using previous execution durations for each test from the JUnit report. It is used by setting the junit-path to the location of a previous execution's JUnit results report in your repository

Inputs

NAMEDESCRIPTIONTYPEREQUIREDDEFAULT
split-indexIndex of this instance executing the testsinteger
split-totalTotal number of instances executing the testsinteger
globGlob pattern to find test files (default "spec/**/*_spec.rb")stringspec/**/*_spec.rb
exclude-globGlob pattern to exclude test filesstring""
junit-pathPath to a JUnit XML report to use for test timingsstring""
line-countUse line count to estimate test durationboolfalse

Outputs

NAMEDESCRIPTIONTYPE
test-suiteA subset of tests, based on the the split index and split typestring
split-indexIndex of this instance executing the testsnumber
split-totalTotal number of instances executing the testsnumber

Example Workflow

env:
total-runners: 5jobs:
runner-indexes:
runs-on: ubuntu-latestname: Generate runner indexesoutputs:
json: ${{ steps.generate-index-list.outputs.json }}steps:
- id: generate-index-listrun: | MAX_INDEX=$((${{ env.total-runners }}-1)) INDEX_LIST=$(seq 0 ${MAX_INDEX}) INDEX_JSON=$(jq --null-input --compact-output '. |= [inputs]' <<< ${INDEX_LIST}) echo "json=${INDEX_JSON}" >> "$GITHUB_OUTPUT"run-parallel-tests:
runs-on: ubuntu-latestname: "Runner #${{ matrix.runner-index }}: Run test suite in parallel"needs:
- runner-indexesstrategy:
matrix:
runner-index: ${{ fromjson(needs.runner-indexes.outputs.json) }}steps:
- uses: actions/checkout@v4
- uses: scruplelesswizard/split-tests@v1id: split-testsname: Split testswith:
glob: examples/spec/**/*_spec.rbsplit-total: ${{ env.total-runners }}split-index: ${{ matrix.runner-index }}
- run: 'echo "This runner will execute the following tests: ${{ steps.split-tests.outputs.test-suite }}"'

The complete workflow can be found at .github/workflows/example.yaml

Dependencies

This action uses leonid-shevtsov/split_tests under-the-hood to accomplish the test splitting

Split Tests is not certified by GitHub. It is provided by a third-party and is governed by separate terms of service, privacy policy, and support documentation.

About

Splits test suite for parallelization with equal time
v1
Latest

Split Tests is not certified by GitHub. It is provided by a third-party and is governed by separate terms of service, privacy policy, and support documentation.

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Split Tests · Actions · GitHub Marketplace · GitHub
Skip to content

Split Tests

Actions

About

Splits test suite for parallelization with equal time
v1
Latest
Star (33)

split-tests

Github Action for splitting a test suite into equal time groups for parallel execution.

Introduction

This actions allows you to split up a suite of tests so they can be executed in parallel across a fleet of runners. The overall goal is to reduce developer feedback time by distributing the load.

Runs on ubuntu (Linux) runners only — split_tests is installed as a Linux binary.

Usage

Splitting Methods

File Count (Default)

This is a naive split into an even number of files per group. It is the default splitting method.

Line Count

Another naive split, but this time based on the number of lines per test. It is used by setting line-count: true

JUnit Report

This is the most intelligent split mechanism, using previous execution durations for each test from the JUnit report. It is used by setting the junit-path to the location of a previous execution's JUnit results report in your repository

Inputs

NAMEDESCRIPTIONTYPEREQUIREDDEFAULT
split-indexIndex of this instance executing the testsinteger
split-totalTotal number of instances executing the testsinteger
globGlob pattern to find test files (default "spec/**/*_spec.rb")stringspec/**/*_spec.rb
exclude-globGlob pattern to exclude test filesstring""
junit-pathPath to a JUnit XML report to use for test timingsstring""
line-countUse line count to estimate test durationboolfalse

Outputs

NAMEDESCRIPTIONTYPE
test-suiteA subset of tests, based on the the split index and split typestring
split-indexIndex of this instance executing the testsnumber
split-totalTotal number of instances executing the testsnumber

Example Workflow

env:
total-runners: 5jobs:
runner-indexes:
runs-on: ubuntu-latestname: Generate runner indexesoutputs:
json: ${{ steps.generate-index-list.outputs.json }}steps:
- id: generate-index-listrun: | MAX_INDEX=$((${{ env.total-runners }}-1)) INDEX_LIST=$(seq 0 ${MAX_INDEX}) INDEX_JSON=$(jq --null-input --compact-output '. |= [inputs]' <<< ${INDEX_LIST}) echo "json=${INDEX_JSON}" >> "$GITHUB_OUTPUT"run-parallel-tests:
runs-on: ubuntu-latestname: "Runner #${{ matrix.runner-index }}: Run test suite in parallel"needs:
- runner-indexesstrategy:
matrix:
runner-index: ${{ fromjson(needs.runner-indexes.outputs.json) }}steps:
- uses: actions/checkout@v4
- uses: scruplelesswizard/split-tests@v1id: split-testsname: Split testswith:
glob: examples/spec/**/*_spec.rbsplit-total: ${{ env.total-runners }}split-index: ${{ matrix.runner-index }}
- run: 'echo "This runner will execute the following tests: ${{ steps.split-tests.outputs.test-suite }}"'

The complete workflow can be found at .github/workflows/example.yaml

Dependencies

This action uses leonid-shevtsov/split_tests under-the-hood to accomplish the test splitting

Split Tests is not certified by GitHub. It is provided by a third-party and is governed by separate terms of service, privacy policy, and support documentation.

About

Splits test suite for parallelization with equal time
v1
Latest

Split Tests is not certified by GitHub. It is provided by a third-party and is governed by separate terms of service, privacy policy, and support documentation.