Python:如果字符串匹配格式,则断言

时间:2017-08-30 19:02:25

标签: python django string unit-testing assertions

我使用Django Rest Framework APIClient对我的Django API进行了一些单元测试。 API的不同端点返回自定义错误消息,其中一些具有格式化字符串,如:'Geometry type "{}" is not supported'

我正在从客户端响应和错误消息键断言状态代码,但有些情况下我想知道返回了什么错误消息以确保没有其他任何因素导致该错误。

所以我想对原始的无格式字符串验证返回的错误消息。例如,如果我收到'Geometry type "Point" is not supported'之类的错误消息,我想检查它是否与原始未格式化的消息匹配,即'Geometry type "{}" is not supported'

到目前为止我想到的解决方案:

  • 首先:用正则表达式模式替换原始字符串中的括号,看它是否与响应匹配。

  • 第二:(很酷的想法,但在某些情况下可能会失败)使用difflib.SequenceMatcher并测试相似比是否大于,例如,90%。

更新

以下是一个例子:

dict个错误消息,每个错误都会从中选择相关消息,如果需要,会添加格式参数,并引发错误:

ERROR_MESSAGES = {
    'ERROR_1': 'Error message 1: {}. Do something about it',
    'ERROR_2': 'Something went wrong',
    'ERROR_3': 'Check you args: {}. Here is an example: {}'
}

现在,在处理请求期间,我的DRF序列化程序中发生错误,并引发错误:

try:
    some_validation()
except SomeError as e:
    raise serializers.ValidationError({'field1': [ERROR_MESSAGES['ERROR_N1'], ERROR_MESSAGES['ERROR_N2']], 'field2': ['ERROR_N3']})

现在在一个特定的测试中,我想确保存在某个错误消息:

class SomeTestCases(TestCase):
    def test_something(self):
        response = self.client.post(...)
        self.assertThisMessageIsInResponse(response.data, ERROR_MESSAGES['ERROR_K'])

response.data可以只是一个字符串,一个字典或错误列表;即ValidationError中的任何内容。

针对每个测试用例指向response.data内的错误消息位置没有问题。这个问题的关注点是处理格式化和未格式化字符串之间的比较。

到目前为止,最简单的方法是正则表达式。我对这是否存在内置断言以及可以使用的其他解决方案感到非常好奇。

2 个答案:

答案 0 :(得分:1)

您正在寻找assertRegex()

class SomeTestCases(TestCase):
    def test_something(self):
        response = self.client.post(...)
        self.assertRegex(response.data, r'^your regex here$')

答案 1 :(得分:0)

像regex似乎是最简单的解决方案

import re
msg = 'Geometry type "point" is not supported'
assert re.match(r'^Geometry type ".+" is not supported$', msg)