Giter Site home page Giter Site logo

larien / aprenda-go-com-testes Goto Github PK

View Code? Open in Web Editor NEW
481.0 29.0 67.0 6.73 MB

Aprenda Go com desenvolvimento orientado a testes

Home Page: https://go.larien.dev

License: MIT License

Go 98.65% Shell 0.68% HTML 0.67%
tdd go golang testing test-driven-development learn-go aprenda-go go-br

aprenda-go-com-testes's Introduction

Introdução

Arte por Denise

Build Status Go Report Card

Motivação

Índice

Primeiros Passos com Go

  1. Instalação do Go - Prepare o ambiente para produtividade.
  2. Olá, mundo - Declarando variáveis, constantes, declarações if/else, switch, escreva seu primeiro programa em Go e seu primeiro teste. Sintaxe de subteste e closures.
  3. Inteiros - Mais conteúdo sobre sintaxe de declaração de função e aprenda novas formas de melhorar a documentação do seu código.
  4. Iteração - Aprenda sobre for e benchmarking.
  5. Arrays e slices - Aprenda sobre arrays, slices, len, variáveis recebidas como argumentos, range e cobertura de testes.
  6. Estruturas, métodos e interfaces - Aprenda sobre structs, métodos, interface e testes orientados a tabela (table driven tests).
  7. Ponteiros e erros - Aprenda sobre ponteiros e erros.
  8. Maps - Aprenda sobre armazenamento de valores na estrutura de dados map.
  9. Injeção de dependência - Aprenda sobre injeção de dependência, qual sua relação com interfaces e uma introdução a I/O.
  10. Mocks - Use injeção de dependência com mocks para testar um código não testado.
  11. Concorrência - Aprenda como escrever código concorrente para tornar seu software mais rápido.
  12. Select - Aprenda a sincronizar processos assíncronos de forma elegante.
  13. Reflexão - Aprenda sobre reflexão.
  14. Sync - Conheça algumas funcionalidades do pacote sync, como WaitGroup e Mutex.
  15. Contexto - Use o pacote context para gerenciar e cancelar processos de longa duração.

Criando uma aplicação

Agora que você já deu seus Primeiros Passos com Go, esperamos que você tenha uma base sólida das principais funcionalidades da linguagem e como TDD funciona.

Essa seção envolve a criação de uma aplicação.

Cada capítulo é uma continuação do anterior, expandindo as funcionalidades da aplicação conforme nosso "Product Owner" dita.

Novos conceitos serão apresentados para ajudar a escrever código de qualidade, mas a maior parte do material novo terá relação com o que pode ser feito com a biblioteca padrão do Go.

No final desse capítulo, você deverá ter uma boa ideia de como escrever uma aplicação em Go testada.

  • Servidor HTTP - Vamos criar uma aplicação que espera por requisições HTTP e as responde.
  • JSON, routing e aninhamento - Vamos fazer nossos endpoints retornarem JSON e explorar como trabalhar com rotas.
  • IO e classificação - Vamos persistir e ler nossos dados do disco e falar sobre classificação de dados.
  • Linha de comando e estrutura do projeto - Suportar diversas aplicações em uma base de código e ler entradas da linha de comando.
  • Tempo - Usar o pacote time para programar atividades.
  • Websockets - Aprender a escrever e testar um servidor que usa websockets.

Dúvidas e respostas

Costumo ver perguntas nas Interwebs como:

Como testo minha função incrível que faz x, y e z?

Se tiver esse tipo de dúvida, crie uma Issue no GitHub e vou tentar achar tempo para escrever um pequeno capítulo para resolver o problema. Acho que conteúdo como esse é valioso, já que está resolvendo problemas reais envolvendo testes que as pessoas têm.

  • OS exec - Um exemplo de como podemos usar o sistema operacional para executar comandos para buscar dados e manter nossa lógica de negócio testável.
  • Tipos de erro - Exemplo de como criar seus próprios tipos de erro para melhorar seus testes e tornar seu código mais fácil de se trabalhar.

Contribuição

  • Esse projeto está em desenvolvimento, tanto seu conteúdo original quanto sua tradução. Se tiver interesse em contribuir, por favor entre em contato.
  • Leia contribuindo.md para algumas diretrizes.
  • Quer ajudar com a tradução para o português? Leia traduzindo.md e entenda como o processo de tradução está organizado.
  • Tem ideias? Crie uma issue!

Explicação

Tenho experiência em apresentar Go a equipes de desenvolvimento e tenho testado abordagens diferentes sobre como evoluir um grupo de pessoas que têm curiosidade sobre Go para criadores extremamente eficazes de sistemas em Go.

O que não funcionou

Ler o livro

Uma abordagem que tentamos foi pegar o livro azul e toda semana discutir um capítulo junto de exercícios.

Amo esse livro, mas ele exige muito comprometimento. O livro é bem detalhado na explicação de conceitos, o que obviamente é ótimo, mas significa que o progresso é lento e uniforme - não é para todo mundo.

