Получение пустого вывода в pytest для моего кода, не знаю, как это решить

#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, добро пожаловать 🙂 Не могли бы вы отметить ответ как правильный, чтобы отметить ваш вопрос как решенный?