Как контролировать инкрементальный тестовый пример в Pytest - PullRequest
0 голосов
/ 29 мая 2018
@pytest.mark.incremental
class Test_aws():

    def test_case1(self):
        ----- some code here ----
        result = someMethodTogetResult
        assert result[0] == True
        orderID = result[1]

    def test_case2(self):
        result = someMethodTogetResult # can be only perform once test case 1 run successfully.
        assert result == True

    def test_deleteOrder_R53HostZonePrivate(self):
        result = someMethodTogetResult
        assert result[0] == True

Текущее поведение: если тест 1 пройден, то тест 2 выполняется, а если тест 2 пройден, то выполняется тест 3.

Что мне нужно: если test_case 3 должен быть запущен, если test_case 1 пройден.test_case 2 не должен изменять никакого поведения.Есть мысли?

Ответы [ 3 ]

0 голосов
/ 27 июля 2018

В дополнение к ответу hoefling , другой вариант - использовать pytest-steps для выполнения инкрементного тестирования.Это может помочь вам, в частности, если вы хотите разделить какие-то инкрементные состояния / промежуточные результаты между этапами.

Однако он не реализует расширенные механизмы зависимости, такие как pytest-dependency, поэтому используйте пакет, который лучше соответствует вашей цели.

С pytest-шагами пример hoefling напишет:

import random
from pytest_steps import test_steps, depends_on

def step_instance_start():
    assert random.choice((True, False))

@depends_on(step_instance_start)
def step_instance_stop():
    assert random.choice((True, False))

@depends_on(step_instance_start)
def step_instance_delete():
    assert random.choice((True, False))

@test_steps(step_instance_start, step_instance_stop, step_instance_delete)
def test_suite(test_step):
    # Execute the step
    test_step()

РЕДАКТИРОВАТЬ: есть новый режим 'генератор', чтобы сделать его еще проще:

import random
from pytest_steps import test_steps, optional_step

@test_steps('step_instance_start', 'step_instance_stop', 'step_instance_delete')
def test_suite():
    # First step (Start)
    assert random.choice((True, False))
    yield

    # Second step (Stop)
    with optional_step('step_instance_stop') as stop_step:
        assert random.choice((True, False))
    yield stop_step

    # Third step (Delete)
    with optional_step('step_instance_delete') as delete_step:
        assert random.choice((True, False))
    yield delete_step

Проверьте документацию для деталей.(Кстати я автор этого пакета;))

0 голосов
/ 19 октября 2018

Вы можете использовать пакет pytest-ordering , чтобы заказать тесты с использованием знака pytest.Автор пакета объясняет использование здесь

Пример:

@pytest.mark.first
def test_first():
    pass

@pytest.mark.second
def test_2():
    pass


@pytest.mark.order5
def test_5():
    pass
0 голосов
/ 29 мая 2018

Полагаю, вы ищете pytest-dependency, который позволяет устанавливать условные зависимости между тестами.Пример:

import random
import pytest


class TestAWS:

    @pytest.mark.dependency
    def test_instance_start(self):
        assert random.choice((True, False))

    @pytest.mark.dependency(depends=['TestAWS::test_instance_start'])
    def test_instance_stop(self):
        assert random.choice((True, False))

    @pytest.mark.dependency(depends=['TestAWS::test_instance_start'])
    def test_instance_delete(self):
        assert random.choice((True, False))

test_instance_stop и test_instance_delete будут выполняться только в случае успеха test_instance_start и пропустить в противном случае.Однако, поскольку test_instance_delete не зависит от test_instance_stop, первый будет выполняться независимо от результата последнего теста.Несколько раз запустите пример тестового класса, чтобы проверить желаемое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...