CS50 Python PSet7 Numb3rs:test_numb3rs.py未通过Check50检测求助
CS50 Python Problem Set7 Numb3rs任务测试脚本问题排查
问题概述
正在完成CS50《Python编程入门》的Problem Set7(Numb3rs任务),需实现验证IPv4地址有效性的函数。numb3rs.py本身通过了Check50的基础测试,但配套的pytest测试脚本test_numb3rs.py未通过Check50检测,具体提示:
test_numb3rs.py未检测到numb3rs.py仅检查首字节范围的错误情况test_numb3rs.py未检测到程序拒绝五字节IPv4地址的错误情况
同时,Check50提示correct numb3rs.py passes all test_numb3rs.py checks失败,预期退出码0,实际为1,说明正确的numb3rs.py运行测试脚本时存在断言失败。
Check50检测结果
:) numb3rs.py exists :) numb3rs.py prints True for 127.0.0.1 :) numb3rs.py prints True for 255.255.255.255 :) numb3rs.py prints True for 140.247.235.144 :) numb3rs.py prints False for 256.255.255.255 :) numb3rs.py prints False for 64.128.256.512 :) numb3rs.py prints False for 8.8.8 :) numb3rs.py prints False for 10.10.10.10.10 :) numb3rs.py prints False for 2001:0db8:85a3:0000:0000:8a2e:0370:7334 :) numb3rs.py prints False for cat :( correct numb3rs.py passes all test_numb3rs.py checks expected exit code 0, not 1 :| **test_numb3rs.py catches numb3rs.py only checking if first byte of IPv4 address is in range** can't check until a frown turns upside down :| **test_numb3rs.py catches numb3rs.py accepting expecting five-byte IPv4 address** can't check until a frown turns upside down
现有代码
numb3rs.py
import re def main(): print(validate(input("IPv4 Address: "))) def validate(ip): if re.search( r"^(?:1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.(?:1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.(?:1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.(?:1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$", ip, ): return "True" else: return "False" if __name__ == "__main__": main()
test_numb3rs.py
from numb3rs import validate def test_validate_bytes(): assert validate("") == "False" assert validate(".") == "False" assert validate("..") == "False" assert validate("...") == "False" assert validate("....") == "False" assert validate("40") == "False" assert validate(".161") == "False" assert validate("205.") == "False" assert validate("243.29") == "False" assert validate(".94.200") == "False" assert validate("105.232.") == "False" assert validate("153.213.80") == "False" assert validate(".198.242.76") == "False" assert validate("143.73.13.") == "False" assert validate("210.8.16.106.246") == "False" def test_validate_characters(): assert validate("cat") == "False" assert validate("butterfly.bug") == "False" assert validate("ant.buffalo.duck") == "False" assert validate("chicken.barb.fox.antelope") == "False" assert validate("eagle.64.97.180") == "False" assert validate("98.donkey.55.92") == "False" assert validate("100.197.frog.161") == "False" assert validate("19.63.208.bear") == "False" def test_validate_numbers(): assert validate("210.379.39.176") == "False" assert validate("45.137.315.27") == "False" assert validate("188.96.152.991") == "False" assert validate("283.300.231.22") == "False" assert validate("815.22.665.241") == "False" assert validate("902.141.206.670") == "False" assert validate("111.426.448.196") == "False" assert validate("89.120.595.713") == "False" assert validate("792.657.634.218") == "False" assert validate("916.931.177.851") == "False" assert validate("784.218.415.593") == "False" assert validate("242.590.313.510") == "False" assert validate("687.313.787.677") == "False" assert validate("0.0.0.0") == "True" assert validate("255.255.255.255") == "True" assert validate("59.224.219.131") == "True" assert validate("251.61.166.78") == "True" assert validate("187.56.2.204") == "True" assert validate("201.210.110.158") == "True" assert validate("222.32.5.182") == "True" assert validate("77.203.177.126") == "True" assert validate("113.160.32.11") == "True" assert validate("1.1.1.1") == "True"
问题分析与解决方案
1. 先解决“正确numb3rs.py无法通过测试脚本”的问题
本地运行pytest test_numb3rs.py -v,查看具体哪个断言失败。常见原因及修复:
- 前导零问题:CS50任务中IPv4字节不允许前导零(如
010.0.0.1应返回False),但当前正则会匹配这类地址。修改numb3rs.py的正则,确保每个字节要么是单个0,要么是1-9开头的1-3位数:r"^(?:0|1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(?:0|1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(?:0|1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(?:0|1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])$" - 断言拼写错误:检查测试用例中是否将
"True"/"False"写成小写,导致匹配失败。
2. 针对Check50的两个检测提示
(1)添加检测“仅检查首字节范围”的测试用例
当前测试用例未覆盖“首字节合法但其他字节含非数字/超出范围”的场景,需补充:
# 在test_validate_characters中添加 assert validate("127.abc.0.1") == "False" assert validate("255.x.y.z") == "False" # 在test_validate_numbers中添加 assert validate("0.999.0.0") == "False" assert validate("255.256.255.255") == "False" assert validate("10.20.300.40") == "False"
这些用例可检测出numb3rs.py仅验证首字节、忽略其他字节的错误。
(2)增强检测五字节IPv4地址的测试用例
当前五字节用例不足,补充更多场景:
# 在test_validate_bytes中添加 assert validate("1.2.3.4.5") == "False" assert validate("255.255.255.255.255") == "False" assert validate("0.0.0.0.0") == "False" assert validate("100.200.300.400.500") == "False"
修改后的test_numb3rs.py示例
from numb3rs import validate def test_validate_bytes(): assert validate("") == "False" assert validate(".") == "False" assert validate("..") == "False" assert validate("...") == "False" assert validate("....") == "False" assert validate("40") == "False" assert validate(".161") == "False" assert validate("205.") == "False" assert validate("243.29") == "False" assert validate(".94.200") == "False" assert validate("105.232.") == "False" assert validate("153.213.80") == "False" assert validate(".198.242.76") == "False" assert validate("143.73.13.") == "False" # 增强五字节测试用例 assert validate("210.8.16.106.246") == "False" assert validate("1.2.3.4.5") == "False" assert validate("255.255.255.255.255") == "False" assert validate("0.0.0.0.0") == "False" assert validate("100.200.300.400.500") == "False" def test_validate_characters(): assert validate("cat") == "False" assert validate("butterfly.bug") == "False" assert validate("ant.buffalo.duck") == "False" assert validate("chicken.barb.fox.antelope") == "False" assert validate("eagle.64.97.180") == "False" assert validate("98.donkey.55.92") == "False" assert validate("100.197.frog.161") == "False" assert validate("19.63.208.bear") == "False" # 添加首字节合法、其他字节含非数字的用例 assert validate("127.abc.0.1") == "False" assert validate("255.x.y.z") == "False" def test_validate_numbers(): assert validate("210.379.39.176") == "False" assert validate("45.137.315.27") == "False" assert validate("188.96.152.991") == "False" assert validate("283.300.231.22") == "False" assert validate("815.22.665.241") == "False" assert validate("902.141.206.670") == "False" assert validate("111.426.448.196") == "False" assert validate("89.120.595.713") == "False" assert validate("792.657.634.218") == "False" assert validate("916.931.177.851") == "False" assert validate("784.218.415.593") == "False" assert validate("242.590.313.510") == "False" assert validate("687.313.787.677") == "False" # 添加首字节合法、其他字节超出范围的用例 assert validate("0.999.0.0") == "False" assert validate("255.256.255.255") == "False" assert validate("10.20.300.40") == "False" # 合法地址测试 assert validate("0.0.0.0") == "True" assert validate("255.255.255.255") == "True" assert validate("59.224.219.131") == "True" assert validate("251.61.166.78") == "True" assert validate("187.56.2.204") == "True" assert validate("201.210.110.158") == "True" assert validate("222.32.5.182") == "True" assert validate("77.203.177.126") == "True" assert validate("113.160.32.11") == "True" assert validate("1.1.1.1") == "True" # 添加拒绝前导零的测试用例 assert validate("010.0.0.1") == "False" assert validate("0.01.0.0") == "False"
内容的提问来源于stack exchange,提问作者Florian
相关产品推荐
相关产品推荐

