Go With Go (Lang): Recursos e estruturas de teste

Iryna Suprun Blocked Unblock Seguir Seguindo 20 de dezembro de 2018

Automação de teste usando o GoLang

Na parte 1 deste artigo Go With Go (Lang): Por que ir? discutimos como selecionar linguagem de programação para automação de testes e por que o Go é um concorrente forte. Nesta parte, veremos alguns recursos mais interessantes que facilitam ainda mais a automação e dão uma breve visão geral das estruturas de testes Go mais populares.

Meu recurso favorito do GoLang é goroutines. Muitas vezes, os testes automatizados precisam esperar que algo aconteça. O tempo de espera pode ser diferente, pode ser milissegundos ou segundos, até mesmo minutos. Tais situações são comuns quando o produto em teste posta algo nos serviços de mensagens, seja interno ou externo (Kafka, PubSub). Ocorre quando o software do sistema sob teste é construído usando a arquitetura de microsserviços. Isso também acontece quando o teste consulta grandes conjuntos de dados (e o big data está em toda parte agora) ou faz o download de um arquivo grande. Isso acontece em todos os lugares em que vemos um comportamento assíncrono ou orientado a eventos.

O erro mais comum para lidar com esses cenários é usar sleeps. Isso é um grande NÃO na automação de testes. É anti-padrão. Dorme faz testes automatizados ou lento ou escamoso, ou ambos. Se você os tiver em seu teste, apenas se livre deles o mais rápido possível.

Em vez de dormir, testes automatizados devem esperar que o evento aconteça ou por tempo limite, em outros mundos eles devem ser capazes de lidar com assincronia. Goroutines facilitam a implementação de lógica assíncrona. Então o que é – goroutine? Uma definição oficial diz que a goroutine é um segmento leve de execução. Isso é tudo que precisamos saber para o escopo deste artigo.

Existem alguns recursos que tornam a goroutine ótima para automação:

  • Você pode girar muitas goroutines mesmo em um laptop normal e nem percebe (cada goroutine usa apenas 2KB de memória). Além disso, eles usam apenas a memória de que precisam.
  • É fácil implementar e comunicar entre goroutines usando canais.
  • Os goroutines são fáceis de usar, não são necessárias habilidades avançadas de codificação

O último é muito importante, você não precisa ser um guru do Go para usar goroutines e implementar multithreading em seus testes. Tudo o que você precisa saber é abordado no tutorial básico go (não me leve a mal se você escrever um código de produção que você precisa ler e aprender mais sobre a simultaneidade antes mesmo de começar).

Eu usei Java e Python antes para automatizar casos de teste complexos e implementar lógica assíncrona e orientada a eventos (leitura multithreading) nessas linguagens requer habilidades avançadas de codificação. É muito mais fácil usar o Go.

No exemplo abaixo, o teste verifica se uma mensagem criada ao atingir um terminal da API é postada na fila do Kafka. O teste deve passar se a mensagem que enviamos for encontrada na fila e falhar se não for ou o tempo limite tiver sido atingido.

 func TestPostToKafkaQueue (t * testing.T) { 
 var waitGroup sync.WaitGroup 
// criar e postar mensagem na fila do Kafka
resp, _: = buildAndSendMessage (url, id, true )
// falha no teste se a criação da mensagem resultar em erro
assert.Equal (t, resp.Status, “200 OK” )
// configurando um tempo limite. O teste será interrompido quando o tempo limite for atingido
ctx, cancel: = context.WithTimeout (context.Background (), tempo limite)
adiar cancelar ()
waitGroup.Add (1)
 // esta é a nossa goroutine. No código abaixo, iniciamos um thread separado que consumirá constantemente mensagens da fila e verificará que é uma mensagem que esperávamos ver 
vai func
() {
resultado, err: = consume (ctx, tópico, verdadeiro, tópico, id)
if err! = nil {
fmt.Println ( “ERRO: erro de consumo” , err)
assert.FailNow (t, "Falha ao consumir mensagem da fila " )
}
fmt.Println ( “Evento encontrado no tópico kafka:” , resultado)
waitGroup.Done ()
ctx.Done ()
assert.Equal (t, result, expected_result )
} ()
waitGroup.Wait ()
}

Texto original em inglês.