-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add ParameterizedTest#argumentCountValidation #4045
Add ParameterizedTest#argumentCountValidation #4045
Conversation
This allows parameterized tests to fail when there are more arguments provided than declared by the test method. This is done in a backwards compatible way by only enabling that validation when the new `junit.jupiter.params.argumentCountValidation` is set to `strict` or `ParameterizedTest#argumentCountValidation` is set to `ArgumentCountValidationMode.STRICT`.
2b42de8
to
2e56d56
Compare
junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java
Outdated
Show resolved
Hide resolved
junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java
Outdated
Show resolved
Hide resolved
logger.warn(() -> String.format( | ||
"Ignored invalid configuration '%s' set via the '%s' configuration parameter.", value, key)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The error message should be the same as in EnumConfigurationParameterConverter
. Unfortunately, we can't (easily) reuse that here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there some way that we could make it more easily reusable across the project? Maybe I could add another PR to address that after merging this one.
For now, I basically copied the messages from EnumConfigurationParameterConverter
.
jupiter-tests/src/test/java/org/junit/jupiter/params/ParameterizedTestIntegrationTests.java
Outdated
Show resolved
Hide resolved
jupiter-tests/src/test/java/org/junit/jupiter/params/ParameterizedTestIntegrationTests.java
Show resolved
Hide resolved
Our guideline is to introduce new features as "experimental".
I think we should add a small sample to the User Guide otherwise the chance to get feedback is slim.
Documenting preconditions is mainly interesting for public API so we can omit it here since |
# Conflicts: # junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTest.java # junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java
- add `writing-tests-parameterized-tests-argument-count-validation` section to the user guide. - cache configuration parameter in `ExtensionContext.Store` - adjust log and error messages Issue junit-team#3708
Thank you for all the pointers and comments on this PR @marcphilipp. I've addressed all your comments. Could you have another look? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for making those changes! I think we're very close now. Please also add an entry to the 5.12.0-M1 release notes.
junit-jupiter-params/src/main/java/org/junit/jupiter/params/ArgumentCountValidationMode.java
Outdated
Show resolved
Hide resolved
junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTest.java
Outdated
Show resolved
Hide resolved
junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java
Outdated
Show resolved
Hide resolved
junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java
Outdated
Show resolved
Hide resolved
release-notes-5.12.0-M1-junit-jupiter-new-features-and-improvements to be exact Issue junit-team#3708
Co-authored-by: Marc Philipp <[email protected]>
Co-authored-by: Marc Philipp <[email protected]>
Co-authored-by: Marc Philipp <[email protected]>
Co-authored-by: Marc Philipp <[email protected]>
65cd018
to
0bf0b05
Compare
documentation/src/docs/asciidoc/release-notes/release-notes-5.12.0-M1.adoc
Outdated
Show resolved
Hide resolved
@marcphilipp could you review again? I applied all suggestions and added a release note. |
documentation/src/docs/asciidoc/release-notes/release-notes-5.12.0-M1.adoc
Outdated
Show resolved
Hide resolved
documentation/src/docs/asciidoc/release-notes/release-notes-5.12.0-M1.adoc
Outdated
Show resolved
Hide resolved
Co-authored-by: Marc Philipp <[email protected]>
Co-authored-by: Marc Philipp <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like @ExpectToFail
doesn't work as I had expected. 😅 I'll take a closer look.
junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java
Outdated
Show resolved
Hide resolved
junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java
Outdated
Show resolved
Hide resolved
This should result in invocations with valid argument counts still being executed and only invocations with invalid argument counts fail. Issue junit-team#3708
@marcphilipp do you know how to fix the DiskLruCache issue on the Windows check? I see some PRs, like #4120 are having the same issue. |
Not sure. It might be a problem that started after updating Gradle to 8.11. 🤔 |
A rerun succeeded. It does seem to happen since yesterday's Gradle update. I'll keep an eye on it. |
@marcphilipp could you review the latest changes? Like you suggested, the ArgumentCountValidator now only fails the invocations that have too many arguments and still runs the other invocations that have the correct number of arguments and I also added an integration test for that case. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good! I've only two small suggestions. Please let me know if you have time to do those or whether I should take over.
} | ||
|
||
private ExtensionContext.Store getStore(ExtensionContext context) { | ||
return context.getRoot().getStore(ExtensionContext.Namespace.create(getClass())); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please create a constant for ExtensionContext.Namespace.create(ArgumentCountValidator.class)
.
ParameterizedTest parameterizedTest = findAnnotation(// | ||
extensionContext.getRequiredTestMethod(), ParameterizedTest.class// | ||
).orElseThrow(NoSuchElementException::new); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Instead of looking up the annotation, we should pass ParameterizedTestMethodContext
to the constructor
Thanks! I'll make those changes you suggested today or tomorrow :) |
@marcphilipp could you merge the PR? And of course feel free to review the small change you suggested. |
@JonasJebing Thank you for your contribution! 👍 |
Overview
This allows parameterized tests to fail
when there are more arguments provided than declared by the test method. This is done in a backwards compatible way
by only enabling that validation when the new
junit.jupiter.params.argumentCountValidation
is set tostrict
orParameterizedTest#argumentCountValidation
is set toArgumentCountValidationMode.STRICT
.Open Questions
Should these additions be declared as experimental or stable?Should this feature be documented in the User Guide and Release Notes, given that it is declared as experimental?Should the new precondition be documented onorg.junit.jupiter.params.ParameterizedTestExtension#provideTestTemplateInvocationContexts
, even though it is just an interface override and none of the existing preconditions are documented there?I hereby agree to the terms of the JUnit Contributor License Agreement.
Definition of Done
@API
annotations