Sobes.tech
Junior

Тестілеу контекстінде моктау (mocking) дегеніміз не?

sobes.tech AI

AI-дан жауап

Мокирование – бұл тестіленетін объектінің тәуелділіктерінің мінез-құлқын имитациялайтын мок объектілерін жасау. Бұл тестіленетін компонентті оқшаулау және оның логикасын сыртқы жүйелермен (дерекқорлар, желілік қызметтер және т.б.) өзара әрекеттесуінсіз тексеру үшін жасалады. Моктар қайтарылатын мәндерді және қателерді бақылауға, сондай-ақ тестіленетін объектінің тәуелділіктерімен қалай әрекеттесетінін тексеруге мүмкіндік береді (белгілі бір әдістердің белгілі бір аргументтермен шақырылғанын).

Моктау қажеттілігі:

  • Оқшаулау: Тек қарастырылып жатқан компоненттің логикасы тестіленеді.
  • Жылдамдық: Тәуелділіктерді моктау тестілерді тез орындауға мүмкіндік береді, сыртқы қызметтердің жауаптарын күтпестен.
  • Сенімділік: Тестілер сыртқы жүйелердің жағдайына тәуелді емес, бұл олардың тұрақтылығын арттырады.
  • Шекара жағдайларын тестілеу: Қателерді немесе күтпеген мінез-құлықты имитациялау оңай.

Python-да моктау үшін танымал кітапханалар:

  • unittest.mock: Стандартты кітапханаға кіріктірілген модуль.
  • pytest-mock: pytest үшін плагин, ыңғайлы фикстура mocker-ді ұсынады.

unittest.mock қолдану мысалы:

# Бастапқы код
class Service:
    def get_data(self):
        # Сыртқы қызметке сұрау
        pass

class Processor:
    def __init__(self, service):
        self._service = service

    def process(self):
        data = self._service.get_data()
        return f"Өңделді: {data}"

# Processor-ді тестілеу үшін моктау
import unittest
from unittest.mock import Mock

class TestProcessor(unittest.TestCase):
    def test_process_calls_service(self):
        # Service үшін мок құру
        mock_service = Mock()
        # get_data қайтаруы тиіс мәнді көрсету
        mock_service.get_data.return_value = "Тестілеу деректері"

        # Мокпен тестіленетін объект құру
        processor = Processor(mock_service)
        result = processor.process()

        # get_data әдісінің шақырылғанын тексеру
        mock_service.get_data.assert_called_once()
        # Нәтижені тексеру
        self.assertEqual(result, "Өңделді: Тестілеу деректері")

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