如果通过单元测试,使用3测试功能

时间:2018-01-15 16:44:58

标签: python unit-testing passwords pycharm

我构建了一个简单的函数来控制密码是否具有:

我构建了一个简单的函数来检查密码是否包含:

  1. 至少一个大写字母
  2. 一个数字,
  3. 必须至少8个字符
  4. 功能是:

    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设置一个控件?

4 个答案:

答案 0 :(得分:3)

首先,validate可以只是一个根据需要返回TrueFalse的裸函数。

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"

然后,您可以通过提供将破坏其中一条规则的密码来检查这些分支。例如:abcdefgabcdefgh4bcdefgh4Bcdefgh

然后有另一种方法使用该函数,使它具有合理的返回值。

(有意见的说明:如果您先编写测试,则不会遇到此类问题,因为您已经设计好了易于测试的代码)

答案 3 :(得分:0)

你的方法非常奇怪,我想你更喜欢Java编程语言:

  1. 在Python中,您不需要编写函数的类。
  2. 你的功能不需要打印一些东西,这是一个打电话的问题。在您的案例中返回一些内容(TrueFalse)就足够了。
  3. None直接比较不是Pythonic方式。
  4. 在这种情况下,
  5. while True:break毫无意义。
  6. 如果您使用elif
  7. 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.pyTrue。一个例子:

    False