Unittest - 断言列表的一组项目(或不包含在另一个列表中

时间:2017-08-17 13:30:43

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

您好我是编程新手,并尝试进行测试,检查项目列表中的任何项是否存在于另一个列表中(使用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']

我希望此测试返回ok,因为'cat'和'dog'出现在第二个列表中。似乎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'])

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

public partial class WebForm1 : System.Web.UI.Page
{
    protected Button button1=null;
    protected override void CreateChildControls()
    {
        base.CreateChildControls();
        button1 = new Button();
        button1.ID="Button1";
        button1.OnClick += Button1_Click;
        this.Controls.Add(button1);   
    }

}