Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

readme.md

bash_unit test drive

This framework allows to write test files in pure Bash, without custom syntax, yet provide concise syntax and many features. My only concern is that it has only a few built-in assertions, but that can be solved by writing custom ones.

Test format

✔️ Test files are simple shell scripts, executed by the test framework. There's no need for any extra noise besides the test functions in a test file: no custom shebang line, no framework initialization code, and no custom imports.

test_example(){
assert_equals "hello""world"
}

✔️ Test functions are simple bash functions without custom syntax. All functions which name is starting with test_ is considered a test function

Test Discovery

✔️ bash_unit is parameterized with the list of test files to be executed. This means that it's trivial to focus on a single test file to execute. Moreover, it can also take a pattern to narrow test cases to be executed to the matching ones.

⚠️ Because it explicitly has to be parameterized with the list of test files, it can't discover directories. For this purpose one might wish to introduce a lightweight wrapper.

Assertions

⚠️ It has some assertions available like assert_equals but lacks other essential ones, like assert_contains.

✔️ All assertions provide a nice, easy to read report including the context and line number.

Custom assertions

✔️ It’s possible to create new assertions by building functions on top of the existing assertions, although there's no dedicated lower-level API to support it. Custom assertions can be sourced from an external file.

Skip tests

✔️ If a test function name is starting with pending or todo it will be skipped which will be properly reflected in the report.

Mocking

✔️ Supports all common techniques for mocking.

✔️ Additionally, it even has the built-in fake command which is a shorthand for the function-export based mock technique, making the tests even more clear and concise.

Activity

✔️ The project is around since 2016 and has regular releases. Overall much less popular than Bats or shUnit2, and has activity on the GitHub repository, but there's also much less forgotten issues and PRs.

Documentation

✔️ Based on the getting started guide it was really easy to get started.

, '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" + '
testing-in-bash/example-bash_unit at master · TypedDevs/testing-in-bash · GitHub
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

readme.md

bash_unit test drive

This framework allows to write test files in pure Bash, without custom syntax, yet provide concise syntax and many features. My only concern is that it has only a few built-in assertions, but that can be solved by writing custom ones.

Test format

✔️ Test files are simple shell scripts, executed by the test framework. There's no need for any extra noise besides the test functions in a test file: no custom shebang line, no framework initialization code, and no custom imports.

test_example(){
assert_equals "hello""world"
}

✔️ Test functions are simple bash functions without custom syntax. All functions which name is starting with test_ is considered a test function

Test Discovery

✔️ bash_unit is parameterized with the list of test files to be executed. This means that it's trivial to focus on a single test file to execute. Moreover, it can also take a pattern to narrow test cases to be executed to the matching ones.

⚠️ Because it explicitly has to be parameterized with the list of test files, it can't discover directories. For this purpose one might wish to introduce a lightweight wrapper.

Assertions

⚠️ It has some assertions available like assert_equals but lacks other essential ones, like assert_contains.

✔️ All assertions provide a nice, easy to read report including the context and line number.

Custom assertions

✔️ It’s possible to create new assertions by building functions on top of the existing assertions, although there's no dedicated lower-level API to support it. Custom assertions can be sourced from an external file.

Skip tests

✔️ If a test function name is starting with pending or todo it will be skipped which will be properly reflected in the report.

Mocking

✔️ Supports all common techniques for mocking.

✔️ Additionally, it even has the built-in fake command which is a shorthand for the function-export based mock technique, making the tests even more clear and concise.

Activity

✔️ The project is around since 2016 and has regular releases. Overall much less popular than Bats or shUnit2, and has activity on the GitHub repository, but there's also much less forgotten issues and PRs.

Documentation

✔️ Based on the getting started guide it was really easy to get started.

, '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('^' + ".*" + ' testing-in-bash/example-bash_unit at master · TypedDevs/testing-in-bash · GitHub
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

readme.md

bash_unit test drive

This framework allows to write test files in pure Bash, without custom syntax, yet provide concise syntax and many features. My only concern is that it has only a few built-in assertions, but that can be solved by writing custom ones.

Test format

✔️ Test files are simple shell scripts, executed by the test framework. There's no need for any extra noise besides the test functions in a test file: no custom shebang line, no framework initialization code, and no custom imports.

test_example(){
assert_equals "hello""world"
}

✔️ Test functions are simple bash functions without custom syntax. All functions which name is starting with test_ is considered a test function

Test Discovery

✔️ bash_unit is parameterized with the list of test files to be executed. This means that it's trivial to focus on a single test file to execute. Moreover, it can also take a pattern to narrow test cases to be executed to the matching ones.

⚠️ Because it explicitly has to be parameterized with the list of test files, it can't discover directories. For this purpose one might wish to introduce a lightweight wrapper.

Assertions

⚠️ It has some assertions available like assert_equals but lacks other essential ones, like assert_contains.

✔️ All assertions provide a nice, easy to read report including the context and line number.

Custom assertions

✔️ It’s possible to create new assertions by building functions on top of the existing assertions, although there's no dedicated lower-level API to support it. Custom assertions can be sourced from an external file.

