Я учусь писать модульные тесты, используя модуль 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)
Дайте мне знать, как ответитьна ответы или если я просто должен отредактировать свой пост ???
Спасибо!