Модуль Python 3.x UnitTest отключает вывод трассировки стека SystemExit - PullRequest
0 голосов
/ 14 ноября 2018

Я учусь писать модульные тесты, используя модуль unittest, и углубился в метапрограммирование (я полагаю, это также известно как исправление обезьян), но у меня есть трассировка стека, которая распечатывается во время неудачного теста утверждения.

<output cut for brevity>
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/case.py", line 203, in __exit__
    self._raiseFailure("{} not raised".format(exc_name))
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/case.py", line 135, in _raiseFailure
    raise self.test_case.failureException(msg)
AssertionError: SystemExit not raised

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

Вот код, который использует диспетчер контекста для проверки SystemExit:

with self.assertRaises(SystemExit) as cm:
    o_hue_user.getHueLoginAuthentication()
self.assertNotEqual(cm.exception.code, 0)

Метод getHueLoginAuthentication выполняет exit(1) при понимании, что имя пользователя или пароль неверны, но мне нужно устранить трассировку стекараспечатывается.

Кстати, я искал этот и другие сайты и не могу найти ответ, который, кажется, имеет простое или полное решение.

Спасибо!


Поскольку я новичок в этом форуме, я не уверен, что это правильный способ ответить на ответ ...

Я могу попытаться ввести ключобласти кода, но я не могу раскрыть слишком много кода, так как я работаю в финансовом институте, и у них есть строгие правила о распределении внутренней работы.

Чтобы ответить на ваш вопрос, это код, который выполняет выход():

authentication_fail_check = bool(re.search('Invalid username or password', r.text))
if (r.status_code != 200 or authentication_fail_check) :
    self.o_logging_utility.logger.error("Hue Login failed...")
    exit(1)

Я использую PyCharm для отладки.Ключевым моментом этого кода является возвращение неудачного выполнения, чтобы я мог остановить выполнение в случае возникновения этой ошибки.Я не думаю, что здесь нужно использовать блок try, но я не думаю, что это будет иметь значение.Каково ваше профессиональное мнение?Когда условие утверждения выполнено, я получаю пропуск и не отслеживаю стек.Все это говорит мне о том, что утверждение не было выполнено.Мои тесты утверждения работают.Все, что я хочу сделать, это избавиться от стека трассировки и просто напечатать последнюю строку: «AssertionError: SystemExit not воспитано» Как мне избавиться от трассировки стека и оставить последнюю строку вывода в качестве обратной связи?

Спасибо!


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

Кстати, я могу опубликовать тестовый код, поскольку он не является частьюосновная кодовая база.Это мой первый юнит-тест метапрограммирования (патч обезьяны) и фактически мой второй юнит-тест.Я все еще борюсь с проблемой создания кода, который скажет мне, что я получаю определенный результат, который, я знаю, я получу в любом случае.В примере функции, которая возвращает ложное логическое значение, например, если я пишу код, который говорит, что выполняет этот код с этими параметрами, и я точно знаю, что эти значения будут возвращать ложные значения, то зачем строить код, который сообщает мне, что он вернет ложное значение??Я борюсь с тем, как спроектировать хорошие тесты, которые не скажут мне очевидное явление.

Пока что все, что мне удалось сделать, это использовать модульный тест, чтобы сказать мне, когда я создаю объекти выполнить функцию, она говорит мне, если вход был успешным или нет.Я могу изменить входы, чтобы вызвать его сбой.Но я уже знаю, что это не удастся.Если я правильно понимаю модульные тесты, когда я проверяю, успешен ли вход в систему или нет, это скорее интеграционный тест, а не модульный тест.Однако проблема в том, что этот конкретный класс, который я тестирую, получает свои параметры из файла конфигурации и устанавливает переменные экземпляра для конкретного соединения.В тестовом коде у меня есть 2 набора тестов, которые представляют собой хороший логин и плохой логин.Я знаю, что модульные тесты более автономны в том смысле, что функцию можно вызывать с параметрами и проверять независимо.Однако этот код работает не так.Итак, я не знаю, как разработать эффективный и полезный тест.

Это код теста для определенного класса:

import unittest
from HueUser import *

test_data = \
    {
        "bad_login": {"hue_protocol": "https",
                      "hue_server": "my.server.com",
                      "hue_service_port": "1111",
                      "hue_auth_url": "/accounts/login/?next=/",
                      "hue_user": "baduser",
                      "hue_pw": "badpassword"},
        "good_login": {"hue_protocol": "https",
                       "hue_server": "my.server.com",
                       "hue_service_port": "1111",
                       "hue_auth_url": "/accounts/login/?next=/",
                       "hue_user": "mouser",
                       "hue_pw": "good password"}
    }

def hue_test_template(*args):
    def foo(self):
        self.assert_hue_test(*args)
    return foo

class TestHueUserAuthentication(unittest.TestCase):
    def assert_hue_test(self,o_hue_user):
        with self.assertRaises(SystemExit) as cm:
            o_hue_user.getHueLoginAuthentication()
        self.assertNotEqual(cm.exception.code, 0)

for behaviour, test_cases in test_data.items():
    o_hue_user = HueUser()
    for name in test_cases:
        setattr(o_hue_user, name, test_cases[name])
    test_name = "test_getHueLoginAuthentication_{0}".format(behaviour)
    test_case = hue_test_template(o_hue_user)
    setattr(TestHueUserAuthentication,test_name, test_case)

Дайте мне знать, как ответитьна ответы или если я просто должен отредактировать свой пост ???

Спасибо!

1 Ответ

0 голосов
/ 14 ноября 2018

Добро пожаловать в переполнение стека, Роберт.Было бы очень полезно, если бы вы включили полный пример , чтобы другие люди могли помочь вам найти проблему.

С информацией, которую вы предоставили, я бы предположил, что getHueLoginAuthentication() isn 'На самом деле вы думаете, что это ошибка.Попробуйте использовать отладчик, чтобы следить за тем, что он делает, или вставьте оператор print непосредственно перед вызовом exit().

. Вот полный пример, который показывает, как работает assertRaises():

from unittest import TestCase


def foo():
    exit(1)


def bar():
    pass


class FooTest(TestCase):
    def test_foo(self):
        with self.assertRaises(SystemExit):
            foo()

    def test_bar(self):
        with self.assertRaises(SystemExit):
            bar()

Вот что происходит, когда я запускаю его:

$ python3.6 -m unittest scratch.py
F.
======================================================================
FAIL: test_bar (scratch.FooTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "scratch.py", line 19, in test_bar
    bar()
AssertionError: SystemExit not raised

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=1)
...