TDD
pietheinstrengholt/rssmonster
Test-driven development. An agent skill from pietheinstrengholt/rssmonster.
AL test development patterns for Business Central. An agent skill from javiarmesto/ALDC-AL-Development-Collection.
$ npx skills add javiarmesto/ALDC-AL-Development-Collection --skill skill-testing -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install javiarmesto/ALDC-AL-Development-Collection skill-testing --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/javiarmesto/ALDC-AL-Development-Collection.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/skill-testing .claude/skills/skill-testing && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "skill-testing" agent skill from https://github.com/javiarmesto/ALDC-AL-Development-Collection/tree/main/skills/skill-testing into .claude/skills/skill-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "skill-testing", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/javiarmesto/ALDC-AL-Development-Collection/tree/main/skills/skill-testingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add javiarmesto/ALDC-AL-Development-Collection --skill skill-testing -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install javiarmesto/ALDC-AL-Development-Collection skill-testing --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/javiarmesto/ALDC-AL-Development-Collection.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/skill-testing .agents/skills/skill-testing && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "skill-testing" agent skill from https://github.com/javiarmesto/ALDC-AL-Development-Collection/tree/main/skills/skill-testing into .agents/skills/skill-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "skill-testing", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add javiarmesto/ALDC-AL-Development-Collection --skill skill-testing -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install javiarmesto/ALDC-AL-Development-Collection skill-testing --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/javiarmesto/ALDC-AL-Development-Collection.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/skill-testing .cursor/skills/skill-testing && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "skill-testing" agent skill from https://github.com/javiarmesto/ALDC-AL-Development-Collection/tree/main/skills/skill-testing into .cursor/skills/skill-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "skill-testing", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/javiarmesto/ALDC-AL-Development-Collection.git --path skills/skill-testing--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add javiarmesto/ALDC-AL-Development-Collection --skill skill-testing -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install javiarmesto/ALDC-AL-Development-Collection skill-testing --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/javiarmesto/ALDC-AL-Development-Collection.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/skill-testing .gemini/skills/skill-testing && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "skill-testing" agent skill from https://github.com/javiarmesto/ALDC-AL-Development-Collection/tree/main/skills/skill-testing into .gemini/skills/skill-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "skill-testing", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install javiarmesto/ALDC-AL-Development-Collection skill-testingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add javiarmesto/ALDC-AL-Development-Collection --skill skill-testing -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/javiarmesto/ALDC-AL-Development-Collection.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/skill-testing .github/skills/skill-testing && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "skill-testing" agent skill from https://github.com/javiarmesto/ALDC-AL-Development-Collection/tree/main/skills/skill-testing into .github/skills/skill-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "skill-testing", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add javiarmesto/ALDC-AL-Development-Collection --skill skill-testing -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install javiarmesto/ALDC-AL-Development-Collection skill-testing --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/javiarmesto/ALDC-AL-Development-Collection.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/skill-testing .opencode/skills/skill-testing && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "skill-testing" agent skill from https://github.com/javiarmesto/ALDC-AL-Development-Collection/tree/main/skills/skill-testing into .opencode/skills/skill-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "skill-testing", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
skill-testingAL test development patterns for Business Central. An agent skill from javiarmesto/ALDC-AL-Development-Collection.
Skill Testing is an agent skill from javiarmesto/ALDC-AL-Development-Collection. AL test development patterns for Business Central. Use when creating test codeunits, writing Given/When/Then test procedures, using Library Assert, configuring test projects, or implementing TDD workflows.
Its SKILL.md is about 4.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Testing & QA, covering Test-driven development. The repository describes itself as: AL development toolkit for Business Central with specialist agents, skills and review workflows for Copilot, Claude Code and Codex. The licence is MIT.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 4f99d7d. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are al).
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
learn.microsoft.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Skill Testing loads about 4.1k tokens when it runs. Until then it costs about 55 tokens; SKILL.md has 847 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from javiarmesto/ALDC-AL-Development-Collection at commit 4f99d7d, republished under its MIT licence (© javiarmesto). 847 words, ~4,116 tokens.
.claude/skills/skill-testing/SKILL.md (or your agent's skills folder).Design test strategies, implement Given/When/Then test patterns, build reusable library codeunits, test Copilot features with AI Test Toolkit, and integrate testing into the conductor's TDD cycle for AL Business Central extensions.
This skill should be loaded when:
When BC29 test lifecycle instrumentation is needed, read the test section of
AL18 capability checks.
TestHandlers / ITestHandler require target declaration checks and do not
replace the approved runner. Test-library versions need not equal the app version:
check dependency identity, minimum version, runtime and APIs. Unknown compatibility
limits the affected validation; it does not automatically block drafting the spec.
Every test follows GWT with explicit comments and a descriptive name:
codeunit 50100 "Discount Calculation Tests"
{
Subtype = Test;
TestPermissions = Disabled; // runs as SUPER; not a rollback setting
var
Assert: Codeunit Assert;
LibrarySales: Codeunit "Library - Sales";
LibraryRandom: Codeunit "Library - Random";
IsInitialized: Boolean;
[Test]
procedure CalculateLineDiscount_VolumeOver100_Applies15Percent()
var
SalesLine: Record "Sales Line";
DiscountMgt: Codeunit "Contoso Discount Management";
Result: Decimal;
begin
// [SCENARIO] Volume discount is correctly applied for quantities ≥ 100
Initialize();
// [GIVEN] A sales line with quantity 100 and unit price 10
CreateSalesLineWithQty(SalesLine, 100, 10);
// [GIVEN] Volume discount setup: 100+ units → 15%
CreateVolumeDiscountSetup(100, 15);
// [WHEN] Discount is calculated
Result := DiscountMgt.CalculateLineDiscount(SalesLine);
// [THEN] Discount percentage is 15%
Assert.AreEqual(15, Result, 'Volume discount not applied for qty >= 100');
// [THEN] Line amount reflects the discount
Assert.AreEqual(850, SalesLine."Line Amount",
'Line amount should be 100 * 10 * (1 - 0.15) = 850');
end;
local procedure Initialize()
begin
if IsInitialized then
exit;
// One-time setup: number series, general setup, etc.
IsInitialized := true;
end;
}Naming convention: Action_Condition_ExpectedOutcome — reads as a sentence.
Encapsulate test data creation in library codeunits — one per domain:
codeunit 50200 "Library - Contoso Sales"
{
/// Creates a customer with standard defaults for testing.
procedure CreateCustomer(var Customer: Record Customer)
var
LibrarySales: Codeunit "Library - Sales";
begin
LibrarySales.CreateCustomer(Customer); // standard BC library
Customer."Credit Limit (LCY)" := 100000;
Customer.Modify();
end;
/// Creates a released sales order with one line.
procedure CreateReleasedSalesOrder(
var SalesHeader: Record "Sales Header";
CustomerNo: Code[20];
ItemNo: Code[20];
Qty: Decimal)
var
SalesLine: Record "Sales Line";
LibrarySales: Codeunit "Library - Sales";
begin
LibrarySales.CreateSalesHeader(
SalesHeader, SalesHeader."Document Type"::Order, CustomerNo);
LibrarySales.CreateSalesLine(
SalesLine, SalesHeader, SalesLine.Type::Item, ItemNo, Qty);
LibrarySales.ReleaseSalesDocument(SalesHeader);
end;
}Rules:
Library - Sales, Library - Inventory, Library - ERM, Library - Random) for base data creationTest/src/Libraries/ folderFor complex test scenarios with many optional parameters:
codeunit 50201 "Sales Order Builder"
{
var
SalesHeader: Record "Sales Header";
LineCount: Integer;
procedure Create(): Codeunit "Sales Order Builder"
begin
SalesHeader.Init();
SalesHeader."Document Type" := SalesHeader."Document Type"::Order;
SalesHeader.Insert(true);
exit(this);
end;
procedure WithCustomer(CustomerNo: Code[20]): Codeunit "Sales Order Builder"
begin
SalesHeader.Validate("Sell-to Customer No.", CustomerNo);
SalesHeader.Modify(true);
exit(this);
end;
procedure WithLine(ItemNo: Code[20]; Qty: Decimal): Codeunit "Sales Order Builder"
var
SalesLine: Record "Sales Line";
begin
LineCount += 10000;
SalesLine.Init();
SalesLine."Document Type" := SalesHeader."Document Type";
SalesLine."Document No." := SalesHeader."No.";
SalesLine."Line No." := LineCount;
SalesLine.Insert(true);
SalesLine.Validate(Type, SalesLine.Type::Item);
SalesLine.Validate("No.", ItemNo);
SalesLine.Validate(Quantity, Qty);
SalesLine.Modify(true);
exit(this);
end;
procedure Build(): Record "Sales Header"
begin
exit(SalesHeader);
end;
}
// Usage in test:
[Test]
procedure PostOrder_TwoLines_CreatesInvoice()
var
SalesHeader: Record "Sales Header";
Builder: Codeunit "Sales Order Builder";
begin
Initialize();
SalesHeader := Builder.Create()
.WithCustomer('C001')
.WithLine('ITEM-A', 10)
.WithLine('ITEM-B', 5)
.Build();
// ...
end;When the code under test raises dialogs, declare handlers at the test procedure level:
[Test]
[HandlerFunctions('ConfirmYesHandler,MessageHandler')]
procedure PostSalesOrder_WithValidation_CreatesLedgerEntry()
var
SalesHeader: Record "Sales Header";
LibrarySales: Codeunit "Library - Sales";
begin
// [SCENARIO] Posting order with custom validation creates ledger entry
Initialize();
// [GIVEN] A released sales order
CreateReleasedOrder(SalesHeader);
// [WHEN] Order is posted (triggers confirm + message)
LibrarySales.PostSalesDocument(SalesHeader, true, true);
// [THEN] Custom ledger entry exists
VerifyCustomLedgerEntry(SalesHeader."No.");
end;
[ConfirmHandler]
procedure ConfirmYesHandler(Question: Text; var Reply: Boolean)
begin
Reply := true;
end;
[MessageHandler]
procedure MessageHandler(Msg: Text)
begin
// Absorb expected messages
end;
[PageHandler]
procedure CustomerCardHandler(var CustomerCard: TestPage "Customer Card")
begin
CustomerCard."Credit Limit (LCY)".SetValue(50000);
CustomerCard.OK().Invoke();
end;Handler types: ConfirmHandler, MessageHandler, PageHandler, ModalPageHandler, ReportHandler, RequestPageHandler, SendNotificationHandler, RecallNotificationHandler, HyperlinkHandler, StrMenuHandler.
[Test]
procedure CustomerCard_SetHighCreditLimit_ShowsWarning()
var
Customer: Record Customer;
CustomerCard: TestPage "Customer Card";
begin
// [SCENARIO] Setting very high credit limit shows warning
Initialize();
CreateCustomerWithSalesHistory(Customer, 10000);
// [WHEN] User opens card and sets excessive credit limit
CustomerCard.OpenEdit();
CustomerCard.GoToRecord(Customer);
// [THEN] Validation error is raised
asserterror CustomerCard."Credit Limit (LCY)".SetValue(99999999);
Assert.ExpectedError('Credit limit exceeds');
end;
[Test]
procedure DiscountList_FilterByCustomerGroup_ShowsFiltered()
var
DiscountList: TestPage "Contoso Discount List";
begin
Initialize();
CreateDiscountsForGroups();
DiscountList.OpenView();
DiscountList.Filter.SetFilter("Customer Group", 'PREMIUM');
// [THEN] Only premium discounts visible
Assert.IsTrue(DiscountList.First(), 'Should have at least one premium discount');
Assert.AreEqual('PREMIUM', DiscountList."Customer Group".Value,
'Filtered record should be PREMIUM group');
end;For testing Copilot capabilities (PromptDialog pages, AI-generated suggestions):
codeunit 50210 "Copilot Suggestion Tests"
{
Subtype = Test;
TestPermissions = Disabled; // runs as SUPER; not a rollback setting
var
Assert: Codeunit Assert;
AITTestContext: Codeunit "AIT Test Context";
[Test]
procedure GenerateSuggestion_ValidInput_ReturnsExpectedFormat()
var
TestInput: Text;
TestOutput: Text;
begin
// [SCENARIO] Copilot suggestion generates correct structured output
Initialize();
// [GIVEN] A valid input prompt from the test dataset
TestInput := AITTestContext.GetInput().ValueAsText();
// [WHEN] The AI generation procedure is invoked
TestOutput := GenerateSuggestion(TestInput);
// [THEN] Output is non-empty and contains expected structure
Assert.AreNotEqual('', TestOutput, 'AI should return non-empty suggestion');
AITTestContext.SetTestOutput(TestOutput);
end;
}AI Test Toolkit workflow:
AITTestContext.GetInput()AITTestContext.SetTestOutput() to log results for reviewKey assertions for AI features:
Read the requirement contracts before creating any tests:
.github/plans/{req_name}.spec.md ← acceptance criteria to test
.github/plans/{req_name}.architecture.md ← components to cover
.github/plans/{req_name}.test-plan.md ← existing plan (if any)
.github/plans/memory.md ← context and conventionsCategorize test scenarios:
Coverage targets:
| Area | Target |
|---|---|
| Core business logic | 95% |
| Integration paths | 85% |
| UI interactions | 70% |
| Error handling paths | 100% |
| Overall | 85%+ |
Create .github/plans/{req_name}.test-plan.md using .github/docs/templates/test-plan-template.md:
When called by al-conductor in TDD cycle:
RED phase:
1. Write failing test(s) for the current requirement
2. Run: al_build → verify compilation
3. Run test → confirm it FAILS (no implementation yet)
GREEN phase:
4. Implement minimum code to make test(s) pass
5. Run test → confirm it PASSES
REFACTOR phase:
6. Improve code quality while keeping tests green
7. Run all tests → confirm no regressionsWhen called standalone (tests for existing code):
"Feature Name Tests""Library - Feature Name"al_build + test executionEach test MUST be independent — no shared mutable state between tests:
// ✅ Initialize procedure resets state
local procedure Initialize()
begin
if IsInitialized then
exit;
// Setup number series, general posting setup, etc.
// Use standard Library codeunits:
// LibraryERM.SetupGenPostingGroups()
// LibrarySales.SetupNoSeries()
IsInitialized := true;
end;
// ✅ Each test creates its own data
[Test]
procedure Test_A()
begin
Initialize();
CreateOwnTestData(); // isolated
// ...
end;
[Test]
procedure Test_B()
begin
Initialize();
CreateOwnTestData(); // independent from Test_A
// ...
end;Transaction isolation: rollback is controlled by TransactionModel on the test method — AutoRollback, the default, rolls back the method's own transaction — and by TestIsolation on the test runner codeunit, where Function and Codeunit roll back after each method or each codeunit while the default Disabled rolls back nothing. Only TestIsolation reverts what a test committed explicitly with Commit.
TestPermissions is not a rollback setting. It selects the permission context: the default Restrictive starts each test at D365 Full Access and expects it to lower permissions, while Disabled skips that and runs every test as SUPER. Use Disabled only for tests that are not about permissions, and Restrictive when they are — see skill-permissions.
.github/plans/{req_name}.test-plan.mdmemory.md with test results summaryal-testing.instructions.md (auto-applied to **/test/**/*.al)[Test] must verify somethingskill-debug.mdskill-events.mdTestPermissions = Restrictive → load skill-permissions.md© javiarmesto, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/skill-testing of javiarmesto/ALDC-AL-Development-Collection.
Open the folder on GitHubat commit 4f99d7d
Skill Testing next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Skill Testing this skilljaviarmesto/ALDC-AL-Development-Collection | 109 | — | ~4.1k | Automated safety check: Pass | MIT | |
| TDDpietheinstrengholt/rssmonster | 564 | 30 repos | ~906 | Automated safety check: Pass | MIT | |
| TDD WorkflowhellangleZ/burn-in-cceverywhere-ralph | 112 | 11 repos | ~2.4k | Automated safety check: Pass | None | |
| TDDsanity-io/sanity | 6.4k | 20 repos | ~1k | Automated safety check: Pass | MIT | |
| Test Driven Developmentfarm-fe/farm | 5.6k | 51 repos | ~2.5k | Automated safety check: Pass | MIT | |
| Tapd Story PipelineTencentBlueKing/bk-bcs | 840 | — | ~2.6k | Automated safety check: Pass | Custom licence |
pietheinstrengholt/rssmonster
Test-driven development. An agent skill from pietheinstrengholt/rssmonster.
hellangleZ/burn-in-cceverywhere-ralph
A skill your agent uses when writing new features, fixing bugs, or refactoring code.
sanity-io/sanity
Test-driven development with red-green-refactor loop. An agent skill from sanity-io/sanity.
farm-fe/farm
A skill your agent uses when implementing any feature or bugfix, before writing implementation code
TencentBlueKing/bk-bcs
单需求实现流水线——把一个 TAPD 需求从零推进到代码提交。自动串联技术澄清、 开发计划、任务拆分、TDD 实现、架构/安全校验、代码提交六个阶段。
maddhruv/absolute
One-time setup for absolute: interview how you want it to behave (output style, autonomy, TDD strictness, spec dir, families) + detect the stack once, then write .absolute.config.json (project…
javiarmesto/ALDC-AL-Development-Collection
Generate, review, and optimize natural language instructions for Business Central agents (Designer or SDK).
javiarmesto/ALDC-AL-Development-Collection
AL API development patterns for Business Central. An agent skill from javiarmesto/ALDC-AL-Development-Collection.
javiarmesto/ALDC-AL-Development-Collection
AL Copilot capability development for Business Central. An agent skill from javiarmesto/ALDC-AL-Development-Collection.
javiarmesto/ALDC-AL-Development-Collection
AL version migration for Business Central. An agent skill from javiarmesto/ALDC-AL-Development-Collection.
javiarmesto/ALDC-AL-Development-Collection
Agent SDK task integration patterns for Business Central. An agent skill from javiarmesto/ALDC-AL-Development-Collection.
javiarmesto/ALDC-AL-Development-Collection
Build, configure, and integrate Business Central agents using the AI Development Toolkit and Agent SDK.
Categories
AL test development patterns for Business Central. An agent skill from javiarmesto/ALDC-AL-Development-Collection. Skill Testing is an agent skill from javiarmesto/ALDC-AL-Development-Collection. AL test development patterns for Business Central.
Skill Testing fits situations like: creating test codeunits; writing Given/When/Then test procedures; using Library Assert; configuring test projects.
Run `npx skills add javiarmesto/ALDC-AL-Development-Collection --skill skill-testing -a claude-code`. Or copy the skill folder (skills/skill-testing in javiarmesto/ALDC-AL-Development-Collection) into .claude/skills/skill-testing in your project. Claude Code loads it when a task matches its description.
Run `npx skills add javiarmesto/ALDC-AL-Development-Collection --skill skill-testing -a codex`. Or copy the skill folder (skills/skill-testing in javiarmesto/ALDC-AL-Development-Collection) into .agents/skills/skill-testing in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add javiarmesto/ALDC-AL-Development-Collection --skill skill-testing -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/skill-testing, .gemini/skills/skill-testing, .github/skills/skill-testing and .opencode/skills/skill-testing in your project.
SKILL.md names no scripts, command-line tools or credentials: Skill Testing is instructions for the agent only.
SKILL.md names 1 domain. As links in the text: learn.microsoft.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Skill Testing is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.1k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Skill Testing: TDD (pietheinstrengholt/rssmonster, 564 stars), TDD Workflow (hellangleZ/burn-in-cceverywhere-ralph, 112 stars), TDD (sanity-io/sanity, 6.4k stars) and Test Driven Development (farm-fe/farm, 5.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
javiarmesto (a GitHub user) maintains it in javiarmesto/ALDC-AL-Development-Collection, which has 109 GitHub stars. The repository holds 14 skills in this directory. The repository was last updated on October 7, 2026.
Source: javiarmesto/ALDC-AL-Development-Collection on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.