Go Básico: Testando Saída do Console (stdout) com os.Pipe


Testar a saída do console em programas Go pode ser um desafio, especialmente quando queremos garantir que nossas funções estão imprimindo o resultado correto em nossas aplicações de CLI. Neste artigo, vamos explorar como usar os.Pipe para capturar e verificar a saída do console de maneira eficaz, permitindo a criação de testes unitários robustos para suas funções que escrevem na saída padrão (os.Stdout).

Para exemplificar, vamos utilizar o seguinte exemplo como demonstração, simulando uma possível aplicação.


package main

import (
	"fmt"
)

func printSomething(s string) {
	fmt.Println(s)
}

func main() {
	printSomething("Hello, World!")
}

Agora vamos supor que queremos testar esta função printSomething e validar se ela realmente está imprimindo o que desejamos de maneira correta.


package main

import (
	"io"
	"os"
	"testing"
)

func Test_printSomething(t *testing.T) {
	// Save the original standard output
	stdOut := os.Stdout

	// Create a pipe to capture the standard output
	r, w, _ := os.Pipe()

	// Redirect the standard output to the pipe writer
	os.Stdout = w

	// Call the printSomething function with the message and the WaitGroup
	printSomething("This is a test")

	// Close the pipe writer
	w.Close()

	// Read the content from the pipe reader
	result, _ := io.ReadAll(r)

	// Restore the original standard output
	//
	//At the end of the test, we restore os.Stdout to ensure that the program's
	//environment returns to its normal state, allowing the rest of the program
	//and other tests to function correctly.
	os.Stdout = stdOut

	// Check if the captured output is equal to the expected string
	if string(result) != "This is a test\n" {
		// If not, the test fails and displays an error message
		t.Errorf("Expected 'This is a test', got %s", result)
	}
}

A função os.Pipe no pacote os da linguagem Go é usada para criar um canal de comunicação unidirecional entre dois pontos, chamado de pipe. Ela é útil para redirecionar a saída de uma função ou processo para outro, permitindo a comunicação entre diferentes partes de um programa.

Comentários

Postagens mais visitadas deste blog

Go Básico: Manipulação de Arquivos

Go Básico: Generics

Kotlin Básico: Tipos Básicos