Skip tests

✔️ If a test function name is starting with pending or todo it will be skipped which will be properly reflected in the report.

Mocking

✔️ Supports all common techniques for mocking.

✔️ Additionally, it even has the built-in fake command which is a shorthand for the function-export based mock technique, making the tests even more clear and concise.

Activity

✔️ The project is around since 2016 and has regular releases. Overall much less popular than Bats or shUnit2, and has activity on the GitHub repository, but there's also much less forgotten issues and PRs.

Documentation

✔️ Based on the getting started guide it was really easy to get started.

, '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('^' + ".*" + ' testing-in-bash/example-bash_unit at master · TypedDevs/testing-in-bash · GitHub
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

readme.md

bash_unit test drive

This framework allows to write test files in pure Bash, without custom syntax, yet provide concise syntax and many features. My only concern is that it has only a few built-in assertions, but that can be solved by writing custom ones.

Test format

✔️ Test files are simple shell scripts, executed by the test framework. There's no need for any extra noise besides the test functions in a test file: no custom shebang line, no framework initialization code, and no custom imports.

test_example(){
assert_equals "hello""world"
}

✔️ Test functions are simple bash functions without custom syntax. All functions which name is starting with test_ is considered a test function

Test Discovery

✔️ bash_unit is parameterized with the list of test files to be executed. This means that it's trivial to focus on a single test file to execute. Moreover, it can also take a pattern to narrow test cases to be executed to the matching ones.

⚠️ Because it explicitly has to be parameterized with the list of test files, it can't discover directories. For this purpose one might wish to introduce a lightweight wrapper.

Assertions

⚠️ It has some assertions available like assert_equals but lacks other essential ones, like assert_contains.

✔️ All assertions provide a nice, easy to read report including the context and line number.

Custom assertions

✔️ It’s possible to create new assertions by building functions on top of the existing assertions, although there's no dedicated lower-level API to support it. Custom assertions can be sourced from an external file.

Skip tests

✔️ If a test function name is starting with pending or todo it will be skipped which will be properly reflected in the report.

Mocking

✔️ Supports all common techniques for mocking.

✔️ Additionally, it even has the built-in fake command which is a shorthand for the function-export based mock technique, making the tests even more clear and concise.

Activity

✔️ The project is around since 2016 and has regular releases. Overall much less popular than Bats or shUnit2, and has activity on the GitHub repository, but there's also much less forgotten issues and PRs.

Documentation

✔️ Based on the getting started guide it was really easy to get started.

, '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" + ' testing-in-bash/example-bash_unit at master · TypedDevs/testing-in-bash · GitHub
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

readme.md

bash_unit test drive

This framework allows to write test files in pure Bash, without custom syntax, yet provide concise syntax and many features. My only concern is that it has only a few built-in assertions, but that can be solved by writing custom ones.

Test format

✔️ Test files are simple shell scripts, executed by the test framework. There's no need for any extra noise besides the test functions in a test file: no custom shebang line, no framework initialization code, and no custom imports.

test_example(){
assert_equals "hello""world"
}

✔️ Test functions are simple bash functions without custom syntax. All functions which name is starting with test_ is considered a test function

Test Discovery

✔️ bash_unit is parameterized with the list of test files to be executed. This means that it's trivial to focus on a single test file to execute. Moreover, it can also take a pattern to narrow test cases to be executed to the matching ones.

⚠️ Because it explicitly has to be parameterized with the list of test files, it can't discover directories. For this purpose one might wish to introduce a lightweight wrapper.

Assertions

⚠️ It has some assertions available like assert_equals but lacks other essential ones, like assert_contains.

✔️ All assertions provide a nice, easy to read report including the context and line number.

Custom assertions

✔️ It’s possible to create new assertions by building functions on top of the existing assertions, although there's no dedicated lower-level API to support it. Custom assertions can be sourced from an external file.

Skip tests

✔️ If a test function name is starting with pending or todo it will be skipped which will be properly reflected in the report.

Mocking

✔️ Supports all common techniques for mocking.

✔️ Additionally, it even has the built-in fake command which is a shorthand for the function-export based mock technique, making the tests even more clear and concise.

Activity

✔️ The project is around since 2016 and has regular releases. Overall much less popular than Bats or shUnit2, and has activity on the GitHub repository, but there's also much less forgotten issues and PRs.

Documentation

✔️ Based on the getting started guide it was really easy to get started.

, '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('^' + ".*" + ' testing-in-bash/example-bash_unit at master · TypedDevs/testing-in-bash · GitHub
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

readme.md

bash_unit test drive

This framework allows to write test files in pure Bash, without custom syntax, yet provide concise syntax and many features. My only concern is that it has only a few built-in assertions, but that can be solved by writing custom ones.

Test format

✔️ Test files are simple shell scripts, executed by the test framework. There's no need for any extra noise besides the test functions in a test file: no custom shebang line, no framework initialization code, and no custom imports.

test_example(){
assert_equals "hello""world"
}

✔️ Test functions are simple bash functions without custom syntax. All functions which name is starting with test_ is considered a test function

Test Discovery

