Python中的自定义密码验证,对密码验证功能进行单元测试

def test_char_i_in_str_python(self):

self.assertFalse(contains_character(“i”, “python”))

def test_str_py_in_str_python(self):

self.assertTrue(contains_character(“py”, “python”))

def test_str_python_in_str_python(self):

self.assertTrue(contains_character(“python”, “python”))

if __name__ == “__main__”:

unittest.main()

我们能击中ctrl + F5运行此脚本(test.py)无需调试。我们可以像下面这样运行这个脚本python3 test.py或者python3 -m unittest test.py。所有这些测试都应该通过。

试验is_valid_size


is_valid_size返回bool,要么True或者False。所以我们可以使用assertTrue还有assertFalse方法。

我们将测试:

  • 对于空密码或没有传递参数时

  • 四个字符的密码

  • 六个字符的密码

  • 十六个字符的密码

  • 二十个字符的密码

  • 21个字符的密码

TestIsValidSize

import unittest

from app import is_valid_size

class TestIsValidSize(unittest.TestCase):

def test_empty_password(self):

self.assertFalse(is_valid_size(“”))

def test_4_char_password(self):

self.assertFalse(is_valid_size(“pass”))

def test_6_char_password(self):

self.assertTrue(is_valid_size(“passwd”))

def test_16_char_password(self):

self.assertTrue(is_valid_size(“ThisIs1Password!”))

def test_20_char_password(self):

self.assertTrue(is_valid_size(“ThisIs1Password!+20”))

def test_21_char_password(self):

self.assertFalse(is_valid_size(“ThisIs1Password!+20&”))

if __name__ == “__main__”:

unittest.main()

所有这些测试都应该通过。

试验is_valid_password


is_valid_password返回bool,要么True或者False。所以我们可以使用assertTrue还有assertFalse方法。

我们将测试:

  • 对于空密码

  • 三个字符的密码

  • 十个字符的密码

  • 二十个字符的密码

  • 对于包含无效特殊字符(如分号)的密码

  • 对于没有数字的密码

  • 对于没有小写字母的密码

  • 对于没有大写字母的密码

  • 对于没有有效特殊字符的密码

  • 对于有效的密码

  • 一个尺寸以内,[6-20]

  • 至少一个小写和大写字符

  • 至少一个数字

  • 没有无效的特殊字符

TestIsValidPassword

class TestIsValidPassword(unittest.TestCase):

def test_empty_password(self):

self.assertFalse(is_valid_password())

def test_password_of_size_three(self):

self.assertFalse(is_valid_password(“pas”))

def test_password_of_size_ten(self):

self.assertFalse(is_valid_password(“Password12”))

self.assertTrue(is_valid_password(“Password1_”))

def test_password_of_size_twenty(self):

self.assertFalse(is_valid_password(“Password12Password_$”))

def test_password_with_invalid_special_character_semicolon(self):

self.assertFalse(is_valid_password(“Password1_;”))

self.assertFalse(is_valid_password(“Password1;”))

def test_password_with_no_digit(self):

self.assertFalse(is_valid_password(“Password_”))

def test_password_with_no_lowercase(self):

self.assertFalse(is_valid_password(“PASSWORD1_”))

def test_password_with_no_uppercase(self):

self.assertFalse(is_valid_password(“password1_”))

def test_password_without_valid_special_character(self):

self.assertFalse(is_valid_password(“Password1”))

def test_valid_password(self):

self.assertTrue(is_valid_password(“Password1_”))

self.assertTrue(is_valid_password(“PassWord34$”))

if __name__ == “__main__”:

unittest.main()

不是所有的测试都通过了。这些测试用例不应该通过——我们期望它们不会通过。所以当我们期待False我们得到True。某处存在缺陷或错误。

这些测试没有通过:

  • test_password_of_size_ten : self.assertFalse(is_valid_password("Password12"))应该是False因为即使大小有效,它也没有特殊字符。

  • test_password_without_valid_special_character : self.assertFalse(is_valid_password("Password1"))应该是False因为没有有效的特殊字符。

is_valid_password函数不检查是否存在有效的特殊字符。它检查无效字符,但不检查有效字符。这是由有缺陷的假设造成的,即只要密码不包含无效字符,它就包含有效字符(包括有效的特殊字符)。

重构is_valid_password

既然我们已经指出了我们的bug,我们应该做出改变并重新运行测试。

