Чем отличаются unit, integration и E2E тесты
1️⃣ Как кратко ответить
Unit тесты проверяют отдельные компоненты или функции в изоляции. Integration тесты проверяют взаимодействие между несколькими компонентами или модулями. E2E (end-to-end) тесты проверяют полную работу приложения от начала до конца, включая взаимодействие с внешними системами.
2️⃣ Подробное объяснение темы
Тестирование программного обеспечения — это важный процесс, который помогает убедиться в том, что приложение работает правильно. Существует несколько уровней тестирования, каждый из которых имеет свою цель и область применения. Рассмотрим три основных типа тестов: unit, integration и E2E.
Unit тесты
Unit тесты предназначены для проверки отдельных частей кода, таких как функции или методы. Они изолируют тестируемый компонент от остальной части системы, чтобы убедиться, что он работает правильно сам по себе.
Пример:
package math
// Add складывает два целых числа и возвращает результат.
func Add(a int, b int) int {
return a + b
}
package math_test
import (
"testing"
"math"
)
// TestAdd проверяет функцию Add.
func TestAdd(t *testing.T) {
result := math.Add(2, 3)
if result != 5 {
t.Errorf("Expected 5, but got %d", result)
}
}
Add— это функция, которую мы тестируем.TestAdd— это unit тест, который проверяет, что функцияAddвозвращает правильный результат.
Integration тесты
Integration тесты проверяют, как несколько компонентов работают вместе. Они помогают выявить проблемы, которые могут возникнуть при взаимодействии между модулями.
Пример:
Предположим, у нас есть два модуля: один для работы с базой данных, другой для обработки данных.
package database
// Save сохраняет данные в базу данных.
func Save(data string) error {
// Логика сохранения данных
return nil
}
package processor
import "database"
// Process обрабатывает данные и сохраняет их.
func Process(data string) error {
// Логика обработки данных
return database.Save(data)
}
package processor_test
import (
"testing"
"processor"
)
// TestProcess проверяет взаимодействие между обработкой и сохранением данных.
func TestProcess(t *testing.T) {
err := processor.Process("example data")
if err != nil {
t.Errorf("Expected no error, but got %v", err)
}
}
Save— функция для сохранения данных в базу данных.Process— функция, которая обрабатывает данные и затем сохраняет их.TestProcess— integration тест, который проверяет, что обработка и сохранение данных работают вместе без ошибок.
E2E тесты
E2E тесты проверяют полную работу приложения от начала до конца. Они симулируют поведение пользователя и проверяют, что все части системы работают вместе, включая взаимодействие с внешними системами.
Пример:
Представим веб-приложение, где пользователь может зарегистрироваться и войти в систему.
package main
import (
"testing"
"net/http"
"net/http/httptest"
)
// TestUserRegistrationAndLogin проверяет полный процесс регистрации и входа пользователя.
func TestUserRegistrationAndLogin(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/register" && r.Method == "POST" {
w.WriteHeader(http.StatusOK)
} else if r.URL.Path == "/login" && r.Method == "POST" {
w.WriteHeader(http.StatusOK)
} else {
w.WriteHeader(http.StatusNotFound)
}
}))
defer server.Close()
// Регистрация пользователя
resp, err := http.Post(server.URL+"/register", "application/json", nil)
if err != nil || resp.StatusCode != http.StatusOK {
t.Fatalf("Expected status OK, got %v", resp.Status)
}
// Вход пользователя
resp, err = http.Post(server.URL+"/login", "application/json", nil)
if err != nil || resp.StatusCode != http.StatusOK {
t.Fatalf("Expected status OK, got %v", resp.Status)
}
}
TestUserRegistrationAndLogin— E2E тест, который проверяет, что пользователь может успешно зарегистрироваться и войти в систему.httptest.NewServer— создает тестовый HTTP-сервер для симуляции работы веб-приложения.http.Post— отправляет HTTP-запросы для регистрации и входа пользователя.
Заключение
Каждый из этих типов тестов имеет свою область применения и важен для обеспечения качества программного обеспечения. Unit тесты помогают убедиться в правильности работы отдельных компонентов, integration тесты проверяют взаимодействие между ними, а E2E тесты гарантируют, что вся система работает как единое целое.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться