当前位置: 首页 > 面试题库 >

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

祁嘉瑞
2023-03-14
问题内容

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

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

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

如果您需要一个真实的示例,请继续阅读。

我正在编写的代码如下所示:

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)

这种方法非常容易以一种非常紧凑的方式描述每个对象的期望值,而无需实际创建完整的对象。

但是…当一个对象未​​能通过断言时,将不对其他对象进行比较,这使调试更加困难。我想编写一个自定义方法,该方法将无条件比较所有对象,然后显示所有失败的对象,而不仅仅是第一个对象。


问题答案:

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

第一。我定义了一个包含将要合并的方法的类。

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()


 类似资料:
  • 问题内容: 我正在将NHibernate与旧的rdbms规则引擎一起使用。我正在使用GenericDialect,但生成的某些sql无法正常工作。如果我需要为此规则引擎编写自定义方言,该如何开始? 问题答案: 这是一个方言示例: 它所在的程序集引用了NHibernate.dll hibernate.cfg.dll(请注意,我这里没有设置’connection.connection_string’属

  • 我想在日志文件的开头写入自定义头行。自定义头是日期/时间,XML文件名, 在log4j中,我可以通过扩展PatternLayout来创建自定义头。 我为自定义头包含了PatternLayout的log4j属性config和子类CustomFileHeaderLayout。工作很好。 log4j.属性

  • 我想为Atom编写一个命令,它由两个或多个预先存在的命令组成,比如“Select Line”和“Cut”。我该怎么做?

  • 问题内容: 问题 我希望某些观点仅适用于网站的高级用户。 在项目中的各种应用程序中如何使用此装饰器? 问题答案: 你不必为此编写自己的装饰器,就像中已经包含的那样。 还有一个扩展此装饰器的代码段(),该代码段非常适合你的用例。 而且,要(重新)使用装饰器,只需将装饰器放在路径中的模块中,即可从任何其他模块导入它。

  • 我希望每个请求都能收到一些信息,因此我认为与其为每个请求提供一个函数并分别从请求中获取这些信息,不如使用一个过滤器<所以每一个请求都会通过这个过滤器,我就能得到我想要的 问题是:如何编写自定义筛选器 假设它不像任何预定义的Spring Security过滤器,它是全新的。

  • 问题内容: 我需要为AngularJS编写一个自定义模块,但是我找不到关于该主题的任何好的文档。如何为AngularJS编写一个可以与他人共享的自定义模块? 问题答案: 在这种情况下,您认为文档无法再为您提供帮助,一个很好的学习方法是查看其他已经构建的模块,看看其他人是如何做到的,他们如何设计架构以及如何将它们集成到其中。他们的应用。 在查看其他人的工作之后,您至少应该有一个起点。 例如,看看任何