
Unit Test Parameterized
- 1.7k installs
- 311 repo stars
- Updated June 22, 2026
- giuseppe-trisciuoglio/developer-kit
JUnit 5 parameterized testing framework that runs single test method with multiple input values from data sources (@ValueSource, @CsvSource, @MethodSource, @EnumSource, @ArgumentsSource) to reduce duplication and test co
About
Provides parameterized testing patterns for JUnit 5 in Java, covering @ParameterizedTest, @ValueSource, @CsvSource, @MethodSource, @EnumSource, and @ArgumentsSource. Developers use this to reduce test duplication by running identical test logic with multiple input combinations, boundary values, and edge cases. Key workflows include setting up dependencies (junit-jupiter-params), choosing appropriate data sources (simple values, tabular CSV, complex objects), matching test method parameters to source types, configuring readable display names, and validating execution across all parameter combinations.
- Supports multiple data sources: @ValueSource for primitives/strings, @CsvSource for tabular data, @MethodSource for comp
- Each parameter set executes as a separate test invocation with customizable display names using {0}, {1} placeholders fo
- Built-in boundary value testing with examples covering Integer.MIN_VALUE, Integer.MAX_VALUE, zero, and edge cases
- Factory methods for @MethodSource must be static in same test class; parameter count must match test method signature ex
- Requires junit-jupiter dependency (includes junit-jupiter-params); compatible with Maven and Gradle build tools
Unit Test Parameterized by the numbers
- 1,663 all-time installs (skills.sh)
- +57 installs in the week ending Jul 28, 2026 (Skillselion tracking)
- Ranked #434 of 2,184 Testing & QA skills by installs in the Skillselion catalog
- Security screen: MEDIUM risk (skills.sh audit)
- Data as of Jul 28, 2026 (Skillselion catalog sync)
unit-test-parameterized capabilities & compatibility
- Capabilities
- generate @parameterizedtest methods from test da · create @methodsource factory methods returning s · transform tabular data into @csvsource annotatio · validate parameter count matches test method sig · configure readable display names with placeholde · apply boundary value analysis patterns
- Use cases
- testing · code review
- Platforms
- macOS · Windows · Linux
- IDEs
- intellij · jetbrains · vscode · pycharm
- Runs
- Runs locally
- Pricing
- Free
What unit-test-parameterized says it does
Reduces test duplication by running the same test logic with multiple input values.
Test boundary values: include min, max, zero, and edge cases
npx skills add https://github.com/giuseppe-trisciuoglio/developer-kit --skill unit-test-parameterizedAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1.7k |
|---|---|
| repo stars | ★ 311 |
| Security audit | 3 / 3 scanners passed |
| Last updated | June 22, 2026 |
| Repository | giuseppe-trisciuoglio/developer-kit ↗ |
What it does
Write Java unit tests that run the same logic across multiple input values using JUnit 5 parameterized test annotations.
Who is it for?
Testing multiple scenarios with single method, implementing boundary value analysis, validating email/input validation, testing calculator or mathematical operations, enum handling, CSV data transformation.
Skip if: Integration tests, tests requiring complex setup/teardown, UI testing, tests with external dependencies.
When should I use this skill?
Writing Java unit tests with multiple test cases, need boundary value coverage, testing with tabular data, validating the same logic across diverse inputs.
What you get
Developers write concise, maintainable data-driven tests that automatically execute the same test logic across multiple input combinations with readable output and boundary value coverage.
- parameterized JUnit 5 test classes
By the numbers
- Covers 6 parameterized test annotation types: @ValueSource, @CsvSource, @MethodSource, @EnumSource, @ArgumentsSource, cu
- Examples include boundary value testing with Integer.MIN_VALUE, Integer.MAX_VALUE, and zero
- Each parameter set executes as a separate test invocation with independent reporting
Files
Parameterized Unit Tests with JUnit 5
Overview
Provides patterns for parameterized unit tests in Java using JUnit 5. Covers @ValueSource, @CsvSource, @MethodSource, @EnumSource, @ArgumentsSource, and custom display names. Reduces test duplication by running the same test logic with multiple input values.
When to Use
- Writing JUnit tests with multiple input combinations
- Implementing data-driven tests in Java
- Running same test with different values (boundary analysis)
- Testing multiple scenarios from single test method
Instructions
1. Add dependency: Ensure junit-jupiter-params is on test classpath (included in junit-jupiter) 2. Choose source: @ValueSource for simple values, @CsvSource for tabular data, @MethodSource for complex objects 3. Match parameters: Test method parameters must match data source types 4. Set display names: Use name = "{0}..." for readable output 5. Validate: Run ./gradlew test --info or mvn test and verify all parameter combinations execute
Examples
Maven / Gradle Dependency
JUnit 5 parameterized tests require junit-jupiter (includes params). Add assertj-core for assertions:
<!-- Maven -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>// Gradle
testImplementation("org.junit.jupiter:junit-jupiter")@ValueSource — Simple Values
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import static org.assertj.core.api.Assertions.*;
@ParameterizedTest
@ValueSource(strings = {"hello", "world", "test"})
void shouldCapitalizeAllStrings(String input) {
assertThat(StringUtils.capitalize(input)).isNotEmpty();
}
@ParameterizedTest
@ValueSource(ints = {1, 2, 3, 4, 5})
void shouldBePositive(int number) {
assertThat(number).isPositive();
}
@ParameterizedTest
@ValueSource(ints = {Integer.MIN_VALUE, -1, 0, 1, Integer.MAX_VALUE})
void shouldHandleBoundaryValues(int value) {
assertThat(Math.incrementExact(value)).isGreaterThan(value);
}@CsvSource — Tabular Data
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
@ParameterizedTest
@CsvSource({
"alice@example.com, true",
"bob@gmail.com, true",
"invalid-email, false",
"user@, false",
"@example.com, false"
})
void shouldValidateEmailAddresses(String email, boolean expected) {
assertThat(UserValidator.isValidEmail(email)).isEqualTo(expected);
}@MethodSource — Complex Data
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import java.util.stream.Stream;
@ParameterizedTest
@MethodSource("additionTestCases")
void shouldAddNumbersCorrectly(int a, int b, int expected) {
assertThat(Calculator.add(a, b)).isEqualTo(expected);
}
static Stream<Arguments> additionTestCases() {
return Stream.of(
Arguments.of(1, 2, 3),
Arguments.of(0, 0, 0),
Arguments.of(-1, 1, 0),
Arguments.of(100, 200, 300)
);
}@EnumSource — Enum Values
@ParameterizedTest
@EnumSource(Status.class)
void shouldHandleAllStatuses(Status status) {
assertThat(status).isNotNull();
}
@ParameterizedTest
@EnumSource(value = Status.class, names = {"ACTIVE", "INACTIVE"})
void shouldHandleSpecificStatuses(Status status) {
assertThat(status).isIn(Status.ACTIVE, Status.INACTIVE);
}Custom Display Names
@ParameterizedTest(name = "Discount of {0}% should be calculated correctly")
@ValueSource(ints = {5, 10, 15, 20})
void shouldApplyDiscount(int discountPercent) {
double result = DiscountCalculator.apply(100.0, discountPercent);
assertThat(result).isEqualTo(100.0 * (1 - discountPercent / 100.0));
}Custom ArgumentsProvider
class RangeValidatorProvider implements ArgumentsProvider {
@Override
public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
return Stream.of(
Arguments.of(0, 0, 100, true),
Arguments.of(50, 0, 100, true),
Arguments.of(-1, 0, 100, false),
Arguments.of(101, 0, 100, false)
);
}
}
@ParameterizedTest
@ArgumentsSource(RangeValidatorProvider.class)
void shouldValidateRange(int value, int min, int max, boolean expected) {
assertThat(RangeValidator.isInRange(value, min, max)).isEqualTo(expected);
}Error Condition Testing
@ParameterizedTest
@ValueSource(strings = {"", " ", null})
void shouldThrowExceptionForInvalidInput(String input) {
assertThatThrownBy(() -> Parser.parse(input))
.isInstanceOf(IllegalArgumentException.class);
}Best Practices
- Use descriptive display names:
name = "{0}..."for readable output - Test boundary values: include min, max, zero, and edge cases
- Keep test logic focused: single assertion per parameter set
- Use
@MethodSourcefor complex objects,@CsvSourcefor tabular data - Organize test data logically — group related scenarios together
Constraints and Warnings
- Parameter count must match: Number of parameters from source must match test method signature
- `@ValueSource` limitation: Only supports primitives, strings, and enums — not objects or null directly
- CSV escaping: Strings with commas must use single quotes in
@CsvSource - `@MethodSource` visibility: Factory methods must be static in the same test class
- Display name placeholders: Use
{0},{1}, etc. to reference parameters - Execution count: Each parameter set runs as a separate test invocation
References
Related skills
Forks & variants (1)
Unit Test Parameterized has 1 known copy in the catalog totaling 21 installs. They canonicalize to this original listing.
- giuseppe-trisciuoglio - 21 installs
How it compares
Choose unit-test-parameterized over manual copy-paste tests when input matrices grow beyond a handful of cases in JUnit 5.
FAQ
What is the difference between @ValueSource and @CsvSource?
@ValueSource accepts primitives, strings, or enums for simple single-parameter tests. @CsvSource accepts comma-separated tabular data for multi-parameter tests; strings with commas require single quotes.
Must @MethodSource factory methods be static?
Yes, factory methods for @MethodSource must be static in the same test class and return Stream<Arguments>. Parameters must match test method signature exactly.
How do I make parameterized test output readable?
Use the name attribute: @ParameterizedTest(name = "Description {0}") and placeholders {0}, {1}, etc. to reference parameters in readable test output.
Is Unit Test Parameterized safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.