Python:断言字符串是否与格式匹配

标签 python django string unit-testing assertions

我使用 Django Rest Framework APIClient 对 Django API 进行了一些单元测试。 API 的不同端点返回自定义错误消息,其中一些带有格式化字符串,例如:“不支持几何类型“{}””

我断言来自客户端响应和错误消息键的状态代码,但在某些情况下,我想弄清楚返回了什么错误消息,以确保没有其他原因导致该错误。

所以我也想根据原始的未格式化字符串验证返回的错误消息。例如,如果我收到类似 'Geometry type "Point"is not support' 的错误消息,我想检查它是否与原始的未格式化消息匹配,即 'Geometry type "{ }”不支持'

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

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

  • 第二:(很酷的想法,但在某些情况下可能会失败)使用 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 中的错误消息位置没有问题。这个问题关注的是处理格式化字符串和未格式化字符串之间的比较。

到目前为止,最简单的方法是正则表达式。我主要好奇是否有内置断言以及可以使用哪些其他解决方案。

最佳答案

您正在寻找assertRegex() :

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

另请参阅assertNotRegex .

关于Python:断言字符串是否与格式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45967970/

相关文章:

python - 使用循环计算 Python 字典中元素的有效方法

python - 如何在后台运行 django 应用程序

C# 字符串格式

随单元格值变化的字符串?

python - 在 appengine 中通过代码处理 404 抛出

python - 通过 pkexec 执行时缺少环境变量

python - 在 Python 中更改包安装顺序

python - Django DateRangeField 问题

c++ - 如何将字符串中的单个字符转换为 int

python - 解包元组时输入提示?