-
Notifications
You must be signed in to change notification settings - Fork 1.6k
🌱improve Ginkgo/Gomega test style #4426
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
Conversation
|
Hi @Sijoma. Thanks for your PR. I'm waiting for a kubernetes-sigs member to verify that this patch is reasonable to test. If it is, they should reply with Once the patch is verified, the new status will be reflected by the I understand the commands that are listed here. Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. |
test/e2e/v4/plugin_cluster_test.go
Outdated
| g.ExpectWithOffset(2, err).NotTo(HaveOccurred()) | ||
| // check that ca should be long enough, because there may be a place holder "\n" | ||
| ExpectWithOffset(2, len(mwhOutput)).To(BeNumerically(">", 10)) | ||
| g.ExpectWithOffset(2, len(mwhOutput)).To(BeNumerically(">", 10)) |
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 idea is to follow the same approach as the test scaffolds: https://github.com/kubernetes-sigs/kubebuilder/tree/master/testdata/project-v4/test (as closer as possible is the ideal, same standards of checks)
If you look there, you will see that it is quite similar to what we do here. You can indeed compare the same checks for metrics etc.
For example, we should no longer use ExpectWithOffset; instead, we should use the functions and simplify it.
Look at #4135
And check the PRs done by @mogsie related to the tests: https://github.com/kubernetes-sigs/kubebuilder/pulls?q=is%3Apr+author%3Amogsie+is%3Aclosed
I think that will help out understand better what we are trying to do,
BTW, thank you a lot for checking this one
|
@camilamacedo86 does this go in the right direction? Some test looked like they could be refactored to a table driven test, the ones with the It's a bit confusing since #4135 still contains examples that contain Happy to get an example if some of these changes are not correct how to fix it. Edit: This doesn't even work as the Context nodes cannot have a function where Gomega is passed. |
| var controllerPodName string | ||
| var err error | ||
|
|
||
| By("creating manager namespace") |
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.
Hi @Sijoma
Please, ensure that you have your changes released with master
Also, please squash the commits; We should not have more than 1 commit to be able to get it merged
Thank you 🥇
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.
Squashed & Rebased it now.
Thanks!
|
|
||
| By("validating that the Prometheus manager has provisioned the Service") | ||
| EventuallyWithOffset(1, func() error { | ||
| Eventually(func(g Gomega) { |
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.
I think there is no need to change function inside Eventually. The .Should(Succeed()) will do the assertion for us
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.
I found it a bit simpler to not have return values inside these functions. It's a bit simpler to reason as there is nothing returned.
That way we can already immediately see that the error should never occur. Whereas when we return it it could be still checked for NotFound etc.
WDYT?
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.
Using a func(Gomega) in an Eventually is more "scalable" in that if you want to do more things inside the function, you can keep to the Gomega semantics with assertions.
- The error messages tell you exactly what's wrong.
- The line number of the error is correct (the error points you to the line inside the func() not just the line of the Eventually() call).
- No need to switch between two different ways of checking for errors in tests.
So my vote is to keep this change.
|
/ok-to-test |
|
/retest |
|
Not really sure what went wrong here: I see the following logs:
|
|
Seeing it now:
|
|
Also realised now that |
| _, err = kbc.Kubectl.Command("label", "namespaces", kbc.Kubectl.Namespace, | ||
| "metrics=enabled") | ||
| ExpectWithOffset(2, err).NotTo(HaveOccurred()) | ||
| Expect(kbc.Kubectl.Command("label", "namespaces", kbc.Kubectl.Namespace, |
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.
I also like this simpler in-line Expect(...).Error().NotTo(HaveOccurred()) — any reason why you made this change (only) here, and not the other places?
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.
I started to work through it a bit - and initially changed a couple of more things (also incorrect ones). So I didn't want to move everything in one go. I then focused really on all the "...WithOffset" calls and the functions passed to Eventually(...)
Happy to add also change it in more places. I agree that it's better. Maybe just as a follow up pr? Or is there a preference to have it more in one PR?
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.
It's probably ok to do it in several PRs. I'd keep it focused and to-the-point, so that PRs don't need to live too long and need constant rebasing etc. The PR you have already fixes a lot of actual bugs (i.e. the Eventually() calls that use the global assertions).
I remember a few months back, when I fixed assertion code like this, I discovered that the test itself was testing the completely wrong thing, and the incorrect assertions just happened to allow the test to pass.
So, when you do fix things like this, you might end up with tests that don't pass, and it might just be that the test itself was not testing what the original authors thought it was testing.
camilamacedo86
left a comment
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.
/lgtm
/ok-to-test
/approve
Well DONE 🥇
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: camilamacedo86, mogsie, Sijoma The full list of commands accepted by this bot can be found here. The pull request process is described here
Needs approval from an approver in each of these files:
Approvers can indicate their approval by writing |
Updates a couple of e2e tests to use Gomega style mentioned in #4135 .
I'm not sure if I 100% understood the issue so before I try to rewrite all of them I thought it would be better to create a smaller PR to get feedback earlier.
relates #4424