LINUX.ORG.RU

Зашарить данные между тестовыми методами класса

 , , ,


0

1

Привет, парни.

Есть некий класс с двумя тестами внутри. Первый тест модифицирует переменную, которую нужно расшарить с другими тестами. К сожалению __init__ нельзя пихать в классы, т.к. pytest ругается. Как это сделать правильно и с наименьшей болью?

cat foo.py 
import pytest

class TestFoo:
    data = None

    def test_one(self):
        print('data=', self.data)
        self.data = 10
        print('data=', self.data)

    def test_two(self):
        print('data=', self.data)

выхлоп:

pytest foo.py -v -s
============================================================================================================= test session starts =============================================================================================================
platform linux -- Python 3.7.3, pytest-5.0.1, py-1.5.3, pluggy-0.12.0 -- /usr/bin/python3.7
cachedir: .pytest_cache
metadata: {'Python': '3.7.3', 'Platform': 'Linux-5.1.5-x86_64-with-glibc2.2.5', 'Packages': {'pytest': '5.0.1', 'py': '1.5.3', 'pluggy': '0.12.0'}, 'Plugins': {'metadata': '1.8.0', 'html': '1.20.0', 'hypothesis': '3.66.6', 'expect': '1.1.0'}}
rootdir: /tmp
plugins: metadata-1.8.0, html-1.20.0, hypothesis-3.66.6, expect-1.1.0
collected 2 items                                                                                                                                                                                                                             

foo.py::TestFoo::test_one data= None
data= 10
PASSED
foo.py::TestFoo::test_two data= None
PASSED

========================================================================================================== 2 passed in 0.01 seconds ===========================================================================================================



Последнее исправление: ubik (всего исправлений: 1)

Написать обертку, эту переменную(локальную) передавать параметрами. А вообще, чем поле класса не устроило?

anonymous
()
Ответ на: комментарий от anonymous

Тем, что при collecting'e pytest ругается, что self не задефайнен

ubik
() автор топика

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

AlexKiriukha ★★★★
()
Ответ на: комментарий от AlexKiriukha

Более того они специально рандомизируются...

dem ★★
()

Первый тест модифицирует переменную, которую нужно расшарить с другими тестами.

Не нужно так делать.

Singularity ★★★★★
()

Тесты которые зависят друг от друга - это так себе затея. Их ни перемешать, ни распараллелить, да и инкрементальными не всегда выйдет сделать.

Ава в тему в общем.

pon4ik ★★★★★
()

Читай про фикстуры(fixtures, setup, teardown) либо про bdd подход(given then when).

pon4ik ★★★★★
()
Ответ на: комментарий от AlexKiriukha

в pytest можно устанавливать порядок. Но вопрос не в этом. Я прекрасно понимаю, что сама идея, магко говоря, корявая. Но специфика теста в том, что другой не может отработать без завершения первого, + первый должен подготовить данные для второго. Либо дублировать часть первого теста, интегрировав его во второй.

ubik
() автор топика
Ответ на: комментарий от ubik

Либо дублировать часть первого теста, интегрировав его во второй.

это называется фикстуры

anonymous
()
Ответ на: комментарий от ubik

Подготовка данных - это же не задача теста. Как тут многие говорили - фикстуры (https://docs.pytest.org/en/latest/fixture.html). Честно говоря сразу мне они не понравились из-за DI, но потом оказалось, что удобно. Например может быть фикстура, которая создаёт нужные объекты в базе, а уже сам тест их проверяет через HTTP API.

AlexKiriukha ★★★★
()
Ответ на: комментарий от ubik

Если тебе не совсем понятно, что такое fixture и ты хочешь действовать в соответствии со своей авой, то просто продублируй тот код, который готовит данные для 2-го теста.

anonymous
()

всем спасибо

ubik
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.