Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中编写自定义的“.assertFoo()”方法?_Python_Unit Testing - Fatal编程技术网

如何在Python中编写自定义的“.assertFoo()”方法?

如何在Python中编写自定义的“.assertFoo()”方法?,python,unit-testing,Python,Unit Testing,我正在为我的应用程序编写一些使用Python的测试用例。现在,我需要将一个对象列表与另一个对象列表进行比较,以检查第一个列表中的对象是否符合我的预期 如何编写自定义的.assertFoo()方法?它应该做什么?它是否应该在失败时引发异常?如果是,哪一个例外?以及如何传递错误消息?错误消息应该是unicode字符串还是bytestring 不幸的是,没有解释如何编写自定义断言方法 如果你需要一个真实的例子,继续阅读 我正在编写的代码有点像这样: def assert_object_list(se

我正在为我的应用程序编写一些使用Python的测试用例。现在,我需要将一个对象列表与另一个对象列表进行比较,以检查第一个列表中的对象是否符合我的预期

如何编写自定义的
.assertFoo()
方法?它应该做什么?它是否应该在失败时引发异常?如果是,哪一个例外?以及如何传递错误消息?错误消息应该是unicode字符串还是bytestring

不幸的是,没有解释如何编写自定义断言方法

如果你需要一个真实的例子,继续阅读


我正在编写的代码有点像这样:

def assert_object_list(self, objs, expected):
    for index, (item, values) in enumerate(zip(objs, expected)):
        self.assertEqual(
            item.foo, values[0],
            'Item {0}: {1} != {2}'.format(index, item.foo, values[0])
        )
        self.assertEqual(
            item.bar, values[1],
            'Item {0}: {1} != {2}'.format(index, item.bar, values[1])
        )

def test_foobar(self):
    objs = [...]  # Some processing here
    expected = [
        # Expected values for ".foo" and ".bar" for each object
        (1, 'something'),
        (2, 'nothing'),
    ]
    self.assert_object_list(objs, expected)
这种方法使得以非常简洁的方式描述每个对象的期望值变得非常容易,并且不需要实际创建完整的对象


然而。。。当一个对象的断言失败时,不会再比较其他对象,这使得调试更加困难。我想编写一个自定义方法,无条件地比较所有对象,然后显示所有失败的对象,而不仅仅是第一个对象。

您应该创建自己的TestCase类,从unittest.TestCase派生。然后将自定义断言方法放入该测试用例类中。如果测试失败,请提出断言错误。您的消息应该是字符串。如果您想测试列表中的所有对象,而不是在出现故障时停止,则收集一个失败索引列表,在对所有对象进行循环后,生成一条断言消息,总结您的发现。

在这些情况下,我使用多重继承。例如:

首先。我定义了一个类,其方法将合并

import os

class CustomAssertions:
    def assertFileExists(self, path):
        if not os.path.lexists(path):
            raise AssertionError('File not exists in path "' + path + '".')
现在我定义了一个从unittest.TestCase和CustomAssertion继承的类

import unittest

class MyTest(unittest.TestCase, CustomAssertions):
    def test_file_exists(self):
        self.assertFileExists('any/file/path')

if __name__ == '__main__':
    unittest.main()

这只是一个用numpy比较单元测试总结的例子

import numpy as np
class CustomTestCase(unittest.TestCase):
    def npAssertAlmostEqual(self, first, second, rtol=1e-06, atol=1e-08):
        np.testing.assert_allclose(first, second, rtol=rtol, atol=atol)


class TestVector(CustomTestCase):
    def testFunction(self):
        vx = np.random.rand(size)
        vy = np.random.rand(size)
        self.npAssertAlmostEqual(vx, vy)

在引发
断言错误
和任何其他
异常
(关于自定义断言和
单元测试
)方面有什么区别吗?很好的子类化替代方法-这很有用。这种方法也被称为。我做了类似的事情,但我认为当测试失败时,堆栈跟踪始终显示引发断言错误的行,而不是实际测试中调用断言函数的行。有什么方法可以修复吗?@CristóbalGanter要修复堆栈跟踪中的行,请参阅发出测试失败信号的建议方法是调用
self.fail()
,或等效地
raise self.failureException(msg)
。虽然引发和断言一个错误暂时可以工作,但unittest框架可能并不总是同等地对待它:请参阅下面的问题,了解断言失败时Python的unittest中继续的
应该帮助您正确覆盖
TestCase.assertEqual()
。另外一个问题应该可以帮助您创建一个自定义的
myAssertEqual()
,并将其注册为自动调用。