本文へ移動
cccskills
無料GitHub で公開

boundary-value-generator

Generates boundary-value test cases from typed input specifications - for each input field, produces the canonical 6-point set (one below, at, and above the lower bound; one below, at, and above the upper bound) plus equivalence-class representatives. Emits cases as parameterized test inputs (pytest @parametrize / Jest test.each / xUnit InlineData / etc.). Use when a function or endpoint has numeric / string-length / collection-size constraints and the team needs systematic edge-case coverage.

日本語の概要は準備中です。原文の説明を表示しています。

testland/qaスター 13(GitHub 13 + cccskills 0)

実行スコア 未検証

インストール方法を見る

含まれるファイル(22)

  • SKILL.md9.5 KB
  • .tessl-plugin/plugin.json638 B
  • evals/avatar-size-bytes/criteria.json3.7 KB
  • evals/avatar-size-bytes/task.md2.5 KB
  • evals/campaign-budget-dependent-bounds/criteria.json4.1 KB
  • evals/campaign-budget-dependent-bounds/task.md3.2 KB
  • evals/discount-window-doc-vs-code/criteria.json4.0 KB
  • evals/discount-window-doc-vs-code/task.md3.3 KB
  • evals/display-name-code-points/criteria.json4.9 KB
  • evals/display-name-code-points/task.md3.3 KB
  • evals/order-quantity/criteria.json2.6 KB
  • evals/order-quantity/task.md1.7 KB
  • evals/page-limit-exclusive-cap/criteria.json4.3 KB
  • evals/page-limit-exclusive-cap/task.md3.5 KB
  • evals/payout-amount-decimal-step/criteria.json3.6 KB
  • evals/payout-amount-decimal-step/task.md3.0 KB
  • evals/quiet-hours-dst-window/criteria.json4.3 KB
  • evals/quiet-hours-dst-window/task.md3.2 KB
  • evals/shipment-enum-and-size/criteria.json2.7 KB
  • evals/shipment-enum-and-size/task.md2.1 KB
  • evals/username-length/criteria.json2.7 KB
  • evals/username-length/task.md1.9 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

boundary-value-generator

Overview

For each bounded input, emit the canonical six-point boundary set (min-1, min, min+1, max-1, max, max+1) per ISTQB boundary value analysis, plus equivalence-class representatives, as parameterized test inputs ready to paste into the project's test runner.

When to use

  • A function / endpoint has documented numeric / length / count constraints (age >= 18, name.length <= 100, items.count between 1 and 50).
  • A change introduces a new constraint and the team wants systematic boundary coverage in the same PR.
  • An existing test suite has happy-path coverage but no boundary cases; the team is filling the gap.
  • The gherkin-from-stories skill (in the qa-bdd plugin) produced AC with numeric thresholds; this skill turns each threshold into matching test cases.

Step 1 - Capture the input specification

The skill consumes a structured input spec - for each field:

FieldNotes
nameField name (e.g. age).
typeint / float / string / collection / enum.
minLower bound (numeric / length / count).
maxUpper bound.
enum_valuesFor enum type, the valid set.
nullableWhether null / missing is valid.
regexFor string type, optional regex constraint.

YAML example:

fields:
  - name: age
    type: int
    min: 18
    max: 120
    nullable: false
  - name: username
    type: string
    min: 3        # length
    max: 30       # length
    regex: '^[a-zA-Z0-9_]+$'
    nullable: false
  - name: tier
    type: enum
    enum_values: [free, starter, pro, enterprise]
    nullable: false
  - name: items
    type: collection
    min: 1        # count
    max: 50       # count
    nullable: true

Step 2 - Apply the generation rules per type

Numeric (int, float)

Six boundary points: min-1, min, min+1, max-1, max, max+1. For float, also include min - epsilon and max + epsilon where epsilon is the platform's smallest representable difference (often 1e-9 is sufficient for business-logic tests).

For age with min=18, max=120:

17, 18, 19, 119, 120, 121

String (length-bounded)

Same six boundary points but applied to length. Generate strings of those lengths from a deterministic source (e.g. repeated 'a', or a Faker call seeded with 42).

For username with min=3, max=30:

""           # length 0 - well below
"a"          # length 1 - well below
"aa"         # length 2 - min-1
"aaa"        # length 3 - min
"aaaa"       # length 4 - min+1
... (string of length 29)    # max-1
... (string of length 30)    # max
... (string of length 31)    # max+1

If a regex is also specified, the cases must satisfy the regex (e.g. [a-zA-Z0-9_]+ rejects empty string and any underscore-prefixed value depending on regex anchors). Generate both regex-matching and regex-violating cases - the latter verifies the rejection path.