Descobri que apenas um pequeno número de pessoas pegaria o capítulo X para ler e faria os exercícios, enquanto que a maioria não.

Resolver alguns problemas

Katas são divertidos, mas geralmente se limitam ao escopo de aprender uma linguagem; é improvável que você use goroutines para resolver um kata.

Outro problema é quando você tem níveis diferentes de entusiasmo. Algumas pessoas aprendem mais da linguagem que outras e, quando demonstram o que já fizeram, confundem essas pessoas apresentando funcionalidades que as outras ainda não conhecem.

Isso acaba tornando o aprendizado bem desestruturado e específico.

O que funcionou

De longe, a forma mais eficaz foi apresentar os conceitos da linguagem aos poucos lendo o go by example, explorando-o com exemplos e discutindo-o como um grupo. Essa abordagem foi bem mais interativa do que "leia o capítulo X como lição de casa".

Com o tempo, a equipe ganhou uma base sólida da gramática da linguagem para que conseguíssemos começar a desenvolver sistemas.

Para mim, é semelhante à ideia de praticar escalas quando se tenta aprender a tocar violão.

Não importa quão artístico você seja; é improvável que você crie músicas boas sem entender os fundamentos e praticando os mecanismos.

O que funcionou para mim

Quando eu aprendo uma nova linguagem de programação, costumo começar brincando em um REPL, mas hora ou outra preciso de mais estrutura.

O que eu gosto de fazer é explorar conceitos e então solidificar as ideias com testes. Testes certificam de que o código que escrevi está correto e documentam a funcionalidade que aprendi.

Usando minha experiência de aprendizado em grupo e a minha própria, vou tentar criar algo que seja útil para outras equipes. Aprender os conceitos escrevendo testes pequenos para que você possa usar suas habilidades de desenvolvimento de software e entregar sistemas ótimos.

Para quem isso foi feito

  • Pessoas que se interessam em aprender Go.
  • Pessoas que já sabem Go, mas querem explorar testes com TDD.

O que vamos precisar

  • Um computador!
  • Go instalado
  • Um editor de texto
  • Experiência com programação. Entendimento de conceitos como if, variáveis, funções etc.
  • Se sentir confortável com o terminal

Feedback

  • Para a versão em português, submita um PR aqui ou entre em contato comigo pelo meu site.

MIT license

Logo criado por egonelbre Que estrela!

aprenda-go-com-testes's People

Contributors

ahmgeek avatar alexvpopov avatar alrighttheresham avatar awulkan avatar edmilton avatar giovana-morais avatar github-carlos avatar glauco avatar gypsydave5 avatar hackeryarn avatar jdsutherland avatar jessicapaz avatar jossy avatar kandros avatar larien avatar lnryan avatar mbrosowicz avatar mukulrawat1986 avatar omar-khawaja avatar pdbrito avatar pityonline avatar quii avatar ramonsilvanet avatar sleeping-barber avatar starefossen avatar thiagobeppe avatar tracypholmes avatar vc0sta avatar winiciusdutra avatar wps13 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aprenda-go-com-testes's Issues

Criar glossário com termos comuns da tradução

Ideia incrível da @giovana-morais
Esse capítulo será uma adição ao conteúdo original do livro, em que termos em inglês serão listados, traduzidos e explicados para a pssoa que tá lendo essa belezura consultar caso encontre algum termo que não conheça pelo mundão afora e que também estão nesse livro, mas estão traduzidos.
Alguns exemplos:

storage
store
benchmark
stub
router

Tradução de capítulo de "Maths"

Esse capítulo foi incluído após a criação desse repositório e seu conteúdo precisa ser traduzido de acordo com a página original.
A página deve ser colocada dentro de primeiros-passos-com-go no mesmo modelo dos outros capítulos.

[DISCUSSÃO] Tradução dos nomes dos métodos, funções e buzzwords

E aí, galera, beleza?

Boa parte de vocês veio me perguntar sobre traduzir ou não os nomes dos métodos dentro do código. Exemplo:

// Save saves an report to database.
func (r *Report) Save() error {
    // smt
    return nil
}

Eu respondi a alguns de vocês levantando os seguintes pontos:

  • A ideia é diminuir a barreira de linguagem e na minha opinião, mesmo com as palavras reservadas estando em inglês, manter os nomes dos métodos em inglês iria dificultar o aprendizado
  • Não é necessário traduzir as coisas de forma literal e podemos adaptar para o contexto utilizado (ex.: traduzir router para roteador, data para dados, utilizar termos comuns para a gente no geral)

Dessa forma, a tradução do exemplo acima ficaria:

// Salva armazena um relatório na base de dados.
func (r *Relatorio) Salva() error {
    // smt
    return nil
}

Ao invés de manter:

// Save armazena uma informação na base de dados.
func (r *Report) Save() error {
    // smt
    return nil
}

No entanto, gostaria de abrir essa discussão com vocês para a gente chegar em um consenso e aplicar esse estilo no decorrer do código. Quais são seus pontos em relação a não traduzir os métodos/funções/buzzwords nesse livro? Bora bater um papo? :)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.