我正在使用unittest
框架在python 2.6中编写测试套件,我想在我的代码中使用asserts。我知道断言得到了彻底的改革,并且在2.7+中更好,但我现在仅限于使用2.6。
我在使用断言时遇到问题。我希望能够使用assertIn(a,b)
功能,但唉,这只是2.7+。所以我意识到我必须使用同样在2.6中的assertTrue(x)
,但这不起作用。然后,我查看了this document,其中说以前的版本assertTrue(x)
曾经是failUnless(x)
,所以我在我的代码中使用了它,但仍然没有结果。
我收到消息:
NameError:未定义全局名称“failUnless”
与assertIn(a,b)
和assertTrue(x)
相同。
所以我完全不知所措。
我的问题的缩短版本:
我希望能够在python 2.6中实现assertIn(a,b)
。
有人对此有任何解决方案吗?
我的代码:
import unittest
class test_base(unittest.TestCase):
# some functions that are used by many tests
class test_01(test_base):
def setUp(self):
#set up code
def tearDown(self):
#tear down code
def test_01001_something(self):
#gets a return value of a function
ret = do_something()
#here i want to check if foo is in ret
failUnless("foo" in ret)
编辑:好像我是个白痴。我需要做的就是添加self.assert....
并且它有效。
答案 0 :(得分:3)
assertTrue
应该可以正常进行in
测试:
self.assertTrue('a' in somesequence)
所有assertIn
执行与上面相同的测试,并在测试失败时设置有用的消息。
答案 1 :(得分:2)
import unittest
class MyTest(unittest.TestCase):
def test_example(self):
self.assertTrue(x)
这应该有效,基于unittest from Python 2.6的文档。一定要将它用作TestCase.assertTrue()。
编辑:在您的示例中,将其设置为self.failUnless("foo" in ret)
,它应该有效。
答案 2 :(得分:1)
您的测试用例代码确实有帮助。
您的问题是您尝试将assert [Something]用作函数,而它们是TestCase类的方法。
所以你可以解决你的问题,例如assertTrue
:
self.assertTrue(element in list_object)
答案 3 :(得分:1)
实际上实施assertIn
非常简单。这就是我在单元测试中使用的内容:
class MyTestCase(unittest.TestCase)
def assertIn(self, item, iterable):
self.assertTrue(item in iterable,
msg="{item} not found in {iterable}"
.format(item=item,
iterable=iterable))
然后,您可以将所有测试用例基于此类而不是unittest.TestCase
并安全地使用assertIn
甚至在python 2.6上,并且错误消息将比纯assertTrue
好得多。为了比较Python 2.7中的assertIn的实际实现:
def assertIn(self, member, container, msg=None):
"""Just like self.assertTrue(a in b), but with a nicer default message."""
if member not in container:
standardMsg = '%s not found in %s' % (safe_repr(member),
safe_repr(container))
self.fail(self._formatMessage(msg, standardMsg))