首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过单元测试用3测试函数

通过单元测试用3测试函数
EN

Stack Overflow用户
提问于 2018-01-15 16:44:58
回答 4查看 1.4K关注 0票数 0

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

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

  1. 至少有一个大写字母,
  2. 一个数字,
  3. 必须至少有8个字符长

其职能是:

代码语言:javascript
复制
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的文件中。

现在,我想做一个控制每个条件的单元测试:

代码语言:javascript
复制
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设置一个控件?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-01-15 16:52:20

首先,validate可以是一个只返回TrueFalse的空函数。

代码语言:javascript
复制
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

现在,这些测试是微不足道的:

代码语言:javascript
复制
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的单独循环。

代码语言:javascript
复制
while True:
    password = input("Enter a password: ")
    if Password.validate(password):
        break
    print("Password invalid, try again", file=sys.stderr)
票数 3
EN

Stack Overflow用户

发布于 2018-01-15 16:48:49

不能对每个if语句直接设置控件。您必须在测试函数中为valid.validate()提供正确的值,以迫使它进入正确的if

票数 0
EN

Stack Overflow用户

发布于 2018-01-15 17:07:57

如果您想正确地测试您的函数,您可以让它为每种情况返回一个单独的值:

代码语言:javascript
复制
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

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

(固执己见的注意:如果你先写测试,你不会遇到这样的问题,因为你已经用一种易于测试的方式来设计你的代码)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48267322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档