-
Notifications
You must be signed in to change notification settings - Fork 17.8k
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
testing: add TB.TempDir() string #35998
Comments
Is it possible that the artifacts in the temporary directory would be useful in the event of a test failure? In which case, the directory should not be removed. Or should it be expected that any t.Error calls contain all the necessary information to debug the failure? |
Yeah, the artifacts could be useful for debugging. If there is an explicit os.RemoveAll, I can just comment that out when debugging. With the new function I guess I can do the same by digging into the testing package and commenting out that line, but that is more complicated. Maybe add a new helper that keeps the artifacts that can be used for debugging? t.Keep()? t.NoCleanup? |
@cherrymui, no need. You can write: defer func() { if t.Failed() { os.Exit(1) } } Or since you know it's already failing: defer log.Fatalf("check out the failing files in %v", t.TempDir()) ... then no cleanup will happen due to the |
Why not have a flag which prevents tempdir deletion, something like |
@bradfitz Good to know. Thanks! |
@zikaeroh, flag/knob fatigue. Too much crap can be overwhelming. Especially for stuff that's rarely needed. "It might be useful sometimes" is not the bar to add stuff. You also have to consider the fatigue costs for more docs and more |
Since I’m not seeing it mentioned, have you considered a more verbose and explicit API variation that returns a cleanup closure? Somewhat inspired by func (*T) TempDir() (dir string, cleanup func()) It would make idiomatic first usage require two extra lines: func Test(t *testing.T) {
// ...
tempDir, cleanup := t.TempDir()
defer cleanup()
// ... use tempDir
} The advantage would be that it’s easier to temporarily modify not to clean up, more readable that there’s no leak to first-time readers, possible to detect when cleanup isn’t called, but at the cost of some additional verbosity. But maybe two lines isn’t bad compared to the 4+ it requires now. Throwing it out there for consideration, but I’m not convinced this would be better. |
@dmitshur, if I wanted to write verbose code, I already can today? 🤷♂️ |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
I wrote some tempdir helpers that we use for a lot of tests at work. A trick I used (which I took from @tv42) is to detect whether the test is being run under |
Would love to have that possible without hacks like that! |
Now that we have t.Cleanup, this seems like a very nice API. I'd be in favor of trying this. Anyone else have any thoughts? |
We've been using:
Since it's quite common to want a filename or a subdirectory, rather than just the "root directory". |
The manual version also doesn't work well when one or more of the directories ends up read-only. (In that case, the obvious That could be addressed in |
In general, I think this is very useful functionality and probably worth adding to the standard library. Having been using a similar thing for quite a few years (named FWIW, two other similar helpers I've found enduringly useful over time are Setenv and Patch, in case those might be considered for adding too. |
Does it have to be a part of |
It seems like temporary directories do come up in a large enough variety of tests to be part of
The directory should be named with the test binary name and the test function name. Based on the discussion above, it sounds like this is a likely accept. |
No change in consensus, so accepted. |
Change https://golang.org/cl/226877 mentions this issue: |
Change https://golang.org/cl/226983 mentions this issue: |
Updates #35998 Change-Id: I93784e9a9efdd1531e3c342aa0899bf059da0ae1 Reviewed-on: https://go-review.googlesource.com/c/go/+/226983 Reviewed-by: Ian Lance Taylor <[email protected]>
What's the guideline for making sure the package The test code is not explicitly excluded from the document, and it's unclear to me if we're in the "it may be necessary to add methods to types" case, which seems to be more concerned about structs and embedding. |
@Deleplace note that the docs already say https://golang.org/src/testing/testing.go?s=19485:20043#L536
If someone wants to use a subset of the interface that's also implemented by other types, they should declare their own interface with the few methods they are interested in. Backwards compatibility will apply there, because we will only ever add methods to TB, not modify or remove existing ones. |
Thanks Daniel, that's exactly the info I was looking for! Indeed I was not aware of |
Inspired by golang/go#35998.
It's pretty usual to have tests make temp files.
And it's pretty usual to have tests leak temp files. (#23619 tracks detecting it for Go's own tests, as it keeps coming up)
Doing things properly also gets kinda boilerplatey.
I propose adding a method to testing.TB, *testing.T, and *testing.B something like this:
The text was updated successfully, but these errors were encountered: