Перевод книги «Learn Go with Tests» на русский язык.

Overview

Изучите Go через тестирование

Три гофера разных цветов: один думает о еде, другой готовит, третий убирает. Надпись: Red, Green, Refactor.

Обложка нарисована Denise

Go Report Card

Форматы для чтения

Доступные переводы

Поддержите меня

Я горжусь тем, что предлагаю эту книгу для свободного использования, бесплатно. Однако, если вы хотите поддержать меня или выразить благодарность, то можете воспользоваться следующими пунктами:

Почему мне стоит это читать?

  • Узнайте о языке Go с помощью написания тестов.
  • Погрузитесь в TDD с головой. Go хороший язык для этого, потому-что он прост для изучения и в нём отлично реализованы тесты из коробки.
  • Получите уверенность, что вы можете писать надежные и хорошо протестированные системы на Go.
  • Посмотрите видео или почитайте, почему юнит-тестирование и TDD важны.

Оглавление

Основы Go

  1. Установка Go - Настройте рабочее окружение для комфортной работы.
  2. Привет, мир! - Объявляйте переменные, константы, используйте ветвления, напишите вашу первую программу на Go и тест для неё. Синтаксис подтестов и замыканий.
  3. Числа - Укрепите знания синтаксиса для функций и изучите новые пути улучшения документации вашего кода.
  4. Циклы - Узнайте о цикле for и для чего нужны бенчмарки.
  5. Массивы и Слайсы - Научитесь работать с массивами, слайсами, len, range, изучите вариативные функции и покройте тестами программу.
  6. Структуры, методы и интерфейсы - Погрузитесь в методы, узнайте об интерфейсах, структурах и табличных тестах.
  7. Указатели и ошибки - Узнайте об указателях и обработке ошибок в Go.
  8. Карты - Научитесь пользоваться картами для хранения данных.
  9. Управление зависимостями - Получите представления об управлении зависимости и как это связано с использованием интерфейсов и пакета io.
  10. Мокинг (имитация) - Возьмите существующий не протестированный код и используйте DI с мокингом для написания тестов.
  11. Многопоточность - Узнайте как писать многопоточный код и как сделать вашу программу быстрее.
  12. Оператор Select - Научитесь красиво и элегантно синхронизировать асинхронные процессы.
  13. Рефлексия - Получите основы о рефлексии в Go.
  14. Синхронизация - Узнайте о пакете sync, который включает в себя WaitGroup и Mutex.
  15. Использование context - Используйте пакет context для управления и закрытия долгих процессов.
  16. Property-based testing (использование предикатов) - Попрактикуйтесь в TDD с помощью Roman Numerals заданий и получите основы PBT.
  17. Использование math - Научитесь использовать пакет math и нарисуйте часы с использованием SVG.
  18. Чтение файлов - Читайте файлы и обрабатывайте их.

Создание приложения

После погружения в Go пришло время написать свое собственное приложения, используя полученные знания о большинстве важных аспектов языка и как применять TDD.

Каждая глава построена по принципу итеративности и зависит от предыдущей. Приложение обрастает новыми функции шаг за шагом.

Новые понятия будут представлены, чтобы научиться писать качественный код, но большинство материала будет зависеть от стандартных библиотек языка, которые были в предыдущей главе.

В конце главы вы получите полное представление о том, как писать программы на языке Go, покрытые при этом тестами, что особенно требуется для любого серьезного приложения.

  • HTTP-сервер - Мы создадим приложение, которое получает HTTP-запросы и отвечает на них.
  • JSON, маршрутизация и вложения - Мы создадим наши собственные запросы, которые возвращают JSON и разберемся как устроена маршрутизация HTTP-запросов.
  • IO и сортировка - Мы сохраним и прочитаем наши данные с диска и научимся эти данные сортировать.
  • Командная строка и структура проекта - Используем нашу кодовую базу для нескольких приложений и прочитаем ввод из командной строки.
  • Пакет time - Установим активности на определенный период времени с помощью пакета time.
  • Веб-сокеты - Узнаем как написать и протестировать сервер, который использует веб-сокеты.

