我有一个问题 编写程序以检查用户输入的密码的有效性。 以下是检查密码的标准:
您的程序应接受逗号分隔的密码序列,并会 根据上述标准检查它们。符合条件的密码是 要打印,每个都用逗号分隔 例 如果输入以下密码作为程序输入:
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()
源代码运行良好,尽管在我是否对其进行了正确的单元测试方面存在问题。 需要一些有关如何进行最佳单元测试的帮助
答案 0 :(得分:1)
首先,您的代码有问题:您正在打印结果而不是return
对其进行打印。
作为一般原则,您应该始终努力将输入输出与“处理”分离。如果同时具有和打印/请求输入计算功能,那么最终将降低它们的可重用性和可测试性。
在这种情况下,单元测试的问题是check_password
始终返回None
,因为您未返回任何内容,因此它将始终失败。
所以首先要替换:
print(accepted)
使用
return accepted
现在:您需要为此功能进行多个测试。您应该尝试针对所有可能的情况编写测试。
例如:
基本上,您应该尝试将可能的输入划分为多个类别,并为每个类别至少检查一个输入。