我正在学习如何使用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)
,但是我需要消除正在打印的堆栈跟踪。
顺便说一句,我已经搜索了这个站点和其他站点,却找不到一个似乎具有简单或完整解决方案的答案。
谢谢!
由于我是这个论坛的新手,所以我不确定这是否是回答问题的正确方法...
我可以尝试输入代码的关键领域,但是由于我在一家金融机构工作,所以我不能透露太多代码,他们对共享内部工作有严格的规定。
要回答您的问题,这是执行exit()的代码:
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” 如何摆脱堆栈跟踪,并保留输出的最后一行作为反馈?
谢谢!
我想对您也表示感谢,谢谢唐。
顺便说一句,我可以发布测试代码,因为它不是主要代码库的一部分。这是我的第一个元编程(猴子修补)单元测试,实际上是我的第二个单元测试。我仍然在努力构建一些代码,这些代码将告诉我我得到了特定的结果,无论如何我都会得到解决。例如,在一个返回假布尔值的函数示例中,如果我编写的代码说要使用这些参数执行此代码,并且我知道这些值将返回假,那么为什么构建代码告诉我它将返回假? ? 我正在努力设计好的测试,这些测试不会告诉我显而易见的事情。
到目前为止,我所要做的就是使用单元测试来告诉我,当我实例化一个对象并执行一个函数时,它告诉我登录是否成功。我可以更改输入以使其失败。但是我已经知道它将失败。如果我正确理解了单元测试,那么当我测试登录是否成功时,更多的是集成测试而不是单元测试。 但是,问题是,我正在测试的该特定类从配置文件获取其参数,并为特定连接设置实例变量。在测试代码中,我有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)
让我知道如何回答“答案”,或者只编辑帖子?
谢谢!
答案 0 :(得分:0)
欢迎来到堆栈溢出,Robert。如果您包含full example,这将非常有帮助,以便其他人可以帮助您找到问题。
根据您所提供的信息,我想getHueLoginAuthentication()
实际上并没有引发您认为是错误的信息。尝试使用调试器来跟踪其工作,或者在调用exit()
之前放置一条print语句。
下面是一个完整的示例,显示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)