Частые вопросы и ответы

Я часто сталкиваюсь с популярным вопросом от моих студентов:

Как я могу протестировать функцию, которая сначала делает x, затем y, а в конце z?

Если у вас есть подобные вопросы – заведите новый тикет на GitHub и я постараюсь найти время и написать маленькую главу о том, как решить эту проблему. Я чувствую, что такой контент ценнее, поскольку это настоящие проблемы вокруг тестирования.

  • Вызовы OS-команд - Пример как мы можем вызывать OS-команды для того, чтобы получить данные и сохранить нашу бизнес-логику способной для тестирования.
  • Создание собственных ошибок - Пример как мы можем создавать собственные ошибки, чтобы улучшить тесты и сделать код удобным для дальнейшей работы.
  • Context-независимый Reader - Узнаем как TDD дополняет io.Reader с отменой. Основываясь на статье "Context-aware io.Reader for Go".
  • Проектирование HTTP-хандлеров - Тестирование HTTP-хандлеров кажется болью для большинства разработчиков. Мы найдем основные проблемы и научимся проектировать HTTP-хандлеров правильно.

Дополнения / Обсуждения

  • Почему? - Посмотрите видео или почитайте о том, почему юнит-тестирование и TDD важны.
  • Введение в дженерики - Научитесь как писать функции которые принимают аргументы с дженериками и напишите свою собственную структуру данных.
  • Анти-паттерны - Маленькая глава об анти-паттернах в TDD и юнит-тестировании.

Внести свой вклад в развитие проекта

  • Данный проект находится в стадии разработки, поэтому не стесняйтесь связаться и предложить свои идеи.
  • Прочитайте как правильно контрибьютить в проект.
  • Есть идеи? Создайте новый запрос!

Обо мне

У меня есть опыт обучения Go для разработчиков и я попробовал разные пути: от команды, которая просто интересуется Go, до написания высокоэффективных систем на языке.

Не работающие подходы

Прочитать книгу

Мы пробовали применить подход, который обсуждался в синей книге и каждую неделю обсуждать следующую главу вместе с решением задач.

Мне нравится эта книга, но она требует высокий уровень вовлеченности. Эта книга детально описывает концепты, которые в целом полезны, но это значит что прогресс будет медленным и незаметным – это не для всех.

Небольшое количество людей хотело бы прочитать главу X и решать задачу, при этом большинство людей этого не делали.

Решать часть задач

Решение задач интересное занятие, но обычно их полезность довольна мала при изучении языка. Мы вряд ли будем использовать горутины для решения каких-то задач.

Другая проблема, когда у вас есть несколько уровней энтузиазма. Некоторые люди просто хотят изучить больше концепций языка чем другие и, когда они показывают что они уже сделали, то заканчивают особенностями языка, о котором другие не знают.

Это создает в обучении проблемы, вызывает не структурированность и отсутствие документации, тестов.

Работающие подходы

До этого момента самый эффективный путь был медленно изучать основы языка с помощью go by example, пробовать их запустить локально и смотреть на общую картину. Это немного более интерактивный подход, чем "прочитай главу X и выполни домашнее задание".

После этого вы получаете прочную базу по грамматике языка и поэтому можете начать проектировать какие-либо системы.

Это можно сравнить с практикой игры на гитаре, когда вы начинаете изучать гаммы и как их играть.

При этом не важно насколько вы артистичны, так как вряд ли вы напишите хорошую музыку без понимания основ и практики игры.

Работающие подходы для меня

Когда я изучаю новый язык программирования, я обычно начинаю с каких-то примеров кода и запускаю их в песочнице, но в основном я приверженец определенной структурированности.

Я бы хотел изучить основные концепты и затем укрепить их с помощью идей с тестами. Тесты подтверждают, что мой код корректен и документируют особенности, которые я изучил.

