Skip to content

Golang linter that encourages you to use a separate _test package

License

Notifications You must be signed in to change notification settings

maratori/testpackage

Repository files navigation

testpackage
go minimal version go tested version CI Codecov Codebeat Maintainability Go Report Card License Go Reference

testpackage is a golang linter that makes you use a separate _test package.

Motivation

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:

Usage

The best way is to use golangci-lint. It includes testpackage and a lot of other great linters.

Install

See official site.

Configuration

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

Run

golangci-lint run

Usage as standalone linter

Install

go install github.com/maratori/testpackage

Run

testpackage ./...

or

testpackage -skip-regexp="^$" ./...

Command line arguments

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

Contributors

Changelog

[v1.1.1] - 2023-03-07

Changed

  • Update golang to 1.20
  • Update dependencies
  • Update golangci-lint to v1.51.2
  • Update Makefile

[v1.1.0] - 2022-06-22

Changed

  • 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

[v1.0.1] - 2020-04-22

Changed

  • No changes in linter behavior
  • Use latest go version on travis-ci
  • Update Makefile
  • Update golangci-lint

[v1.0.0] - 2019-11-10

Added

  • Go Analyzer to check the name of test package
  • main.go to run the analyzer
  • MIT license