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:
testpackageYou 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:
- maingolangci-lint rungo install github.com/maratori/testpackagetestpackage ./...or
testpackage -skip-regexp="^$" ./...testpackage -helptestpackage: 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
mainpackage by default and add flag-allow-packagesto allow tests without_testsuffix (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.goto run the analyzer- MIT license