Python/Django:如何断言单元测试结果包含某个字符串?

use*_*719 59 python django json unit-testing assert

在python单元测试中(实际上是Django),assert如果我的测试结果中包含我选择的字符串,那么正确的语句是什么?

即,像 result

我想确保我assert至少包含我指定为上面第二个参数的json对象(或字符串),即result

Ed *_*d I 98

要断言字符串是否是另一个字符串的子字符串,您应该使用assertInassertNotIn:

# Passes
self.assertIn('bcd', 'abcde')

# AssertionError: 'bcd' unexpectedly found in 'abcde'
self.assertNotIn('bcd', 'abcde')
Run Code Online (Sandbox Code Playgroud)

这些是自Python 2.7Python 3.1以来的新功能

  • "assertIn"也提供了有关失败的有用信息,如图所示. (3认同)

Aks*_*aaj 51

self.assertContains(result, "abcd")
Run Code Online (Sandbox Code Playgroud)

您可以修改它以使用json.

使用self.assertContains只为HttpResponse对象.对于其他对象,请使用self.assertIn.

  • assertContains并不打算用于除HttpReponse之外的其他对象,而是更喜欢使用带有"in"python关键字的assertTrue(参见下面的答案). (28认同)
  • 这是错的.Assertconains用于http响应. (11认同)
  • 此答案应澄清它仅适用于 HttpResponse (3认同)
  • 是但是由于json结构,它可能会添加一些空格,这在json中没有问题但是如果你想与python字符串进行比较则会出现问题. (2认同)

Pie*_*scy 21

您可以在python关键字中使用简单的assertTrue +在另一个字符串中编写关于字符串的预期部分的断言:

self.assertTrue("expected_part_of_string" in my_longer_string)
Run Code Online (Sandbox Code Playgroud)

  • 这个策略的问题是可以提供"AssertionError:False is not true"形式的不良失败消息 (8认同)

Vin*_*ert 8

使用构建JSON对象json.dumps().

然后用它们比较它们 assertEqual(result, your_json_dict)

import json

expected_dict = {"car":["toyota", "honda"]}
expected_dict_json = json.dumps(expected_dict)

self.assertEqual(result, expected_dict_json)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,当你在任何字典中有多个键时,这将是不可靠的,因为`dumps()`使用任意顺序,我们不知道`result`中键的顺序.使用`self.assertEqual(json.loads(result),expected_dict)`你会好得多. (11认同)

jam*_*esc 6

正如Ed I所提到的,assertIn可能是在另一个字符串中找到一个字符串的最简单答案.但问题是:

我想确保我result至少包含我指定为上面第二个参数的json对象(或字符串),即{"car" : ["toyota","honda"]}

因此,我会使用多个断言,以便在失败时收到有用的消息 - 将来必须理解和维护测试,可能是那些最初没有编写它们的人.因此假设我们在一个django.test.TestCase:

# Check that `car` is a key in `result`
self.assertIn('car', result)
# Compare the `car` to what's expected (assuming that order matters)
self.assertEqual(result['car'], ['toyota', 'honda'])
Run Code Online (Sandbox Code Playgroud)

其中提供了有用的消息如下:

# If 'car' isn't in the result:
AssertionError: 'car' not found in {'context': ..., 'etc':... }
# If 'car' entry doesn't match:
AssertionError: Lists differ: ['toyota', 'honda'] != ['honda', 'volvo']

First differing element 0:
toyota
honda

- ['toyota', 'honda']
+ ['honda', 'volvo']
Run Code Online (Sandbox Code Playgroud)