【问题标题】:Unittest - Assert a set of items of a list are (or not) contained in another listUnittest - 断言列表中的一组项目是否包含在另一个列表中
【发布时间】:2018-01-25 22:48:57
【问题描述】:

您好,我是编程新手,并尝试进行测试以检查项目列表中的 任何 项目是否存在于另一个列表中(在 Python 2.7 中使用 unittest)。

例如,如果我有一个列表 ["dog", "cat", "frog] 并且我正在测试的方法的结果是 ["tiger", "lion", "kangaroo", "frog] 我想要测试失败,因为它包含上一个列表中的一项(“frog”)。我还希望测试告诉我两个列表都有哪些单词(即哪些单词导致测试失败)。

我试过了:

self.assertIn(["cat", "dog"], method("cat dog tiger"))

方法的结果是 ["cat", "dog", "tiger"] 但测试的结果是失败并说:

AssertionError: ['cat', 'dog'] not found in ['cat', 'dog', 'tiger']

我希望此测试返回正常,因为“猫”和“狗”出现在第二个列表中。似乎 assertIn 没有做我认为它会做的事情(我认为它是检查 b 中是否存在任何 a)。

反之亦然,当我希望它失败时,assertNotIn 就会通过。

我一直在寻找一段时间,但因为我不确定我在寻找什么,所以很难找到。

感谢您的阅读,我希望这是有道理的。

编辑:我采用了 Chris 的解决方案,它可以按我的意愿工作:

def myComp(list1, list2):
    section = list(set(list1).intersection(list2))

为了获取错误消息中重叠的单词列表(即触发失败),我从这里添加了以下代码How to change the message in a Python AssertionError?

try:
    assert(len(section)==0)
except AssertionError as e:
    e.args += ('The following are present in the processed text', 
    section)
    raise

结果正是我想要的:

AssertionError: ('The following are pressent in the processed text', ['dog', 
'cat'])

【问题讨论】:

  • 列表['cat', 'dog'] 未在列表['cat', 'dog', 'tiger'] 中找到在提示符中尝试print ['a'] in ['a'] - 这是错误的,因为列表不在列表中,并且它不执行元素-明智的比较。

标签: python python-2.7 list unit-testing assert


【解决方案1】:

您可以遍历您的列表和assertIn,或者使用sets,您可以执行self.assertTrue(set(a).issuperset(set(b))) 之类的操作。

【讨论】:

    【解决方案2】:

    你应该看看this question,然后你可以很容易地看到类似的东西:

    def myComp(list1, list2):
      section = list(set(list1).intersection(list2))
      return ((len(section)==0), section)
    

    此函数将返回一个元组,其中包含一个指示失败或成功的布尔值以及两个列表中出现的项目列表。

    如果您真的想在断言语句中执行此操作,您可以只使用该元组的第一个元素...

    【讨论】:

    • 感谢克里斯,他的工作完全符合我的要求。我确实想保留断言语句,但也想列出导致失败的原因。搜索堆栈溢出我发现了一篇关于更改我添加到代码末尾的断言错误语句的帖子,我希望这是好的编程实践,因为它完全符合我的需要!:try:assert(len(section)==0 ) 除了 AssertionError as e: e.args += ('The following are pressent in the processed text', section) raise
    【解决方案3】:

    如果您希望序列中有不可重复的值,最好考虑使用集合,因为您可以轻松检查它们是否存在任何重叠。

    >>> a, b = {'dog', 'cat'}, {'dog', 'cat', 'wolf', 'crab'}
    >>> a & b
    set(['dog', 'cat'])
    >>> a ^ b
    set(['wolf', 'crab'])
    

    所以检查 a 是否是 b 的子集将是这样的:

    >>> not bool(a ^ b & a)
    True
    

    【讨论】:

      【解决方案4】:
      self.assertTrue(any(animal in method("cat dog tiger") for animal in ("cat", "dog")))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多