Golang testa no subdiretório

121

Quero criar um pacote em Go com testes e exemplos do pacote como subdiretórios para manter o espaço de trabalho mais limpo. Isso é possível e se sim como?

Toda a documentação sempre coloca o código de teste no mesmo lugar que o outro código, isso é melhor de alguma forma ou apenas por convenção?

O pinguim gracioso
fonte
5
Nota: go test ./...irá executar testes na pasta atual e em todas as subpastas. Veja minha resposta abaixo
VonC
Possível duplicata de How to `go test` all testings em meu projeto?
Matthew Rankin
Eu estava pensando a mesma coisa. tendo problemas para colocar testes em um diretório separado porque diretor no mesmo nível tem sub-diretórios.
filthy_wizard

Respostas:

203

Observe que você pode executar go test"recursivamente": você precisa listar todos os pacotes que deseja testar .

Se você estiver na pasta raiz do seu projeto Go, digite:

go test ./...

A ./...notação ' ' é descrita na seção " Descrição das listas de pacotes " do " comandogo ":

Um caminho de importação é um padrão se inclui um ou mais ...curingas " ", cada um dos quais pode corresponder a qualquer string, incluindo a string vazia e strings contendo barras.

Esse padrão se expande para todos os diretórios de pacotes encontrados nas GOPATHárvores com nomes que correspondem aos padrões.

Como um caso especial, x/...corresponde xbem como xaos subdiretórios de.
Por exemplo, net/...expande para nete pacotes em seus subdiretórios.


Se você mantiver seus _test.goarquivos em uma subpasta, o go test ./...comando ' ' poderá pegá-los.
Mas:

  • você precisará prefixar suas variáveis ​​e funções exportadas (usadas em seus testes) com o nome de seu pacote, para que o arquivo de teste possa acessar o conteúdo exportado do pacote.
  • você não acessaria conteúdo não exportado.

Dito isso, eu ainda prefiro manter o _test.goarquivo ao lado do arquivo fonte principal: é mais fácil de encontrar.

VonC
fonte
4
Alguns podem argumentar que o não acesso a itens privados é um teste normal e melhor. Quanto a ter que qualificar símbolos públicos, você sempre pode importar _ "...".
ddevienne
15

Coloque seus testes junto com seu código no mesmo diretório em um arquivo chamado, file_test.goonde "arquivo" é o nome do arquivo de código-fonte que você está testando. Isso é uma convenção e descobri que é o melhor em minha própria experiência.

Se a go testferramenta não for totalmente automatizada para você, você pode olhar para GoConvey , que tem uma IU da web que irá atualizar e executar automaticamente testes Go tradicionais, bem como testes GoConvey (que são baseados no comportamento e são mais autodocumentados do que os testes Go tradicionais).

Matt
fonte
2
GoConvey é incrível (e estou esperando pela nova IU com grande expectativa). Estou usando em meu projeto atual como em github.com/VonC/asciidocgo/blob/master/abstractNode_test.go , por exemplo). No entanto, go testtambém pode funcionar para subpastas. Veja minha resposta abaixo
VonC
Você está certo. Na verdade, é provavelmente mais relevante do que minha resposta a essa pergunta.
Matt
10

EDITADO

Baseado na resposta de VonC,

Esta resposta é válida em go1.11. Ainda não testado em goversões superiores .

Para aqueles de vocês que gostam de manter seus testes em uma subpasta, digamos test, em seguida, executando

go test ./...

tentará executar testes em todas as pastas, mesmo aquelas que não contêm nenhum teste, tendo, portanto, um ?no relatório subsequente para pastas que não sejam de teste.

Corrida

go test ./.../test

em vez disso, terá como alvo apenas suas testpastas, tendo assim um relatório limpo focado apenas em suas pastas de teste.

CUIDADO

Esteja ciente de que o uso de subpastas de teste impedirá o cálculo do relatório de cobertura. A filosofia do go é deixar os arquivos de teste nas pastas do pacote.

avi.elkharrat
fonte
1
Boa dica, além da minha resposta de cinco anos. Votos positivos
VonC
querida anna, explique o que não funciona? e qual é a sua versão de go? O que você está tentando fazer? Percebi depois que esse método não permite calcular a cobertura de código, o que é uma pena. É isto que você quer dizer?
avi.elkharrat
1
go test ./.../testretorna go: warning: "./.../test" matched no packages// não tem como alvo apenas as pastas de teste. go versão go1.13 darwin / amd64
anna
1
@Madeo, faria sentido, porque golang não incentiva a segregação de testes e código. A anomalia era permitir isso em versões anteriores.
avi.elkharrat
1
@ avi.elkharrat e, na verdade, decidi não usar mais essa abordagem, embora eu gostasse de manter meus testes em um pacote / pasta separado = (
Madeo
-4

Eu normalmente não faço testes, mas você pode agrupar seu arquivo em diretórios e usar importação como

import "./models"se é um nível fora,
import "../modelsse é um nível fora e um nível dentro

Por exemplo, para:
./models/todo.go
./test/todo_test.go

para teste todo.goa partir todo_test.go, sua importação na todo_test.goserá

import "../models"

Felix Zilla
fonte
Este método de importação do código funciona apenas para funções expostas. Não parece se comportar como se eles estivessem no mesmo pacote, mesmo que você os tenha colocado explicitamente no mesmo pacote. Portanto, essa solução não resolve realmente o problema do teste de unidade.
The Graceful Penguin,