Existe uma prática recomendada estabelecida para separar testes de unidade e testes de integração em GoLang (testemunhar)? Eu tenho uma mistura de testes de unidade (que não dependem de nenhum recurso externo e, portanto, são executados muito rápido) e testes de integração (que dependem de quaisquer recursos externos e, portanto, são executados mais lentamente). Então, eu quero ser capaz de controlar se devo ou não incluir os testes de integração quando eu disser go test
.
A técnica mais direta parece ser definir um sinalizador -integrate em principal:
var runIntegrationTests = flag.Bool("integration", false
, "Run the integration tests (in addition to the unit tests)")
E, em seguida, adicionar uma instrução if no início de cada teste de integração:
if !*runIntegrationTests {
this.T().Skip("To run this test, use: go test -integration")
}
É o melhor que posso fazer? Pesquisei a documentação do testify para ver se há talvez uma convenção de nomenclatura ou algo que faça isso para mim, mas não encontrei nada. Estou esquecendo de algo?
fonte
var integration = flag.Bool("integration", true, "Enable integration testing.")
fora de uma função, a variável aparecerá no escopo do pacote e o sinalizador funcionará corretamenteRespostas:
@ Ainar-G sugere vários ótimos padrões para separar testes.
Este conjunto de práticas Go do SoundCloud recomenda o uso de tags de compilação ( descritas na seção "Restrições de compilação" do pacote de compilação ) para selecionar quais testes executar:
Como uma opção semelhante, você também pode ter testes de integração executados por padrão usando uma condição de construção
// +build !unit
e, em seguida, desabilitá-los sob demanda executandogo test -tags=unit
.comentários @adamc:
Para qualquer outra pessoa que tente usar tags de construção, é importante que o
// +build test
comentário seja a primeira linha em seu arquivo e que você inclua uma linha em branco após o comentário, caso contrário, o-tags
comando irá ignorar a diretiva.Além disso, a tag usada no comentário de construção não pode ter um traço, embora sublinhados sejam permitidos. Por exemplo,
// +build unit-tests
não funcionará, mas// +build unit_tests
sim.fonte
// + build unit
em testes de unidades e usar -tag unit para executar os testes// +build
comentário de teste seja a primeira linha em seu arquivo e que você inclua uma linha em branco após o comentário, caso contrário, o-tags
comando irá ignorar a diretiva. Além disso, a tag usada no comentário de construção não pode ter um traço, embora sublinhados sejam permitidos. Por exemplo,// +build unit-tests
não funcionará, enquanto que// +build unit_tests
willgo test -tags=integration ./...
não funciona, ele ignora a tagPara elaborar o meu comentário para @ excelente resposta de Ainar-G, durante o ano passado eu tenho usado a combinação de
-short
comIntegration
convenção de nomenclatura para alcançar o melhor dos dois mundos.Unidade e integração testa harmonia, no mesmo arquivo
Bandeiras de construção anteriormente me obrigou a ter vários arquivos (
services_test.go
,services_integration_test.go
, etc).Em vez disso, pegue este exemplo abaixo, em que os dois primeiros são testes de unidade e eu tenho um teste de integração no final:
Observe que o último teste tem a convenção de:
Integration
no nome do teste.-short
diretiva de flag.Basicamente, a especificação é: "escreva todos os testes normalmente. Se for um teste de longa execução ou um teste de integração, siga esta convenção de nomenclatura e verifique
-short
se é bom com seus colegas."Execute apenas testes de unidade:
isso fornece um bom conjunto de mensagens como:
Execute testes de integração apenas:
Isso executa apenas os testes de integração. Útil para canários de teste de fumaça em produção.
Obviamente, a desvantagem dessa abordagem é que, se alguém executar
go test
, sem o-short
sinalizador, o padrão será executar todos os testes - testes de unidade e integração.Na realidade, se seu projeto é grande o suficiente para ter testes de unidade e integração, então provavelmente você está usando um
Makefile
onde pode ter diretivas simples para usargo test -short
nele. Ou simplesmente coloque-o em seuREADME.md
arquivo e encerrar o dia.fonte
import
meu pacote e testá-lo, o que acaba me mostrando como minha API se parece para os outros. Em seguida, sigo com qualquer lógica restante que precise ser coberta como nomes de pacotes de teste internos.package services
contém um software de teste de integração, então para testar a API do pacote como uma caixa preta, devemos nomeá-lo de outra formapackage services_integration_test
, não nos dará a chance de trabalhar com estruturas internas. Portanto, o pacote para testes de unidade (acesso interno) deve ser nomeadopackage services
. É assim?Eu vejo três soluções possíveis. O primeiro é usar o modo curto para testes de unidade. Portanto, você usaria
go test -short
com testes de unidade e o mesmo, mas sem o-short
sinalizador para executar seus testes de integração também. A biblioteca padrão usa o modo curto para pular testes de longa execução ou torná-los mais rápidos fornecendo dados mais simples.A segunda é usar uma convenção e chamar seus testes
TestUnitFoo
ouTestIntegrationFoo
e, em seguida, usar o-run
sinalizador de teste para indicar quais testes executar. Portanto, você usariago test -run 'Unit'
para testes de unidade ego test -run 'Integration'
para testes de integração.A terceira opção é usar uma variável de ambiente e obtê-la em sua configuração de testes com
os.Getenv
. Então você usaria simplesgo test
para testes de unidade eFOO_TEST_INTEGRATION=true go test
para testes de integração.Eu pessoalmente prefiro a
-short
solução, pois é mais simples e é usada na biblioteca padrão, então parece que é uma maneira de separar / simplificar testes de longa duração. Mas as soluções-run
eos.Getenv
oferecem mais flexibilidade (também é necessário mais cuidado, pois regexps estão envolvidos-run
).fonte
Tester-Go
) comuns a IDEs (Atom, Sublime, etc) têm a opção embutida de rodar com-short
flag, junto com-coverage
e outros. portanto, uso uma combinação de Integração no nome do teste, juntamente com asif testing.Short()
verificações desses testes. permite-me ter o melhor dos dois mundos: executar com-short
IDEs e executar explicitamente apenas testes de integração comgo test -run "Integration"
Eu estava tentando encontrar uma solução para o mesmo recentemente. Estes foram meus critérios:
As soluções mencionadas acima (sinalizador personalizado, tag de construção personalizada, variáveis de ambiente) realmente não satisfaziam todos os critérios acima, então, depois de pesquisar um pouco e brincar, descobri esta solução:
A implementação é direta e mínima. Embora exija uma convenção simples para testes, é menos sujeito a erros. Melhorias adicionais poderiam ser exportar o código para uma função auxiliar.
Uso
Execute testes de integração apenas em todos os pacotes em um projeto:
Execute todos os testes ( regulares e integração):
Execute apenas testes regulares :
Esta solução funciona bem sem ferramentas, mas um Makefile ou alguns aliases podem torná-la mais fácil de usar. Ele também pode ser facilmente integrado a qualquer IDE que suporte a execução de testes go.
O exemplo completo pode ser encontrado aqui: https://github.com/sagikazarmark/modern-go-application
fonte