要进行的更改:

  • 在…里get_invalid_chars,我们有set有效的特殊字符,valid_chars。让我们让它对所有函数都是全局的(例如,把它从get_invalid_chars函数并将其放在函数的顶部)。为了确保某处没有损坏,运行测试(我们预计有两种情况会失败)。请注意,即使我们移动valid_chars由于get_invalid_chars , get_invalid_chars应该还能正常工作。

  • valid_chars是一个set,它可以用作中的一组get_invalid_chars . contains_character需要一段时间string sack作为论据。我们必须解析valid_chars如同string。让我们在下面创建一个函数get_invalid_chars返回一个string版本valid_chars

def get_valid_chars():

return “”.join(valid_chars)

进行测试。

  • 让我们检查中的有效字符is_valid_password通过在return True中的语句try封锁。

if not contains_character(new_password, get_valid_chars()):

return False

进行测试。现在,所有的测试都通过了。万岁!!👏️👏️👏️

  • 这更多的是重新排列代码is_valid_password在另一种环境中自然运行良好。我们将重新排列代码is_valid_password按此顺序分别为:size, lower case, upper case, digit, invalid special character and valid special character进行测试。

结论

is_valid_password会在app.py类似于下面的代码片段:

from string import (ascii_lowercase, ascii_uppercase, digits, punctuation,

whitespace)

valid_chars = {‘-’, ‘_’, ‘.’, ‘!’, ‘@’, ‘#’, ‘$’, ‘^’, ‘&’, ‘(’, ‘)’}

def contains_character(password: str = “”, sack: str = “”) -> bool:

has_char = False

for char in password:

if char in sack:

has_char = True

break

return has_char

def is_valid_size(password: str = “”) -> bool:

MIN_SIZE = 6

MAX_SIZE = 20

password_size = len(password)

return MIN_SIZE <= password_size <= MAX_SIZE

def get_invalid_chars():

invalid_chars = set(punctuation + whitespace) - valid_chars

return “”.join(invalid_chars)

def get_valid_chars():

return “”.join(valid_chars)

def is_valid_password(password: str = “”) -> bool:

try:

if not password:

return False

new_password = password.strip()

if not is_valid_size(new_password):

return False

if not contains_character(new_password, ascii_lowercase):

return False

if not contains_character(new_password, ascii_uppercase):

return False

if not contains_character(new_password, digits):

return False

if contains_character(new_password, get_invalid_chars()):

return False

if not contains_character(new_password, get_valid_chars()):

return False

return True

except:

return False

单元测试将会在test.py类似于下面的代码片段:

import unittest

from app import (contains_character, is_valid_size, is_valid_password)

class TestContainsCharacter(unittest.TestCase):

def test_empty_password_or_and_empty_sack(self):

self.assertFalse(contains_character())

def test_char_i_in_str_python(self):

self.assertFalse(contains_character(“i”, “python”))

def test_str_py_in_str_python(self):

self.assertTrue(contains_character(“py”, “python”))

def test_str_python_in_str_python(self):

self.assertTrue(contains_character(“python”, “python”))

class TestIsValidSize(unittest.TestCase):

def test_empty_password(self):

self.assertFalse(is_valid_size(“”))

def test_4_char_password(self):

self.assertFalse(is_valid_size(“pass”))

def test_6_char_password(self):

self.assertTrue(is_valid_size(“passwd”))

def test_16_char_password(self):

self.assertTrue(is_valid_size(“ThisIs1Password!”))

def test_20_char_password(self):

self.assertTrue(is_valid_size(“ThisIs1Password!/+20”))

def test_21_char_password(self):

self.assertFalse(is_valid_size(“ThisIs1Password!/+20&”))

class TestIsValidPassword(unittest.TestCase):

def test_empty_password(self):

self.assertFalse(is_valid_password())

def test_password_of_size_three(self):

self.assertFalse(is_valid_password(“pas”))

def test_password_of_size_ten(self):

self.assertFalse(is_valid_password(“Password12”))

self.assertTrue(is_valid_password(“Password1_”))

def test_password_of_size_twenty(self):

self.assertTrue(is_valid_password(“Password12Password_$”))

def test_password_with_invalid_special_character_semicolon(self):

self.assertFalse(is_valid_password(“Password1_;”))

self.assertFalse(is_valid_password(“Password1;”))

def test_password_with_no_digit(self):

self.assertFalse(is_valid_password(“Password_”))

如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值