testpackage is a golang linter that makes you use a separate _test
package.
According to blackbox testing approach, you should not use unexported functions and methods from source code in tests.
Go allows to place tests in a separate package with suffix _test
.
For example, tests for store
package can be in the same package or in the package store_test
.
In the second case, you have to import the source code into tests so only exported things are available.
The linter reports if a test is in a package without suffix _test
.
If you really need to test unexported function, then put the test into file XXX_internal_test.go
.
The linter skips such files by default.
It also skips the file export_test.go
by default (see the last article below).
More detailed articles on this topic:
- Next level Go testing by Tit Petric
- 5 simple tips and tricks for writing unit tests in #golang by Mat Ryer
- 5 advanced testing techniques in Go by Alan Braithwaite
- Golang Trick: Export unexport method for test by lysu
The best way is to use golangci-lint. It includes testpackage and a lot of other great linters.
See official site.
testpackage is disabled by default. To enable it, add the following to your .golangci.yml
:
linters:
enable:
testpackage
You can also change the regexp that is used to ignore files by the linter, and the list of packages that are allowed by default.
Here are the default values:
linters-settings:
testpackage:
skip-regexp: (export|internal)_test\.go
allow-packages:
- main
golangci-lint run
go install github.com/maratori/testpackage
testpackage ./...
or
testpackage -skip-regexp="^$" ./...
testpackage -help
testpackage: linter that makes you use a separate _test package
Usage: testpackage [-flag] [package]
Flags:
-skip-regexp string
regexp pattern to skip file by name. To not skip files use -skip-regexp="^$" (default "(export|internal)_test\\.go")
-allow-packages string
comma separated list of packages that don't end with _test that tests are allowed to be in (default "main")
-V print version and exit
-c int
display offending line with this many lines of context (default -1)
-cpuprofile string
write CPU profile to this file
-debug string
debug flags, any subset of "fpstv"
-fix
apply all suggested fixes
-flags
print analyzer flags in JSON
-json
emit JSON output
-memprofile string
write memory profile to this file
-test
indicates whether test files should be analyzed, too (default true)
-trace string
write trace log to this file
- Update golang to 1.20
- Update dependencies
- Update golangci-lint to v1.51.2
- Update Makefile
- Allow tests in
main
package by default and add flag-allow-packages
to allow tests without_test
suffix (thanks G-Rath) - Update golang to 1.18
- Migrate to github actions from travis-ci
- Update golangci-lint to v1.46.2
- No changes in linter behavior
- Use latest go version on travis-ci
- Update Makefile
- Update golangci-lint
- Go Analyzer to check the name of test package
main.go
to run the analyzer- MIT license