Python unittest框架中,除自定义类外如何匹配字符串部分内容?
Python unittest 中验证字典值部分匹配的其他实现方式
你当前的场景是:用assertDictEqual验证字典时,某个字符串值过长,只需验证其开头是否符合预期。你已经尝试了拆分断言和自定义CONTAINING类的方式,以下是unittest框架内的其他实现方式:
使用正则匹配断言
assertRegex/assertRegexpMatches
unittest提供了专门的正则匹配断言方法,可以直接针对目标字符串做前缀匹配(用^限定开头):self.assertEqual(len(result), 3) self.assertEqual(result[1], 2) self.assertEqual(result[3], 4) self.assertRegex(result[5], r"^Error: You entered 1, while one of the following values was expected:")assertRegex(Python3.2+)和assertRegexpMatches(旧版本别名)会检查目标字符串是否匹配给定的正则表达式,适合这种部分匹配的场景。自定义断言方法
如果这类场景在你的测试中频繁出现,可以在测试类里封装一个自定义的断言方法,让代码更整洁:def assertDictWithPartialValues(self, actual, expected): # 先验证字典键的数量和一致性 self.assertEqual(set(actual.keys()), set(expected.keys())) for key, expected_val in expected.items(): actual_val = actual[key] # 如果预期值是带*的字符串,视为前缀匹配 if isinstance(expected_val, str) and expected_val.endswith("*"): prefix = expected_val[:-1] self.assertTrue(actual_val.startswith(prefix)) else: self.assertEqual(actual_val, expected_val) # 使用时: self.assertDictWithPartialValues(result, { 1: 2, 3: 4, 5: "Error: You entered 1, while one of the following values was expected:*" })这种方式可以根据自己的需求扩展匹配规则,比如支持后缀匹配、包含匹配等。
拆分验证确定键值对+单独断言目标字段
先验证字典中所有确定的键值对,再单独处理需要部分匹配的字段,比全量拆分断言更简洁:# 先验证除了5之外的键值对 self.assertDictEqual( {k: v for k, v in result.items() if k != 5}, {1: 2, 3: 4} ) # 单独验证字符串前缀 self.assertTrue(result[5].startswith("Error: You entered 1, while one of the following values was expected:"))
内容的提问来源于stack exchange,提问作者Baz
相关产品推荐
相关产品推荐