Collection (count-bounded)

Same six boundary points applied to count. For items with min=1, max=50:

[]                                   # count 0 - below
[item_1]                              # count 1 - min
[item_1, item_2]                       # count 2 - min+1
[... 49 items]                        # count 49 - max-1
[... 50 items]                        # count 50 - max
[... 51 items]                        # count 51 - above

Item shape comes from the matching factory (Faker / mimesis / FactoryBot - see synthetic-data-toolkit).

Enum

Test each enum value plus one invalid value:

For tier with enum_values: [free, starter, pro, enterprise]:

"free", "starter", "pro", "enterprise", "INVALID_TIER"

The invalid case verifies the rejection path on a typo / removed tier name.

Nullable fields

If nullable: true, also test null / missing. If nullable: false, also test that null IS rejected - the rejection-path case.

Step 3 - Emit in the test-runner-native format

The skill emits cases in the project's test-runner-native format.

pytest

import pytest

@pytest.mark.parametrize("age,expected", [
    (17, "rejected"),
    (18, "accepted"),
    (19, "accepted"),
    (119, "accepted"),
    (120, "accepted"),
    (121, "rejected"),
])
def test_age_boundary(age, expected):
    result = create_user(age=age)
    assert result.status == expected

Jest / Vitest

test.each([
  [17, 'rejected'],
  [18, 'accepted'],
  [19, 'accepted'],
  [119, 'accepted'],
  [120, 'accepted'],
  [121, 'rejected'],
])('age %i is %s', (age, expected) => {
  expect(createUser({ age }).status).toBe(expected);
});

xUnit (.NET)

[Theory]
[InlineData(17, "rejected")]
[InlineData(18, "accepted")]
[InlineData(19, "accepted")]
[InlineData(119, "accepted")]
[InlineData(120, "accepted")]
[InlineData(121, "rejected")]
public void Age_Boundary(int age, string expected)
{
    var result = CreateUser(age: age);
    Assert.Equal(expected, result.Status);
}

JUnit 5 (Java)

@ParameterizedTest
@CsvSource({
    "17, rejected",
    "18, accepted",
    "19, accepted",
    "119, accepted",
    "120, accepted",
    "121, rejected"
})
void age_boundary(int age, String expected) {
    var result = createUser(age);
    assertThat(result.status()).isEqualTo(expected);
}

When NOT to apply boundaries

Some inputs don't have meaningful boundaries:

Input typeWhy no boundaries
Free-form names, descriptions, blobsLength is bounded by storage, not business meaning. Boundary cases produce noise tests.
UUIDs / opaque identifiersThe "valid" set is not range-bounded; equivalence classes are valid format vs. invalid format.
BooleansTwo values; just test both.
Dates without business semanticsA date in 1900 isn't a "boundary"; the boundaries are business-level (minimum age, max future date for scheduling).

For those, use equivalence partitioning - group inputs into classes that should produce identical behavior, test one representative per class.

Anti-patterns

Anti-patternWhy it failsFix
Testing only min and max (skip ±1)Off-by-one bugs hide in min-1 / min+1 adjacency.Always six points.
min-only when max is "infinite"Integer.MAX_VALUE-class overflows are still bugs.Use the type's max as max (e.g. 2^31 - 1 for int32).
String boundary using random characters every runNon-deterministic; flaky when the runner picks a regex-violating value by chance.Seed the generator; use a fixed alphabet.
One mega-test that asserts every boundary at onceOne failing boundary breaks the whole test; remediation hard.One test per boundary point - parametrized.
Skipping enum invalid-value testThe "INVALID" rejection path is untested; a removed enum value silently breaks.Always include one invalid enum case.

