完整的单元测试

时间:2018-08-23 21:40:52

标签: python unit-testing

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

  1. [a-z]之间至少1个字母
  2. [0-9]之间至少有1个数字
  3. [A-Z]之间至少1个字母
  4. [$#@]中至少有1个字符
  5. 最小交易密码长度:6
  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()

源代码运行良好,尽管在我是否对其进行了正确的单元测试方面存在问题。 需要一些有关如何进行最佳单元测试的帮助

1 个答案:

答案 0 :(得分:1)

首先,您的代码有问题:您正在打印结果而不是return对其进行打印。

作为一般原则,您应该始终努力将输入输出与“处理”分离。如果同时具有打印/请求输入计算功能,那么最终将降低它们的可重用性和可测试性。

在这种情况下,单元测试的问题是check_password始终返回None,因为您未返回任何内容,因此它将始终失败。

所以首先要替换:

print(accepted)

使用

return accepted

现在:您需要为此功能进行多个测试。您应该尝试针对所有可能的情况编写测试。

例如:

  • 检查没有密码满足要求时会发生什么?
  • 如果全部都满足要求会怎样?
  • 如果将空输入提供给函数会怎样?
  • 对于每个需求,请尝试查看如果您尝试使用满足除该需求之外的所有需求的密码来调用该函数会发生什么情况(例如,密码包含小写字母,大写字母,符号,数字但是长度是4或20)。

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