QA学生求助:修正基于TDD的Python回文unittest测试用例
问题分析与修正方案
核心问题
assertTrue的第二个参数是错误提示文本,并非测试用例标识,你的写法语法没问题,但测试场景覆盖不全。- 原业务代码中,字符串的空格移除、大小写转换逻辑放在了交互循环里,而非回文判断函数中,导致测试时直接传入带空格/大小写的字符串会得到错误结果。
- 测试用例仅覆盖了单一正向场景,缺少反向用例和边界情况(如空字符串、带特殊格式的回文)。
优化后的业务代码(Asignment_TDD.py)
把字符串预处理逻辑抽成独立函数,让回文判断函数职责更清晰,也方便测试:
def clean_input_string(string): return string.replace(" ", "").lower() def PalindromTest(string): cleaned_str = clean_input_string(string) return cleaned_str == cleaned_str[::-1] # 交互逻辑保留 while True: user_input = input("Enter a string or number:\n") if PalindromTest(user_input): print(f'"{user_input}" is a palindrome') else: print(f'"{user_input}" is not a palindrome')
修正后的测试代码
import unittest from Asignment_TDD import PalindromTest, clean_input_string class PalindromeTestCase(unittest.TestCase): def test_string_cleaning(self): # 单独测试字符串预处理逻辑 self.assertEqual(clean_input_string("A Man"), "aman") self.assertEqual(clean_input_string("Hello World 123"), "helloworld123") self.assertEqual(clean_input_string(""), "") def test_valid_palindromes(self): # 测试正向回文场景 self.assertTrue(PalindromTest("civic"), "Expected 'civic' to be a palindrome") self.assertTrue(PalindromTest("A man a plan a canal Panama"), "Expected Panama phrase to be a palindrome") self.assertTrue(PalindromTest("12321"), "Expected '12321' to be a palindrome") self.assertTrue(PalindromTest(""), "Expected empty string to be a palindrome") def test_invalid_palindromes(self): # 测试非回文场景 self.assertFalse(PalindromTest("hello"), "Expected 'hello' not to be a palindrome") self.assertFalse(PalindromTest("12345"), "Expected '12345' not to be a palindrome") self.assertFalse(PalindromTest("Python"), "Expected 'Python' not to be a palindrome") if __name__ == '__main__': unittest.main()
关键说明
- 抽离
clean_input_string函数:将字符串预处理逻辑独立,既符合单一职责原则,也能单独验证预处理是否正确。 - 丰富测试场景:覆盖了大小写混合、带空格、数字、空字符串等多种情况,同时包含正向和反向测试,确保函数逻辑全面可靠。
- 规范断言使用:
assertTrue/assertFalse的第二个参数作为错误提示,能在断言失败时快速定位问题。
内容的提问来源于stack exchange,提问作者SPGA
相关产品推荐
相关产品推荐

