본문으로 건너뛰기
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 / 1,000자

이 양식은 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의 스킬 모두 보기

이 스킬의 문제 신고