✔️ bash_unit is parameterized with the list of test files to be executed. This means that it's trivial to focus on a single test file to execute. Moreover, it can also take a pattern to narrow test cases to be executed to the matching ones.

⚠️ Because it explicitly has to be parameterized with the list of test files, it can't discover directories. For this purpose one might wish to introduce a lightweight wrapper.

Assertions

⚠️ It has some assertions available like assert_equals but lacks other essential ones, like assert_contains.

✔️ All assertions provide a nice, easy to read report including the context and line number.

Custom assertions

✔️ It’s possible to create new assertions by building functions on top of the existing assertions, although there's no dedicated lower-level API to support it. Custom assertions can be sourced from an external file.

Skip tests

✔️ If a test function name is starting with pending or todo it will be skipped which will be properly reflected in the report.

Mocking

✔️ Supports all common techniques for mocking.

✔️ Additionally, it even has the built-in fake command which is a shorthand for the function-export based mock technique, making the tests even more clear and concise.

Activity

✔️ The project is around since 2016 and has regular releases. Overall much less popular than Bats or shUnit2, and has activity on the GitHub repository, but there's also much less forgotten issues and PRs.

Documentation

✔️ Based on the getting started guide it was really easy to get started.

, '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('^' + ".*" + ' testing-in-bash/example-bash_unit at master · TypedDevs/testing-in-bash · GitHub
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

readme.md

bash_unit test drive

This framework allows to write test files in pure Bash, without custom syntax, yet provide concise syntax and many features. My only concern is that it has only a few built-in assertions, but that can be solved by writing custom ones.

Test format

✔️ Test files are simple shell scripts, executed by the test framework. There's no need for any extra noise besides the test functions in a test file: no custom shebang line, no framework initialization code, and no custom imports.

test_example(){
assert_equals "hello""world"
}

✔️ Test functions are simple bash functions without custom syntax. All functions which name is starting with test_ is considered a test function

Test Discovery

✔️ bash_unit is parameterized with the list of test files to be executed. This means that it's trivial to focus on a single test file to execute. Moreover, it can also take a pattern to narrow test cases to be executed to the matching ones.

⚠️ Because it explicitly has to be parameterized with the list of test files, it can't discover directories. For this purpose one might wish to introduce a lightweight wrapper.

Assertions

⚠️ It has some assertions available like assert_equals but lacks other essential ones, like assert_contains.

✔️ All assertions provide a nice, easy to read report including the context and line number.

Custom assertions

✔️ It’s possible to create new assertions by building functions on top of the existing assertions, although there's no dedicated lower-level API to support it. Custom assertions can be sourced from an external file.

Skip tests

✔️ If a test function name is starting with pending or todo it will be skipped which will be properly reflected in the report.

Mocking

✔️ Supports all common techniques for mocking.

✔️ Additionally, it even has the built-in fake command which is a shorthand for the function-export based mock technique, making the tests even more clear and concise.

Activity

✔️ The project is around since 2016 and has regular releases. Overall much less popular than Bats or shUnit2, and has activity on the GitHub repository, but there's also much less forgotten issues and PRs.

Documentation

✔️ Based on the getting started guide it was really easy to get started.

, '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); } })(); })(); testing-in-bash/example-bash_unit at master · TypedDevs/testing-in-bash · GitHub
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

readme.md

bash_unit test drive

This framework allows to write test files in pure Bash, without custom syntax, yet provide concise syntax and many features. My only concern is that it has only a few built-in assertions, but that can be solved by writing custom ones.

Test format

✔️ Test files are simple shell scripts, executed by the test framework. There's no need for any extra noise besides the test functions in a test file: no custom shebang line, no framework initialization code, and no custom imports.

test_example(){
assert_equals "hello""world"
}

✔️ Test functions are simple bash functions without custom syntax. All functions which name is starting with test_ is considered a test function

Test Discovery

✔️ bash_unit is parameterized with the list of test files to be executed. This means that it's trivial to focus on a single test file to execute. Moreover, it can also take a pattern to narrow test cases to be executed to the matching ones.

⚠️ Because it explicitly has to be parameterized with the list of test files, it can't discover directories. For this purpose one might wish to introduce a lightweight wrapper.

Assertions

⚠️ It has some assertions available like assert_equals but lacks other essential ones, like assert_contains.

✔️ All assertions provide a nice, easy to read report including the context and line number.

Custom assertions

✔️ It’s possible to create new assertions by building functions on top of the existing assertions, although there's no dedicated lower-level API to support it. Custom assertions can be sourced from an external file.

Skip tests

✔️ If a test function name is starting with pending or todo it will be skipped which will be properly reflected in the report.

Mocking

✔️ Supports all common techniques for mocking.

✔️ Additionally, it even has the built-in fake command which is a shorthand for the function-export based mock technique, making the tests even more clear and concise.

Activity

✔️ The project is around since 2016 and has regular releases. Overall much less popular than Bats or shUnit2, and has activity on the GitHub repository, but there's also much less forgotten issues and PRs.

Documentation

✔️ Based on the getting started guide it was really easy to get started.