CS50 Python - PSet 7 Numb3rs - “test_numb3rs.py 捕获 numb3rs.py 仅检查 IPv4 地址的第一个字节是否在范围内”

问题描述 投票:0回答:1

我目前正在研究 CS50 的《Python 编程简介》的问题集 7。我们必须实现一个函数,该函数需要 IPv4 地址作为输入并检查该 IPv4 地址是否有效。 但是,当我使用 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

不幸的是,我无法弄清楚我做错了什么...我的程序似乎工作正常,但我的测试程序不知何故不满足要求...

这是我的代码:

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()

这是我的测试程序的代码(用于 pytest):

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"

谁能告诉我我在测试程序中忘记注意什么?预先感谢!

PS:这是我在公共论坛上的第一篇文章,所以请宽容我;-)。

我已经尝试在各个地方检查无效数字,但 Check50 声称我只检查第一个字节是否正确。

Check50 还声称我不会检查我的程序是否拒绝 5 字节地址。但我在我的测试程序中包含了带有 5 个“数字块”的地址。

所以,我真的不明白我做错了什么......

python pytest cs50 ipv4
1个回答
0
投票

您有 2 个简单错误(

numb3rs.py
test_numb3rs.py
各 1 个)。当您使用 pytest 进行测试时,它们会相互抵消并掩盖错误。让我解释一下。

您的

validate()
函数返回
"True"
"False"
作为 STRING 对象。返回值必须是 BOOLEAN,可以是
True
False
(无引号)。结果,您的测试代码“看起来”通过了,因为它检查字符串返回。然后,当您运行
check50
时,它也“似乎”通过了前 9 个测试,因为它打印了
True
False
。但是,字符串对象不打印引号,因此 STRING="True" 和 BOOLEAN=True 都打印为 True(不带引号)。

当它使用您的

check50

 针对已知正确的 
test_numb3rs.py
 版本(不针对您的代码)运行 pytest 时,
numb3rs.py
最终捕获了错误。这就是您收到第一条错误消息的地方:
:( correct numb3rs.py passes all test_numb3rs.py checks

您可以通过单击链接在浏览器中查看更多详细信息。 (每当您不理解
check50
错误时,我强烈建议这样做。)这就是我的显示:
注意:修复此错误后,您应该通过最后 2 项测试。 (他们没有检查之前的错误。)

顺便说一句,您不需要那么多测试来测试

validate()
功能。 (我的只进行了 4 次测试并通过了。:-) 这还不够,但你明白我的意思。)每个要求只需要 1 次测试(总共 7 次):1 次测试有效对象计数 (4),2 次测试无效对象计数 (3,5),以及 4 次测试无效子网值。您可以添加子网字符值的测试,但它们是无效的,就像
315
一样。

此外,每个 False 测试应该只测试 1 个无效值。这是一个很好的测试:

assert validate("45.137.315.27") == False

这个有 4 个无效值,所以没有帮助。 (问:哪个子网值导致 False 返回?答:全部 4 个。):

assert validate("687.313.787.677") == False

© www.soinside.com 2019 - 2024. All rights reserved.