Цикл выполнения 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
Оба цикла выводят ожидаемые строки, а имена шагов появляются не более одного раза.