#python #pytest
Вопрос:
В части 1 есть 3 переменные (атака, защита и hp). Если атака меньше или равна защите, это означает, что урон не наносится. Однако, если атака сильнее, чем защита, наносится урон.
# part 1
def main():
defense = 5
attack = 8
hp = 10
if attack <= defense:
return 'No damage, since the defense stat is too high.'
if attack > defense:
damage = attack - defense
hp = hp - damage
return f'{damage} damage inflicted, enemy HP is now {hp}.'
print(main())
В части 2 моего кода есть список имен домашних животных. Мой код подсчитывает количество имен в списке и длину каждого слова в списке.
# part 2
pets = ['Spot', 'Boots', 'Mrs. Fluffington', 'Lenny', 'Bowser', 'Gina']
count = 0
word_lengths = []
def list_count(pets):
count = 0
for names in pets:
count = 1
return count
print(f'There are {list_count(pets)} pets in the list.')
def length_counter():
x = 0
while x < list_count(pets):
length = 0
for character in pets[x]:
length = 1
word_lengths.append(length)
x = 1
return f'The word lengths of each word are {word_lengths}.'
print(length_counter())
Я добавил ссылку на изображение к своим результатам pytest ниже.
введите описание изображения здесь
(ОБНОВЛЕНО) Pytest в тексте:
Microsoft Windows [Version 10.0.19043.1237]
(c) Microsoft Corporation. All rights reserved.
(base) C:Usersaksha>cd C:Usersakshalab-02-akshayanbalathas
(base) C:Usersakshalab-02-akshayanbalathas>pytest --capture=sys
============================= test session starts =============================
platform win32 -- Python 3.8.8, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
rootdir: C:Usersakshalab-02-akshayanbalathas
plugins: anyio-2.2.0
collected 1 item
lab02_test.py F [100%]
================================== FAILURES ===================================
__________________________________ test_main __________________________________
capsys = <_pytest.capture.CaptureFixture object at 0x0000016FF996D670>
def test_main(capsys):
lab02.main() # run the student's code
captured = capsys.readouterr()
sys.stderr.write('actual output:n')
sys.stderr.write(captured.out 'n')
correct_output = '3 damage inflicted, enemy HP is now 7.nThere are 6 pets in the list.nThe word lengths of each word are [4, 5, 16, 5, 6, 4].n'
sys.stderr.write('correct output:n')
sys.stderr.write(correct_output 'n')
> assert captured.out == correct_output # verify that the output is a match
E AssertionError: assert '3 damage inf...16, 5, 6, 4].' == '3 damage inf..., 5, 6, 4].n'
E Skipping 112 identical leading characters in diff, use -v to show
E - , 5, 6, 4].
E ? -
E , 5, 6, 4].
lab02_test.py:14: AssertionError
---------------------------- Captured stderr call -----------------------------
actual output:
3 damage inflicted, enemy HP is now 7.
There are 6 pets in the list.
The word lengths of each word are [4, 5, 16, 5, 6, 4].
correct output:
3 damage inflicted, enemy HP is now 7.
There are 6 pets in the list.
The word lengths of each word are [4, 5, 16, 5, 6, 4].
============================== warnings summary ===============================
..anaconda3libsite-packagespyreadlinepy3k_compat.py:8
C:Usersakshaanaconda3libsite-packagespyreadlinepy3k_compat.py:8: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.9 it will stop working
return isinstance(x, collections.Callable)
-- Docs: https://docs.pytest.org/en/stable/warnings.html
=========================== short test summary info ===========================
FAILED lab02_test.py::test_main - AssertionError: assert '3 damage inf...16, ...
======================== 1 failed, 1 warning in 0.39s =========================
(base) C:Usersakshalab-02-akshayanbalathas>
Комментарии:
1. Вы упомянули pytest и его результаты. Как выглядит ваш тест?
2. @trivvz Теперь я добавил ссылку на изображение в свой тест в нижней части кода
3. снимок экрана хорош, но не могли бы вы также добавить тестовый код в виде текста? Так с ним легче работать ;]
4. @trivvz Теперь я добавил это в текст 🙂
5. @trivvz спасибо вам за вашу помощь до сих пор я обновил свой текст pytest выше
Ответ №1:
Хорошо, как вы можете видеть в тестовом коде:
def test_main(capsys):
lab02.main() # run the student's code
Он вызывает вашу main()
функцию, поэтому вся печать должна выполняться в рамках этой функции, а не в глобальной области. На этом этапе весь ваш код снаружи main()
игнорируется тестом.
Я немного изменил ваш код, и теперь он проходит проверку:
# part 1
def main():
defense = 5
attack = 8
hp = 10
if attack <= defense:
print('No damage, since the defense stat is too high.')
if attack > defense:
damage = attack - defense
hp = hp - damage
print(f'{damage} damage inflicted, enemy HP is now {hp}.')
# part 2
pets = ['Spot', 'Boots', 'Mrs. Fluffington', 'Lenny', 'Bowser', 'Gina']
count = 0
word_lengths = []
def list_count(pets):
count = 0
for names in pets:
count = 1
return count
print(f'There are {list_count(pets)} pets in the list.')
def length_counter():
x = 0
while x < list_count(pets):
length = 0
for character in pets[x]:
length = 1
word_lengths.append(length)
x = 1
return f'The word lengths of each word are {word_lengths}.'
print(length_counter())
Я только что изменил первые два return
print()
на ваши main()
и переместил остальную часть вашего кода внутрь main()
. Не стесняйтесь переделывать его по своему усмотрению ;] На вашем месте я бы вывел все определения функций за пределы main()
и просто вызвал их из него. Это обычная и хорошая практика. Функции должны возвращать str
и main()
выводить выходные данные.
Дайте мне знать в случае возникновения каких-либо вопросов.
Комментарии:
1. Результаты теперь совпадают и в моем тесте , но я все еще получаю неудачный тест. Вы хотите, чтобы я обновил текст pytest?
2. @Akshayan416, я понял, в конце теста есть новая строка ожидаемого результата. Пожалуйста, удалите
end=""
из последней строки основную функцию. Я обновлю свой ответ.3. да, тест прошел код, большое вам спасибо за вашу помощь.
4. @Akshayan416, добро пожаловать 🙂 Не могли бы вы отметить ответ как правильный, чтобы отметить ваш вопрос как решенный?