【问题标题】:python unit testing for my password validation code [closed]python单元测试我的密码验证代码[关闭]
【发布时间】:2019-02-21 18:19:30
【问题描述】:

我有这个功能代码:

class PasswordChecker(object):

 passwords = ["aD23"]

 def check(self, passwords):
     if not passwords:
         raise NameError('You have not entered any password')
     else:
         pass

还有这个测试代码:

import unittest

from app.passwordchecker import PasswordChecker

class TestPasswordChecker(unittest.TestCase):
  def setUp(self):
    self.pswd = PasswordChecker()

  def test_password_checker_raises_nameerror_for_noargs(self):
    self.assertRaises(NameError, self.pswd.check, [])

我希望通过在self.assertRaises() 中将[] 替换为[items] 导致测试失败时,它应该抛出NameError - You have not entered any password。但是,它会引发不同的错误,这意味着我的代码有问题。请帮忙

【问题讨论】:

  • 这不是预期的结果吗? check 不做任何事情 if passwords,并引发 NameError if not passwords。如果你的断言中的列表有值,那么passwords 将是真实的,因此不会引发错误。
  • 您是否尝试过操作测试代码,使其产生一个带有我给它的参数的 NameError,即“您没有....?你会看到我的问题。
  • 当我运行这个测试时,它通过了。
  • 是的,它通过了,但现在根据它被定义为失败的方式让它失败
  • 当我通过['a'] 而不是[] 时,测试失败。您能否更清楚地了解您期望发生的事情?

标签: python python-3.x unit-testing tdd


【解决方案1】:

您看到的行为似乎是正确的:

self.assertRaises(NameError, self.pswd.check, [])

您调用 check 时使用空列表 not passwords 是 True 并引发 NameError。就测试而言,这是预期的行为,一切都很好。

现在,如果您将行更改为:

self.assertRaises(NameError, self.pswd.check, ['123'])

你会看到:

======================================================================
FAIL: test_password_checker_raises_nameerror_for_noargs (test_check.TestPasswordChecker)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/so/test_check.py", line 10, in test_password_checker_raises_nameerror_for_noargs
    self.assertRaises(NameError, self.pswd.check, ['123'])
AssertionError: NameError not raised

因为该方法运行并返回了None,但测试表明它预计会引发NameError 异常。

按原样,您的测试可能如下所示:

...
def test_password_checker_raises_nameerror_for_noargs(self):
    self.assertRaises(NameError, self.pswd.check, [])

def test_password_checker_returns_none_with_args(self):
    self.assertIsNone(self.pswd.check(['123']))
...

如果没有参数,我们预计会提高 NameError。通过传递的参数,我们期望返回 None。


旁注:NameError 具有尝试使用未知变量的通常含义。也许ValueError 会更合适。或者您可能想要定义自己的异常。

【讨论】:

  • 我刚刚注意到我以错误的方式未能通过测试,这就是我搞混的原因。我应该将异常更改为任何其他内置异常(例如 TypeError),以便引发 NameError。无论如何,谢谢。
猜你喜欢
  • 2013-05-05
  • 2010-09-09
  • 2016-02-23
  • 2019-04-28
  • 2015-07-23
  • 2014-03-08
  • 2014-01-06
  • 2011-05-23
  • 1970-01-01
相关资源
最近更新 更多