Цикл выполнения n-1 раз в Python-ведут себя

У меня есть шаг в поведении, который вызывает метод в другом классе Python следующим образом

@when('we query for a specific resource')
def step_impl(context):

context.resource='myresource'
jsonutil=JSONUtil.JSONUtil()
response=jsonutil.parseJSON(context.resource)
assert True

Метод parsejson в классе JSONUtil выглядит следующим образом

def parseJSON(self,resource):

    url= "http://"+data.test.engine_url+'/api/v1/policies?resource='+resource
    response=requests.get(url)
    time.sleep(5)
    json_data = json.loads(response.text)
    #time.sleep(5)
    #print(json_data)
    x=[1,2,3]
    for i in x:
        print("%d" % i)

    #for json_obj in json_data:
    #        if 'statements' in json_obj:
    #            print(json_obj['statements'][0]['resource'][0])

    return response

Когда этот шаг выполнен. Я получаю следующий вывод

1
2
<<Note that 3 does not get printed>>

Но когда метод parsejson вызывается следующим образом

J=JSONUtil()
J.parseJSON('myJSON')

Я получаю следующий вывод

1
2
3

Любая причина / указатели относительно того, почему код, когда вызывается с использованием поведения, выполняет цикл for n-1 раз?

1 ответ

Единственное, что я знаю об этом, объясняет, почему код, который правильно генерирует ожидаемые строки вне Behave, внезапно создает вывод, в котором отсутствует последняя строка, если он выполняется в Behave: вывод перезаписывается выводом Behave. По умолчанию незадолго до того, как Behave запускает шаг, он выводит на экран имя шага в нейтральном цвете, после выполнения шага Behave перезаписывает последнюю строку вывода с именем шага в цвете, указывающем, был ли шаг неудачным, успешным или нет. неопределенный и т. д.

Мое лекарство - просто добавить больше новых строк в мои распечатки. Вы также можете использовать --no-color, Я предпочитаю иметь цвета, поэтому я добавляю новые строки.

Вот иллюстрация. Рассмотрим этот файл функций:

Feature: foo

Scenario: foo
  When something
  And something else
  And and another thing

И эти шаги:

@when("something")
def step_impl(context):
    for i in (1, 2, 3):
        print("%d" % i)

@when("something else")
def step_impl(context):
    for i in (1, 2, 3):
        print("%d" % i)
    print()

@when("and another thing")
def step_impl(context):
    pass

Если вы бежите behave --no-capture:

behave --no-capture
Feature: foo # features/foo.feature:1

  Scenario: foo           # features/foo.feature:3
    When something        # features/steps/steps.py:1
1
2
    When something        # features/steps/steps.py:1 0.000s
    And something else    # features/steps/steps.py:6
1
2
3
    And something else    # features/steps/steps.py:6 0.000s
    And and another thing # features/steps/steps.py:12 0.000s

1 feature passed, 0 failed, 0 skipped
1 scenario passed, 0 failed, 0 skipped
3 steps passed, 0 failed, 0 skipped, 0 undefined
Took 0m0.000s

(Вывод выше будет цветным, но копирование и вставка не сохранит цвета.)

У шага "Когда что-то" отсутствует последняя строка вывода, тогда как у "Когда что-то еще" есть все ожидаемые строки, только потому, что у него есть дополнительная print в конце. Однако обратите внимание, что для обоих шагов имя шага появляется дважды в выводе. Учитывая цвета, в обоих случаях при первом появлении названия шага оно отображается серым, а во второй раз - зеленым. Если вы запустите его с --no-color тоже вы получите:

Feature: foo # features/foo.feature:1

  Scenario: foo           # features/foo.feature:3
    When something        # features/steps/steps.py:1
1
2
3
    And something else    # features/steps/steps.py:6
1
2
3

    And and another thing # features/steps/steps.py:12

1 feature passed, 0 failed, 0 skipped
1 scenario passed, 0 failed, 0 skipped
3 steps passed, 0 failed, 0 skipped, 0 undefined
Took 0m0.000s

Оба цикла выводят ожидаемые строки, а имена шагов появляются не более одного раза.

Другие вопросы по тегам