我构建了一个简单的函数来控制密码是否具有:
我构建了一个简单的函数来检查密码是否包含:
功能是:
import re
class Password():
def validate(password):
while True:
if len(password) < 8:
print("False")
elif re.search('[0-9]', password) is None:
print("False")
elif re.search('[A-Z]', password) is None:
print("False")
else:
print("Your password seems fine")
break
此功能保存在名为password.py
的文件中现在我想做一个控制每个条件的单元测试:
import Password
import unittest
class TestPassword(unittest.TestCase):
def test_password(self):
valid = Password.Password()
self.assertEqual("asdfA1qw",valid.validate())
if __name__ == '__main__':
unittest.main()
但我不知道怎么做。如何为每个if设置一个控件?
答案 0 :(得分:3)
首先,validate
可以只是一个根据需要返回True
或False
的裸函数。
def validate(password):
if len(password) < 8:
return False
elif re.search('[0-9]', password) is None:
return False
elif re.search('[A-Z]', password) is None:
return False
else:
return True
现在测试很简单:
import Password
import unittest
class TestPassword(unittest.TestCase):
def test_password(self):
self.assertTrue(Password.validate("asdfA1qw"))
def test_short_password(self):
self.assertFalse(Password.validate("foo"))
您可以使用各种无效密码定义单独的测试,以触发您的每个条件。 (一个密码太短,另一个没有任何数字,等等。)
在验证之前实际输入密码的任务不属于 validate
中的;它应该是一个单独的循环使用 validate
:
while True:
password = input("Enter a password: ")
if Password.validate(password):
break
print("Password invalid, try again", file=sys.stderr)
答案 1 :(得分:0)
您不能直接对每个if
语句设置控制权。您必须在测试函数中为valid.validate()
提供正确的值,以强制它进入正确的if
。
答案 2 :(得分:0)
如果您想正确测试您的功能,可以让它为每种情况返回一个单独的值:
def validate(password):
if len(password) < 8:
return 'password must have at least 8 characters'
elif re.search('[0-9]', password) is None:
return 'password must at least contain a numeric character'
elif re.search('[A-Z]', password) is None:
return 'password must aat least contain an upper case character'
else:
return "Your password seems fine"
然后,您可以通过提供将破坏其中一条规则的密码来检查这些分支。例如:abcdefg
,abcdefgh
,4bcdefgh
,4Bcdefgh
然后有另一种方法使用该函数,使它具有合理的返回值。
(有意见的说明:如果您先编写测试,则不会遇到此类问题,因为您已经设计好了易于测试的代码)
答案 3 :(得分:0)
你的方法非常奇怪,我想你更喜欢Java编程语言:
True
或False
)就足够了。None
直接比较不是Pythonic方式。while True:
和break
毫无意义。elif
,return
将毫无用处
醇>
所以重写就足够了
import re
def validate(password):
if len(password) < 8:
return False
if not re.search('[0-9]', password):
return False
if not re.search('[A-Z]', password):
return False
return True
现在,因为您的UnitTest可能在另一个模块而不是您测试的代码中(因为PyCharm以这种方式为您创建),您首先必须import password
- 因为您的测试函数位于{{1文件。
在UnitTest中,你必须定义一个测试类(就像你一样)和测试方法(就像你一样)。您可以根据需要在单个测试方法中定义尽可能多的测试,但更好的是为每个测试定义不同的测试方法。
在重构原始代码之后,测试自己(在您的测试方法中)将非常简单:我们将只测试返回值password.py
或True
。一个例子:
False