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
方法。
我們將測試:
-
對于空密碼
-
三個字符的密碼
-
十個字符的密碼
-
二十個字符的密碼
-
對于包含無效特殊字符(如分號)的密碼
-
對于沒有數(shù)字的密碼
-
對于沒有小寫字母的密碼
-
對于沒有大寫字母的密碼
-
對于沒有有效特殊字符的密碼
-
對于有效的密碼
-
一個尺寸以內(nèi),[6-20]
-
至少一個小寫和大寫字符
-
至少一個數(shù)字
-
沒有無效的特殊字符
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
函數(shù)不檢查是否存在有效的特殊字符。它檢查無效字符,但不檢查有效字符。這是由有缺陷的假設造成的,即只要密碼不包含無效字符,它就包含有效字符(包括有效的特殊字符)。
重構(gòu)is_valid_password
既然我們已經(jīng)指出了我們的bug,我們應該做出改變并重新運行測試。
要進行的更改:
-
在…里
get_invalid_chars
,我們有set
有效的特殊字符,valid_chars
。讓我們讓它對所有函數(shù)都是全局的(例如,把它從get_invalid_chars
函數(shù)并將其放在函數(shù)的頂部)。為了確保某處沒有損壞,運行測試(我們預計有兩種情況會失敗)。請注意,即使我們移動valid_chars
由于get_invalid_chars
?,?get_invalid_chars
應該還能正常工作。 -
這
valid_chars
是一個set
,它可以用作中的一組get_invalid_chars
?.?contains_character
需要一段時間string
?sack
作為論據(jù)。我們必須解析valid_chars
如同string
。讓我們在下面創(chuàng)建一個函數(shù)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
進行測試。現(xiàn)在,所有的測試都通過了。萬歲?。?????????
- 這更多的是重新排列代碼
is_valid_password
在另一種環(huán)境中自然運行良好。我們將重新排列代碼is_valid_password
按此順序分別為:size, lower case, upper case, digit, invalid special character and valid special character
進行測試。
結(jié)論
–
這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_”))
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):
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進入阿里一直到現(xiàn)在。
深知大多數(shù)Python工程師,想要提升技能,往往是自己摸索成長或者是報班學習,但對于培訓機構(gòu)動則幾千的學費,著實壓力不小。自己不成體系的自學效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年P(guān)ython開發(fā)全套學習資料》,初衷也很簡單,就是希望能夠幫助到想自學提升又不知道該從何學起的朋友,同時減輕大家的負擔。
既有適合小白學習的零基礎資料,也有適合3年以上經(jīng)驗的小伙伴深入學習提升的進階課程,基本涵蓋了95%以上前端開發(fā)知識點,真正體系化!
由于文件比較大,這里只是將部分目錄大綱截圖出來,每個節(jié)點里面都包含大廠面經(jīng)、學習筆記、源碼講義、實戰(zhàn)項目、講解視頻,并且后續(xù)會持續(xù)更新文章來源:http://www.zghlxwxcb.cn/news/detail-856575.html
如果你覺得這些內(nèi)容對你有幫助,可以掃碼獲?。。。。▊渥ython)文章來源地址http://www.zghlxwxcb.cn/news/detail-856575.html
-XVjOI2DA-1712508915378)]
既有適合小白學習的零基礎資料,也有適合3年以上經(jīng)驗的小伙伴深入學習提升的進階課程,基本涵蓋了95%以上前端開發(fā)知識點,真正體系化!
由于文件比較大,這里只是將部分目錄大綱截圖出來,每個節(jié)點里面都包含大廠面經(jīng)、學習筆記、源碼講義、實戰(zhàn)項目、講解視頻,并且后續(xù)會持續(xù)更新
如果你覺得這些內(nèi)容對你有幫助,可以掃碼獲?。。。。▊渥ython)

到了這里,關(guān)于Python中的自定義密碼驗證,對密碼驗證功能進行單元測試(1)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!