Skip to main content

Parameterized Tests

Run evaluations across an entire dataset using JUnit 5's @ParameterizedTest with the @DatasetSource annotation.

Basic Dataset Test

@ExtendWith(AgentEvalExtension.class)
class GoldenSetEvalTest {

private final RefundAgent agent = new RefundAgent();

@ParameterizedTest
@DatasetSource("src/test/resources/refund-golden-set.json")
@Metric(value = AnswerRelevancy.class, threshold = 0.7)
@Metric(value = Faithfulness.class, threshold = 0.8)
void evaluateGoldenSet(AgentTestCase testCase) {
testCase.setActualOutput(agent.run(testCase.getInput()));
}
}

Dataset Format

refund-golden-set.json:

[
{
"input": "What is the refund window?",
"expectedOutput": "30 days from purchase date.",
"retrievalContext": [
"Customers may return items within 30 days of purchase."
],
"metadata": {
"category": "policy",
"difficulty": "easy"
}
},
{
"input": "Can I get a refund after 45 days?",
"expectedOutput": "No, the return window is 30 days.",
"retrievalContext": [
"Returns are only accepted within 30 days of purchase."
],
"metadata": {
"category": "policy",
"difficulty": "medium"
}
}
]

CSV Dataset

@ParameterizedTest
@DatasetSource("src/test/resources/test-cases.csv")
@Metric(value = AnswerRelevancy.class, threshold = 0.7)
void evaluateCsvDataset(AgentTestCase testCase) {
testCase.setActualOutput(agent.run(testCase.getInput()));
}

test-cases.csv:

input,expectedOutput
"What is the refund window?","30 days from purchase."
"Can I return a digital product?","Digital products are non-refundable."

JSONL Dataset (Streaming)

@ParameterizedTest
@DatasetSource("src/test/resources/large-dataset.jsonl")
void evaluateLargeDataset(AgentTestCase testCase) {
testCase.setActualOutput(agent.run(testCase.getInput()));
}

Filter by Metadata

@ParameterizedTest
@DatasetSource(value = "golden-set.json", filter = "metadata.category == 'refund'")
void evaluateRefundCategory(AgentTestCase testCase) { ... }

Programmatic Dataset Loading

For more control, use the programmatic API:

@Test
void programmaticBatchEval() throws Exception {
var dataset = EvalDataset.load("src/test/resources/golden-set.json");

// Run agent over entire dataset
for (var testCase : dataset.cases()) {
testCase.setActualOutput(agent.run(testCase.getInput()));
}

var results = AgentEval.evaluate(dataset,
List.of(new AnswerRelevancy(0.7), new Faithfulness(0.8))
);

results.summary(); // prints to console
assertTrue(results.passRate() >= 0.90,
"Pass rate below 90%: " + results.passRate());
}

Aggregate Results

Fail the test if the overall pass rate drops below a threshold:

@Test
void overallPassRateShouldExceed90Percent() {
var results = AgentEval.evaluate(goldenSet,
List.of(new AnswerRelevancy(0.7), new Faithfulness(0.8))
);

assertAll(
() -> assertTrue(results.passRate() >= 0.90,
"Pass rate: " + results.passRate()),
() -> assertTrue(results.averageScore() >= 0.80,
"Avg score: " + results.averageScore())
);
}