单元测试 \- 断言列表的一组项目包含(或不包含)在另一个列表中

新手上路,请多包涵

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

例如,如果我有一个列表 [“dog”, “cat”, “frog] 并且我正在测试的方法的结果是 [“tiger”, “lion”, “kangaroo”, “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))

要获取错误消息中重叠的单词列表(即触发失败),我从此处添加了下面的代码 如何更改 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'])

原文由 RubyJane 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 434
2 个回答

你应该看看 这个问题,然后你可以很容易地看到类似的东西:

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

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

如果你真的想在断言语句中这样做,你可以只使用该元组的第一个元素……

原文由 Chris 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 Alex 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题