Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 完整单元测试_Python_Unit Testing - Fatal编程技术网

Python 完整单元测试

Python 完整单元测试,python,unit-testing,Python,Unit Testing,我有个问题 编写一个程序来检查用户输入的密码的有效性。 以下是检查密码的标准: [a-z]之间至少有一个字母 至少1个介于[0-9]之间的数字 [A-Z]之间至少有一个字母 [$#@]中至少有1个字符 交易密码的最小长度:6 交易密码的最大长度:12 您的程序应该接受逗号分隔的密码序列,并且 根据上述标准进行检查。符合条件的密码为 要打印,每个字符用逗号分隔 实例 如果以下密码作为程序的输入: ABd1234@1,a F1#,2w3E*,2We3345 然后,程序的输出应为: ABd1234@

我有个问题 编写一个程序来检查用户输入的密码的有效性。 以下是检查密码的标准:

  • [a-z]之间至少有一个字母
  • 至少1个介于[0-9]之间的数字
  • [A-Z]之间至少有一个字母
  • [$#@]中至少有1个字符
  • 交易密码的最小长度:6
  • 交易密码的最大长度:12
  • 您的程序应该接受逗号分隔的密码序列,并且 根据上述标准进行检查。符合条件的密码为 要打印,每个字符用逗号分隔 实例 如果以下密码作为程序的输入:

    ABd1234@1,a F1#,2w3E*,2We3345
    
    然后,程序的输出应为:

    ABd1234@1
    
    解决方案如下

    def check_password(word):
        special_str = "$#@"
        accepted = []
    
        passwords = word.split(',')
    
        for password in passwords:
    
            lower = 0
            upper = 0
            digits = 0
            special = 0
    
            for char in password:
    
                if char.islower():
                    lower += 1
                elif char.isupper():
                    upper += 1
                elif char.isdigit():
                    digits += 1
                elif special_str.find(char) != -1:
                    special += 1
    
            if lower >= 1 and upper >= 1 and digits >= 1 and special >= 1 and len(password) in range(6,13):
                accepted.append(password)
    
        return accepted
    
    我被告知还要为它编写一个单元测试 现在我还不熟悉使用单元测试,所以在阅读了一些示例之后,我尝试编写一个单元测试,如下所示

    import unittest
    import question1
    
    class Test_PasswordChecker(unittest.TestCase):
        def test_valid(self):
            self.assertEquals(question1.check_password("ABd1234@1,a F1#,2w3E*,2We3345"),'ABd1234@1')
    
    if __name__ == '__name__':
        unittest.main()
    
    源代码工作得很好,尽管我在是否为其进行了正确的单元测试方面遇到了问题。
    需要有关如何进行最佳单元测试的帮助首先,您的代码有一个问题:您正在打印结果,而不是返回结果

    作为一般原则,您应始终努力将输入输出与“处理”解耦。如果您有同时计算内容和打印/请求输入的函数,那么最终会降低它们的可重用性和可测试性

    在这种情况下,unittest的问题是
    check\u password
    总是返回
    None
    ,因为您没有返回任何内容,因此它总是会失败

    所以第一件事是:

    print(accepted)
    

    现在:这个函数需要多个测试。您应该尝试为所有可能的情况编写测试

    例如:

    • 检查没有满足要求的密码时会发生什么情况
    • 如果所有这些都满足要求,会发生什么
    • 如果为函数提供空输入,会发生什么情况
    • 对于每个要求,尝试查看如果您尝试使用满足除该要求之外的所有要求的密码调用函数会发生什么情况(例如,具有小写字母、大写字母、符号、数字但长度为4或20的密码)

    基本上,您应该尝试将可能的输入划分为多个类别,并为每个类别检查至少一个输入。

    提示:在Stackoverflow上粘贴代码时,您应该首先粘贴代码,然后选择它并按下
    {}
    按钮。否则,您会像原来的问题一样,以错误的格式结束。“需要一些帮助”对于堆栈溢出来说太宽泛了。看起来你是在要求一个关于测试的个人教程;这是离题的。你能把这个范围缩小到一个适当的具体问题吗?
    return accepted