Услуги Портфолио Контакты БлогНовости +7 (800) 511‑32‑27 Обсудить проект
Статьи

Автоматизация: Go или Python?

20 января 2023·5 мин чтения
Логотип YuSMP Group
Автор материалаРедакция компании YuSMP GroupБлог YuSMP Group
Профиль редакции
Автоматизация: Go или Python?

TL;DR. Для автотестов на том же языке, что и сервис, — unit-тесты обычно пишут на нём же: Go даёт скорость выполнения, статическую типизацию и встроенный go test, Python — низкий порог входа и самую широкую экосистему инструментов тестирования. E2E- и API-тесты чаще не зависят от языка продукта, поэтому их нередко пишут на Python даже для Go-бэкенда. Однозначного победителя нет — выбор зависит от нагрузки, команды и уровня тестовой пирамиды.

Мобильные приложения с каждым годом становятся все сложнее и объемнее. Проверять их вручную — утомительная и трудоемкая задача. Автоматизация помогает преодолеть эти проблемы и позволяет командам получать преимущества во времени, затратах и ​​усилиях. Это также позволяет организациям быть более гибкими в процессе разработки и обеспечивать высокое качество.

В блоге студии web-разработки YuSMP Group сравнили автоматизированное тестирование на Go и Python — а если нужна не статья, а результат, команда тестирования ПО YuSMP Group подберёт стек и настроит автотесты под ваш проект.

Определение и виды

Автоматизация тестирования — это способ проверки ПО, который осуществляется в автономном режиме. После испытаний система создает отчет, в котором результаты сравниваются с ожидаемыми, помогая командам оценить качество приложений.

Автоматическое тестирование не заменяет ручное, но помогает специалистам тратить меньше времени на поиск ошибок без потери качества.

У такого подхода есть несколько разновидностей:

  • подготовка e2e тестов (сквозное тестирование);
  • проверка интерфейсов;
  • Unit-тесты;
  • проверка кода.

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

Пирамида тестирования

Разновидности тестирования можно представить в виде пирамиды автоматизации: ее уровни располагаются в зависимости от сложности и ресурсозатратности тестов. такая графика помогает организовать работу команду: специалисты видят, какие проверки нужно провести и по каким объектам.

Здесь Отражено соотношение количества тестов к количеству частей продукта, задействованных в проверке. 

Как говорят представители Ozon Tech, испытания трех нижних уровней проводится на языке Go. Для 4 и 5 слоя применяют как Python, так и Go. Верхний уровень проверяют на Питоне.

Пирамида автоматизации тестирования: уровни от unit-тестов до end-to-end

Python

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

Python — один из любимых языков программирования команд тестирования. Он имеет множество функций, которые делают его пригодным для автоматизированного тестирования. Testing Python прост в освоении и может также использоваться для решения сложных задач. Таким образом, этот метод могут использовать пользователи с разным уровнем подготовки.

Инструменты Python

  • PyUnit — среда модульного тестирования.
  • PyTest — нативная тестовая библиотека Питон с расширенным набором функций PyUnit. 
  • Behave — тестовая среда, основанная на поведении (BDD).
  • Lettuce — инструмент автоматизации на основе поведения. 
  • Jasmine — популярная тестовая среда для использования BDD с веб-приложениями. Часто используют для проверок на JavaScript, но также пригоден и для Питона.
  • Robot Framework — среда с открытым исходным кодом.

Простой модульный тест на PyTest выглядит так — без лишней обвязки, с обычным assert:

def test_sum_of_two_numbers():
    result = calculate_sum(2, 3)
    assert result == 5

def test_invalid_input_raises_error():
    with pytest.raises(ValueError):
        calculate_sum("two", 3)

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

GO

Go test — это встроенный инструмент/команда для проведения автоматизированных тестов в Golang. Testing — это пакет, который поставляется с go и сочетается с командой go test, чтобы обеспечить минимальный, но полный опыт тестирования.

Преимущества  Go: 

  • Go легко освоить, даже если вы не очень опытны — как-то очень сложно написать очень плохой код;
  • Асинхронная логика, управляемая событиями, легко реализуема;
  • Отличное сообщество;
  • Существует множество инструментов и библиотек, полезных для автоматизации (большинство из них с открытым исходным кодом).

Инструменты и библиотеки Go

В отличие от Python, где экосистему тестирования собирают сторонние библиотеки, в Go базовые инструменты идут в комплекте с языком — остальное подключают по необходимости:

  • testing + go test — стандартный пакет и команда для запуска тестов, ничего дополнительно ставить не нужно.
  • Testify — самая популярная библиотека ассертов и моков, убирает шаблонный код сравнения результатов.
  • gomega — матчеры в BDD-стиле, часто используют вместе с Ginkgo.
  • Ginkgo — BDD-фреймворк для описания тестов человекочитаемыми сценариями.
  • Allure-Go — генерация наглядных отчётов о прогоне тестов для команды и CI/CD.
  • TableDrivenTests — не библиотека, а паттерн: один тест прогоняется на наборе входных данных из таблицы, что сокращает дублирование кода.

Табличный тест с параллельным запуском — стандартный подход к юнит-тестам в Go:

func TestCalculateSum(t *testing.T) {
    cases := []struct {
        name     string
        a, b     int
        expected int
    }{
        {"positive numbers", 2, 3, 5},
        {"negative numbers", -2, -3, -5},
        {"zero", 0, 0, 0},
    }

    for _, tc := range cases {
        tc := tc
        t.Run(tc.name, func(t *testing.T) {
            t.Parallel()
            result := calculateSum(tc.a, tc.b)
            if result != tc.expected {
                t.Errorf("expected %d, got %d", tc.expected, result)
            }
        })
    }
}

