Python:如果字符串与格式匹配,则断言
我使用Django Rest框架APIClient对我的Django API进行了一些单元测试。 API的不同端点返回自定义错误消息,其中一些带有格式化字符串,如:Python:如果字符串与格式匹配,则断言,python,django,string,unit-testing,assertions,Python,Django,String,Unit Testing,Assertions,我使用Django Rest框架APIClient对我的Django API进行了一些单元测试。 API的不同端点返回自定义错误消息,其中一些带有格式化字符串,如:“不支持几何体类型”{}” 我从客户机响应和错误消息键断言状态代码,但在某些情况下,我想确定返回了什么错误消息,以确保没有其他原因导致该错误 因此,我还想根据原始的未格式化字符串验证返回的错误消息。例如,如果我收到一条错误消息,如'Geometry type“Point”不受支持“,我想检查它是否与原始未格式化消息匹配,即'Geome
“不支持几何体类型”{}”
我从客户机响应和错误消息键断言状态代码,但在某些情况下,我想确定返回了什么错误消息,以确保没有其他原因导致该错误
因此,我还想根据原始的未格式化字符串验证返回的错误消息。例如,如果我收到一条错误消息,如'Geometry type“Point”不受支持“
,我想检查它是否与原始未格式化消息匹配,即'Geometry type“{}”不受支持“
到目前为止,我想到的解决方案是:
- 第一:用正则表达式模式替换原始字符串中的括号,并查看它是否与响应匹配
- 第二:(这个想法很酷,但在某些情况下可能会失败)使用
并测试相似性比率是否大于90%difflib.SequenceMatcher
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'])
响应。数据
可以只是一个字符串、一个命令或一系列错误;i、 e.ValidationError
中可能出现的任何错误
指向响应中的错误消息位置。每个测试用例的数据没有问题。这个问题关注的是格式化字符串和未格式化字符串之间的比较
到目前为止,最简单的方法是正则表达式。我最好奇的是,是否有一个内置的断言,以及可以使用哪些其他解决方案。似乎regex将是这里最简单的解决方案
import re
msg = 'Geometry type "point" is not supported'
assert re.match(r'^Geometry type ".+" is not supported$', msg)
您正在寻找:
class-sometestcase(TestCase):
def测试(自我):
response=self.client.post(…)
self.assertRegex(response.data,r'^your regex here$)
为什么不将原始消息中引号之间的内容替换为第一个解决方案中的{}
,并比较两个“模板”?@Jean Françoisfare,这就是一个例子。还有其他格式不同的错误消息。我在错误键到错误键消息的dict
中有我的消息,并且根据测试用例,我想使用我的固定错误键检查特定消息。消息本身将来可能会更改,我不想在这些更改后更新每个测试用例。@kaveh:请举例说明错误dict
。几个问题:这个dict
可以通过单元测试访问吗?错误键的作用是什么?@ContinuousLoad我用一个例子更新了这个问题。这是我的第一个解决方案。我想知道解决这个问题的其他方法。