Uma Introdução ao teste em Go

teste é extremamente importante em todos os softwares. Ser capaz de garantir a correção do seu código e garantir que quaisquer mudanças que você faça não acabem quebrando qualquer outra coisa em diferentes partes da sua base de código é extremamente importante.Ao tomar o tempo necessário para testar adequadamente os seus programas go, permite-se desenvolver mais rapidamente com um maior sentimento de confiança de que o que está a desenvolver continuará a funcionar quando o lançar à produção.

Goals

By the end of this tutorial, you will have a good grap of testing basic functions and methods in Go using the standard "testing" package.

terá tido experiência na redacção de testes de condução de tabelas e também poderá gerar resultados mais descritivos dos seus testes utilizando as várias bandeiras disponíveis.

Tutorial em vídeo

este tutorial pode ser encontrado no formato de vídeo, se preferir:

introdução

neste tutorial vamos ver como você pode desenvolver e executar testes para o seu código go usando o comando go test.

Go Test Files

If you have seen any go projects before, you may have noticed that most, if not all files within the project, feature a FILE_test.go counterpart within theame directory.Isto não é um acidente. Estes são os arquivos que contêm todos os testes de unidade para o projeto e eles testam todo o código dentro de seus homólogos.Exemplo da estrutura do projecto

myproject/- calc.go- calc_test.go- main.go- main_test.go

um arquivo de teste simples

Imagine que tínhamos um programa go muito simples que era composto de um arquivo efeaturado uma função calculate(). Esta função calculate() simplesmente toma em um número e adiciona 2 a ela. Nice and simple to get us up and running:

main.go

If we wished to test this we could create a main_test.go file within the samedirectory and write the following test:

main_test.vai.
package mainimport ( "testing")func TestCalculate(t *testing.T) { if Calculate(2) != 4 { t.Error("Expected 2 + 2 to equal 4") }}

executando nossos testes

agora que criamos nosso primeiro teste go, é hora de executar isso e ver se o nosso código se comporta da maneira que esperamos. Podemos executar nossos testes, executando:

$ go test

Este deve, então, algo de saída semelhante ao seguinte:

$ ir testar
PASSok _/Users/elliot/Documents/Projects/tutorials/golang/go-testing-tutorial 0.007s

Tabela Driven Testing

Agora que estamos felizes que um cálculo funciona, devemos olhar para improveconfidence adicionando um pouco mais de casos de teste em nosso código. Se quisermos construir togradualmente uma série de casos de teste que são sempre testados, podemos ver um array de testes como assim:

aqui declaramos uma estrutura que contém tanto uma entrada quanto o valor esperado. Wethen iterate através da lista de testes com a nossa chamada for _, test := range testse verificar para ver se a nossa função irá sempre devolver os resultados esperados,independentemente da entrada.

quando executamos o nosso conjunto de testes agora, devemos ver a mesma saída que antes:

$ go test
PASSok _/Users/elliot/Documents/Projects/tutorials/golang/go-testing-tutorial 0.007s

resultado do teste descritivo

às vezes você pode desejar ver exatamente quais testes estão rodando e quanto tempo o teste. Felizmente, isso está disponível se você usar o -v bandeira quando em execução yourtests assim:

$ go test -v

Você pode ver que tanto o nosso teste normal e a nossa tabela de teste correu e passou e tookless de 0.00s executar.

Checking Test Coverage

Test coverage is a metric that I have seen abused at times by companies. Estas empresas fixam objectivos em todos os seus sistemas, tais como “a base de dados do código deve ser coberta por, pelo menos, 75% dos testes”.

mas este tipo de alvos pode levar a maus comportamentos e equipes de desenvolvimento “gaming”do sistema, a fim de tentar atingir esses alvos. Eu vi pessoas em alguns dias do teamsspend escrevendo testes de unidade que testam getters e setters básicos em languagess, como Java.

Teste é muito importante, mas você tem que ser pragmático sobre como você teste yoursystems para que os testes de escrita, são proporcionando-lhe maior valor.

os dias passados a escrever testes para cobrir partes não importantes da sua base de código poderiam ter sido mais bem gastos a escrever casos de teste em torno da logiccaptured do negócio crítico dentro de seus sistemas e garantir que mais casos de borda são cobertos.

Usando a capa bandeira

Com a parte importante do caminho, vamos ver como você pode verificar o comando teste de cobertura do seu sistema usando o go test comando:

Dentro do mesmo diretório como o main.go e o main_test.go arquivos, runthe seguinte:

$ go test-cover
PASScoverage: 66.7% of statementsok github.com/TutorialEdge/an-intro-to-testing-in-go 0.006s

verá que tem 66.7% do seu código Go total coberto por testcases.

Visualização de Cobertura

Enquanto isso 66.7% valor pode dizer-nos o quanto o nosso código, nós testamos,não nos mostram exatamente o código que caminhos temos ou não testei.

é aqui que os go test e os go tool cover entram para nos ajudar a resolver este problema específico.

podemos usar a ferramenta go test para gerar um coverprofile que pode então ser convertido para uma visualização HTML usando o comando go tool cover:

$ go test-coverprofile=coverage.fora
PASScoverage: 66.7% of statementsok github.com/TutorialEdge/an-intro-to-testing-in-go 0.008s

Você pode, em seguida, tomar este gerado coverage.out arquivo e usá-lo para generatea página HTML que mostra exatamente quais linhas foram abordados, como por:

$ go tool cover -html=coverage.out

Isto irá abrir uma página no seu navegador de escolha que irá procurar um littlesomething como este:

Como você pode ver, a maior parte do código dentro do nosso Calculate função é testar andfeatures Green cobertura. Enquanto a declaração de impressão na sua função main é Red como esta não foi coberta por testes.

conclusão

Esperemos que tenha achado este tutorial útil! Se você precisar de mais assistência, então sinta-se à vontade para me informar na seção de comentários abaixo.