Из моего опыта обучения с группой или самостоятельно, я пытаюсь попробовать создать что-то, что может быть полезно другим разработчикам и командам. Написание маленьких тестов поможет улучшить ваши навыки в проектировании программного обеспечения и даст основы для новых высокоэффективных систем.

Для кого эта книга

  • Любому, кто заинтересовался в изучении Go.
  • Любому, кто уже немного знаком с Go, но хочет изучить TDD подход.

Что мне потребуется для прохождения?

  • Компьютер и установленный терминал, которым вы хорошо пользуетесь.
  • Установленный Go.
  • Текстовый редактор кода.
  • Небольшие познания в программировании. Понимание концепции ветвлений, что такое переменная, функция и т.д

Обратная связь

  • Создавайте новые тикеты/предлагайте изменения здесь или отметьте меня в Twitter.

Лицензия MIT

Логотип нарисовал egonelbre, спасибо!

You might also like...
Learn-Nakama - An example project template on how to set up and write custom logic in Nakama server

Nakama Project Template An example project template on how to set up and write c

Golang tutorials - a self-project to learn Go.
Golang tutorials - a self-project to learn Go.

Golang Tutorials a self-project to learn Go. prod by blvnk. Tech With Tim Tutorials Intro to Go created a Hello World program. compiled a Hello World

Rps-game-in-go - Learn Go for Beginners Crash Course (Golang)

rps-game-in-go This rock-paper-scissors game was based on the Udemy course "Lear

Extremely flexible golang deep comparison, extends the go testing package, tests HTTP APIs and provides tests suite
Extremely flexible golang deep comparison, extends the go testing package, tests HTTP APIs and provides tests suite

go-testdeep Extremely flexible golang deep comparison, extends the go testing package. Latest news Synopsis Description Installation Functions Availab

Rr-e2e-tests - Roadrunner end-to-end tests repository
Rr-e2e-tests - Roadrunner end-to-end tests repository

RoadRunner end-to-end plugins tests License: The MIT License (MIT). Please see L

Package for comparing Go values in tests

Package for equality of Go values This package is intended to be a more powerful and safer alternative to reflect.DeepEqual for comparing whether two

Extremely flexible golang deep comparison, extends the go testing package and tests HTTP APIs
Extremely flexible golang deep comparison, extends the go testing package and tests HTTP APIs

go-testdeep Extremely flexible golang deep comparison, extends the go testing package. Latest news Synopsis Description Installation Functions Availab

Record and replay your HTTP interactions for fast, deterministic and accurate tests

go-vcr go-vcr simplifies testing by recording your HTTP interactions and replaying them in future runs in order to provide fast, deterministic and acc

Go testing in the browser. Integrates with `go test`. Write behavioral tests in Go.
Go testing in the browser. Integrates with `go test`. Write behavioral tests in Go.

GoConvey is awesome Go testing Welcome to GoConvey, a yummy Go testing tool for gophers. Works with go test. Use it in the terminal or browser accordi

Testing framework for Go. Allows writing self-documenting tests/specifications, and executes them concurrently and safely isolated. [UNMAINTAINED]

GoSpec GoSpec is a BDD-style testing framework for the Go programming language. It allows writing self-documenting tests/specs, and executes them in p

Ruby on Rails like test fixtures for Go. Write tests against a real database

testfixtures Warning: this package will wipe the database data before loading the fixtures! It is supposed to be used on a test database. Please, doub

Run WASM tests inside your browser

wasmbrowsertest Run Go wasm tests easily in your browser. If you have a codebase targeting the wasm platform, chances are you would want to test your

Unit tests generator for Go programming language
Unit tests generator for Go programming language

GoUnit GoUnit is a commandline tool that generates tests stubs based on source function or method signature. There are plugins for Vim Emacs Atom Subl

Automatically update your Go tests