Какой тип теста можно автоматизировать с помощью GoLang? Вот краткий список:

  • API-тесты;
  • End-2-End Backend-тесты системного уровня; 
  • Тесты, которые работают с большими данными;
  • Нагрузочное тестирование;
  • Интеграционные тесты;
  • Автоматизация CI/CD (Go — это язык, созданный Google, поэтому он отлично работает с Google Cloud Platform).
Услуги тестирования ПО
Узнайте цену

Go и Python для автотестов: сравнительная таблица

Сведём ключевые различия в одну таблицу — ей удобно пользоваться как шпаргалкой при выборе стека для нового проекта.

Выбор между Go и Python для автоматизации тестирования
КритерийGoPython
ТипизацияСтатическая, ошибки видны на этапе компиляцииДинамическая, часть ошибок проявляется только при запуске
Скорость выполнения тестовВысокая — компилируется в нативный кодНиже — интерпретируемый язык
Порог входаСредний, особенно для команд без опыта в GoНизкий, много обучающих материалов
ПараллелизмНативная поддержка (горутины), просто добавить t.Parallel()Ограничен GIL, параллелизм сложнее и дороже
Экосистема тестовых библиотекКомпактная: testing, Testify, gomega, Allure-GoОчень широкая: PyTest, Behave, Robot Framework и другие
Типичное применениеUnit- и нагрузочные тесты, большие данные, CI/CDE2E, UI-тесты, BDD-сценарии, быстрые прототипы

Вывод из таблицы: Go выигрывает в скорости и параллелизме, Python — в скорости написания тестов и размере экосистемы. Дальше — как выбрать без сожалений.

Golang vs Python

Go имеет статическую систему типов (по сравнению с Python), что означает отсутствие странных ошибок. Если вы работаете с огромными наборами данных или заботитесь о времени отклика, Go — лучший выбор. Это намного быстрее, чем Python.

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

Чек-лист выбора языка для автотестов

  1. Использовать для испытаний тот же язык, на котором было написано ПО — хороший выбор, но не всегда однозначно лучший.
  2. Определите, что важнее всего: способность работать с огромными наборами данных, скорость или параллелизм?
  3. Содержит ли выбранный вами язык все необходимые функции? Инструменты? Фреймворки? Что будет на выходе тестируемого программного обеспечения, которое вы собираетесь проверять? Есть ли у него библиотеки и простые способы обработки этого вывода? В какой среде будут использоваться ваши тесты?
  4. Есть ли у языка сильное сообщество? Рано или поздно у вас возникнет вопрос или возникнет проблема, и вам нужен знающий ответ.
  5. Легко ли учиться? Вам нужно потратить месяцы на обучение, прежде чем вы сможете автоматизировать один простой тест? Легко ли будет обучить новичка, который только что присоединился к вашей команде? Есть ли хорошие учебные ресурсы?

Что важно запомнить

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

Чтобы быть уверенным в качестве программного обеспечения, выбирайте веб-услуги и разработку в YuSMP Group. Специалисты команды безошибочно подберут язык для разработки и выберут правильную среду тестирования. Проекты, которые мы создали, подтверждают высокий уровень услуг компании.

Частые вопросы об автотестах на Go и Python

Что быстрее для автотестов — Go или Python?

Go выполняет тесты быстрее за счёт компиляции в нативный код и статической типизации: тесты стартуют без интерпретатора и не тратят время на разбор типов на лету. Для нагрузочных и E2E-тестов с большим числом параллельных запросов разница особенно заметна. Python компенсирует это скоростью написания тестов и огромной экосистемой библиотек.

Нужно ли писать автотесты на том же языке, что и само приложение?

Это удобно для unit-тестов — не нужно переключаться между языками и настраивать вторую тестовую инфраструктуру. Но не обязательно: E2E- и API-тесты чаще всего не зависят от языка сервиса и их можно писать на Python или Go независимо от стека продукта.

Какие библиотеки чаще всего используют для автотестов на Go?

Стандартный пакет testing и команда go test — база для любого проекта. Для расширенных проверок берут Testify (ассерты и моки) и gomega (BDD-стиль матчеров), для отчётов — Allure-Go, для табличных тестов — встроенный паттерн TableDrivenTests.

Подходит ли Python для тестирования Go-проекта?

Да. E2E- и API-тесты работают через HTTP или gRPC-клиент и не видят, на каком языке написан сервис. Команды нередко пишут backend на Go, а верхний уровень тестовой пирамиды — на pytest, потому что там проще описывать сценарии и переиспользовать существующие QA-библиотеки.

Сколько стоит внедрить автоматизацию тестирования?

Стоимость зависит от объёма продукта, глубины покрытия и выбранного стека — от точечных API-тестов до полной пирамиды с CI/CD. Ориентировочную смету можно получить после короткого брифа с командой тестирования YuSMP Group.

Можно ли совмещать Go и Python в одной тестовой пирамиде?

Да, и это частая практика: нижние уровни пирамиды (unit-тесты, тесты производительности, работа с большими данными) — на Go, а верхние (E2E, UI, приёмочные сценарии) — на Python. Главное — не дублировать одни и те же проверки на двух языках и явно закрепить, какой уровень за каким стеком закреплён.

Нужны разработчики в команду?

Подберём инженеров нужного стека под ваш проект — быстрый старт.

Обсудить команду