You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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检测,具体提示:

  1. test_numb3rs.py未检测到numb3rs.py仅检查首字节范围的错误情况
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 01:34:53