autogold - automatically update your Go tests autogold makes go test -update automatically update your Go tests (golden files and Go values in e.g. fo

A simple `fs.FS` implementation to be used inside tests.

testfs A simple fs.FS which is contained in a test (using testing.TB's TempDir()) and with a few helper methods. PS: This lib only works on Go 1.16+.

A next-generation testing tool. Orion provides a powerful DSL to write and automate your acceptance tests

Orion is born to change the way we implement our acceptance tests. It takes advantage of HCL from Hashicorp t o provide a simple DSL to write the acceptance tests.

Terratest is a Go library that makes it easier to write automated tests for your infrastructure code.

Terratest is a Go library that makes it easier to write automated tests for your infrastructure code. It provides a variety of helper functions and patterns for common infrastructure testing tasks,

Mocking your SQL database in Go tests has never been easier.

copyist Mocking your SQL database in Go tests has never been easier. The copyist library automatically records low-level SQL calls made during your te

Go testing in the browser. Integrates with `go test`. Write behavioral tests in Go.
Go testing in the browser. Integrates with `go test`. Write behavioral tests in Go.

GoConvey is awesome Go testing Welcome to GoConvey, a yummy Go testing tool for gophers. Works with go test. Use it in the terminal or browser accordi

Owner
Daniil Maslov
Support Engineer at @GoLandIDE. An active member of communities: @gobridge, @thepracticaldev and a bunch of others.
Daniil Maslov
Learn how to write webapps without a framework in Go.

This is an easy to understand example based tutorial aimed at those who know a little of Go and nothing of webdev and want to learn how to write a webserver in Go. You will create a to do list application as you advance the chapters.

Suraj Patil 3.1k Dec 1, 2022
Introduction to beginners learn to go

For-learning-Go-Tutorial 准备写一本Go的书针对初学者快速入门开发和使用go! 学习Go语言需要去了解Go的特性,然后在深入的去实践,如果你想使用Go语言写出Go味道的程序,那么你就需要付出努力去实践了! 先来了解下Go语言为何创造出来的历史吧,Go 语言是由谷歌公司在 20

keke 571 Nov 27, 2022
Building a shoe store with golang to learn more about this language :)

shoestore-go Building a shoe store with golang to learn more about this language :) TODO Create a basic webpage with the pages: home : to show homepag

Bruno B. Melo 4 Jan 24, 2022
The purpose of this project is to learn about go-swagger.

learn-go-swagger The purpose of this project is to learn about go-swagger. Requirements Go go-swagger Setup Run ./scripts/gen-swagger to generate swag

Henrik Christensen 0 Nov 20, 2021
A repository for showcasing my knowledge of the Google Go (2009) programming language, and continuing to learn the language.

Learning Google Golang (programming language) Not to be confused with the Go! programming language by Francis McCabe I don't know very much about the

Sean P. Myrick V19.1.7.2 2 Nov 6, 2022
A repository for showcasing my knowledge of the Go! (2003) programming language, and continuing to learn the language.

Learning Go! (programming language) Not to be confused with Google Golang (2009) I don't know too much about the Go! programming language, but I know

Sean P. Myrick V19.1.7.2 2 Oct 22, 2022
A series of small code snipppets & exercises to learn Go.

Learning-Go A series of small code snipppets & exercises to learn Go. WARNING: During this excercise you will be learning along with me, I am not your

Elemental X 1 Dec 18, 2021
Learn the Go programming language (Golang) in this step-by-step tutorial course for beginners

Learn the Go programming language (Golang) in this step-by-step tutorial course for beginners. Go is an open source programming language designed at Google that makes it easy to build simple, reliable, and efficient software.

Burak Tokman 1 Dec 16, 2021
Learn Golang in-depth by solving 15 Quizzes, 10 Exercises and 4 Projects

Modern Go (Golang) - The Complete Beginners Guide 2021 Learn Go (Golang) in-dept

Classroooms 5 Sep 26, 2022
At this example project, I'm trying to learn Golang with Clean structure and come up with a reusable

Learning Golang Language In Clean Structure At this example project, I'm trying to learn Golang with Clean structure and come up with a reusable, nice

GoTorn 3 Sep 25, 2022