Sobes.tech
Middle

Защо сухите тестове са по-добри от използването на Postman?

sobes.tech AI

Отговор от AI

Мок тестовете позволяват изолирането на тествания компонент, без да зависят от наличността или работоспособността на външните услуги. Това осигурява стабилност и повторяемост на тестовете, ускорява изпълнението на тестовите сценарии и улеснява откриването на грешки, свързани директно с тестваната логика.

Postman, дори и използвайки мока, тества взаимодействието с външните зависимости на ниво заявки/отговори, а не вгражда мока директно в тестовия код или самия компонент. Това е по-малко гранулярно и по-трудно за автоматизация в CI/CD пайплайни.

Предимствата на мок тестовете пред Postman за автоматизирано тестване:

  • Изолация: Тества се само кодът, а не интеграцията с външните системи.
  • Стабилност: Тестовете не се провалят заради проблеми с външните услуги.
  • Бързина: Бързо изпълнение на тестовете без чакане за отговори от реалните услуги.
  • Гранулярност: Възможност за мокване на отделни методи или функции в кода.
  • Автоматизация: Лесно се интегрира в единични и интеграционни тестове, които се изпълняват автоматично.
  • Тестване на крайни случаи: Лесно имитиране на различни сценарии на отговори от зависимостите (грешки, забавяния, нестандартни данни).

Пример за използване на мок в Java (Mockito):

// Създаваме мок за зависимост
ExternalService mockService = mock(ExternalService.class);

// Настройваме поведението на мока при извикване на определен метод
when(mockService.getData(anyString())).thenReturn("мокнати данни");

// Тестваме компонента, използвайки мока
Processor processor = new Processor(mockService);
String result = processor.process("вход");

// Проверяваме резултата
assertEquals("обработени мокнати данни", result);

// Проверяваме дали е бил извикан методът на мока
verify(mockService).getData("вход");

Пример за използване на мок в Python (unittest.mock):

# mock_example.py

def get_data_from_external_service(id):
  # Имитация на извикване на външна услуга
  pass

def process_data(id):
  data = get_data_from_external_service(id)
  return f"обработени {data}"

# test_mock_example.py
import unittest
from unittest.mock import patch
from . mock_example import process_data

class TestProcessData(unittest.TestCase):
  @patch('mock_example.get_data_from_external_service')
  def test_process_data_with_mock(self, mock_get_data):
  # Настройваме върнатата стойност на мока
  mock_get_data.return_value = "мокнати данни"

  # Извикваме тестваната функция, която използва мока
  result = process_data("някакво_id")

  # Проверяваме резултата
  self.assertEqual(result, "обработени мокнати данни")

  # Проверяваме дали мокът е бил извикан с очаквания аргумент
  mock_get_data.assert_called_once_with("някакво_id")

if __name__ == '__main__':
  unittest.main()

Postman е по-подходящ за ръчно тестване на API, изследователско тестване или създаване на демонстрационни заявки. За автоматизирано тестване в рамките на CI/CD мок тестовете на ниво код са за предпочитане.