Почему при написании модульных тестов на Python макеты в последующих тестах не перезаписывают макеты, созданные в предыдPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему при написании модульных тестов на Python макеты в последующих тестах не перезаписывают макеты, созданные в предыд

Сообщение Anonymous »

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

Код: Выделить всё

/.
├── src
│   └── main.py
└── test
├── __init__.py
├── test_base.py
└── test.py
Файлы
main.py

Код: Выделить всё

import boto3

s3 = boto3.client('s3')

def main():
return s3.list_buckets()
__init__.py

Код: Выделить всё

from .test import *
test_base.py

Код: Выделить всё

import unittest
from unittest.mock import MagicMock, patch

class TestBase(unittest.TestCase):
def setUp(self):
self.patch_boto3_client = patch('boto3.client', autospec=True)

self.mock_boto3_client = self.patch_boto3_client.start()

# BOTO3

# Set up mock boto3 clients
self.mock_s3 = MagicMock()

# Configure mock_boto3_client to return our mock clients
self.mock_boto3_client.side_effect = lambda service: {
's3': self.mock_s3,
}[service]

def tearDown(self) -> None:
self.patch_boto3_client.stop()
test.py

Код: Выделить всё

from .test_base import TestBase

class Test(TestBase):
def test_1(self):
from src.main import main

self.mock_s3.list_buckets.return_value = 'test_1'

response = main()

self.assertEqual(response, 'test_1')

def test_2(self):
from src.main import main

self.mock_s3.list_buckets.return_value = 'test_2'

response = main()

self.assertEqual(response, 'test_2')
Результаты

Код: Выделить всё

$ python3 -m coverage run -m unittest test
.F
======================================================================
FAIL: test_2 (test.test.Test.test_2)
----------------------------------------------------------------------
Traceback (most recent call last):
File ".../test/test.py", line 21, in test_2
self.assertEqual(response, 'test_2')
AssertionError: 'test_1' != 'test_2'
- test_1
?      ^
+ test_2
?      ^

----------------------------------------------------------------------
Ran 2 tests in 0.292s

FAILED (failures=1)
Я пробовал вносить исправления с помощью декораторов, а также запускать и останавливать объекты исправлений вручную, как показано в моем коде.
Как мне выполнить модульные тесты уважать обновления, которые я делаю для имитируемых функций?

Подробнее здесь: https://stackoverflow.com/questions/790 ... ot-overwri
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»