Limitations

  • Single-input boundaries. This skill covers per-field boundaries; for multi-field interactions (e.g. start_date < end_date), use the broader pairwise-test-case-generator with pairwise-combinatorial logic.
  • Domain-specific boundaries. A "valid US ZIP code" is 5 digits - boundary analysis won't surface that 99999 is valid but 10000 is not (Manhattan vs. Atlantic Ocean). Pair with domain validation rules.
  • Float arithmetic. Floating-point boundaries depend on representable precision; epsilon-based testing has its own pitfalls (see Hamming's classical critique).

References

  • ISTQB boundary value analysis - canonical definition.
  • ISTQB equivalence partitioning - the complementary technique.
  • pairwise-test-case-generator - broader skill including pairwise combinatorial cases.
  • negative-test-generator - sibling skill for rejection-path coverage.
  • synthetic-data-toolkit - for value generation when the boundary string requires a realistic-looking string.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

コメント

ログインなしで書き込めます。使ってみた感想、質問、動かなかった環境などを気軽にどうぞ。

まだコメントはありません。最初のコメントを書いてみませんか。

送信するとすぐに公開されます。メールアドレスや電話番号などの個人情報は書かないでください。URL は 2 つまでです。

0 / 1000 文字

このフォームは reCAPTCHA で保護されており、Google のプライバシーポリシーと利用規約が適用されます。

同じリポジトリのスキル

Builds a CI gate that fails the build on **new** WCAG / a11y violations introduced by a PR while grandfathering pre-existing violations on a per-rule / per-page baseline. Aggregates verdicts from axe-core / pa11y / Lighthouse a11y / WAVE / IBM Equal Access scans. Use when a project has accumulated a11y debt and a strict "zero violations" gate would block every PR - the ratchet pattern lets the team ship while preventing regressions.

日本語の概要は準備中です。原文の説明を表示しています。

testland/qa132026年10月20日 更新

Workflow skill that builds an A/B-test validity checklist from an experiment proposal, walking the canonical design-correctness gates - pre-registered OEC/power/guardrails, randomization unit + SRM check, assignment integrity, telemetry, peeking discipline, novelty/primacy, post-experiment SRM re-check - into a per-experiment checklist + sign-off form. Use when launching, auditing, or governing an experiment. For pitfall mechanics (guardrails, peeking) see experiment-results-interpreter's references; to read an already-valid result use experiment-results-interpreter; for per-SDK harness tests use experiment-sdk-testing - this gates DESIGN, not SDK code.

日本語の概要は準備中です。原文の説明を表示しています。

testland/qa132026年10月20日 更新

The single install-flow skill: the reference contract for the PWA install flow (installability gate fields, `beforeinstallprompt` handshake, per-platform paths - Android WebAPK / iOS Share menu / Firefox no-op - and the `display-mode` post-install signal, in references/install-flow-reference.md) plus the build-an-X workflow that emits the Add-to-Home-Screen suite. Walks the four-stage timeline, emitting one test per gate cell per [web.dev/articles/install-criteria][install-criteria], the deferred-prompt → `prompt()` → `userChoice` chain per [web.dev/articles/customize-install][customize-install], the iOS Safari manual-metadata branch (`apple-touch-icon`) per [web.dev/learn/pwa/installation][learn-pwa], and the post-install `(display-mode: standalone)` MQ assertion. Output: a Playwright spec with per-stage cells plus a coverage matrix. Use when a PWA's manifest, icons, or install handler change, when install conversion drops at an unknown stage, or when triaging a flaky install assertion.

日本語の概要は準備中です。原文の説明を表示しています。

testland/qa132026年10月20日 更新

Build-an-X workflow that uses an LLM to map existing tests to spec sections - given a spec doc + the test suite, the LLM identifies which tests cover which sections, surfaces uncovered sections (gap), and recommends specific tests to add. Output is a coverage matrix per spec ID. Scope is mapping tests that already exist and naming the gaps, not authoring tests for new acceptance criteria. Use when a spec doc and a test suite both exist but nobody can say which requirements are actually covered - before a release sign-off, an audit, or a decision about where to spend the next round of test effort.

日本語の概要は準備中です。原文の説明を表示しています。

testland/qa132026年10月20日 更新

Generates tests from natural-language specs (acceptance criteria, user stories, requirements) using an LLM, with confidence scoring per test case (LLM self-assessment plus heuristics: assertion quality, naming, completeness), batching uncertain cases for human review, and integration with the team's existing test framework. Use when the user asks to generate unit tests from acceptance criteria, convert user stories to test cases, automate test creation from requirements, or augment a spec-driven test suite with AI-generated stubs that are then curated before merge.

日本語の概要は準備中です。原文の説明を表示しています。

testland/qa132026年10月20日 更新

Configures Allure Report (test-runner adapter install, `allure-results` directory wiring, `categories.json` for failure classification, `history-trend.json` retention via the copy-history-between-runs pattern), runs the Allure CLI to convert `allure-results` to a static HTML site, and uploads the report as a CI artifact. Use when the team needs richer test reporting than JUnit XML - step-level attachments, per-test history, retry tracking, and severity / epic / feature labeling across framework-agnostic adapters (pytest, Jest, JUnit, TestNG, NUnit, Mocha). As a rich static HTML report generator, it is the open-source alternative to the sunset ExtentReports (JVM/.NET per-test HTML narrative); for hosted cross-run flakiness analytics rather than a static per-run report use currents-integration.

日本語の概要は準備中です。原文の説明を表示しています。

testland/qa132026年10月20日 更新

testland のスキルをすべて見る

このスキルの問題を報告する