如何为我的代码编写正确的Pytest测试?

时间:2019-07-28 17:06:15

标签: python unit-testing oop object pytest

我想为handleEmail()创建2个测试: 1.电子邮件可以,没有任何错误 2.该函数引发消息电子邮件格式错误或重复

但是,我不知道该怎么做,因为它不返回任何内容。那么如何测试该功能呢?

class RegisterController:    
    def handleEmail(self):
        """get email from user, check email then display message
        """
        self.getEmail()
        status = self.model.checkEmailOk(self.email)
        if not status:
            message = "Email is either wrong format or duplicate"
            self.displaymessage(message)
            return self.handleEmail()

     def createAccount(self):
        self.handleEmail()
        self.handlePasswordValid() 

2 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

  • 分别测试checkEmailOk()函数如何检查电子邮件以及该电子邮件返回什么状态
  • 使用模拟和/或pytest-mock
    • 模拟checkEmailOk()并返回真实值或虚假值
    • 模拟displaymessage()函数来检查是否被调用,并检查是否调用了该参数(例如,如果要使用assert_called_once_with(),则使用pytest-mock断言方法)

不过,总的来说,添加测试确实是一件好事,因为在为其编写测试时实际上正在使用代码。只需注意为代码添加测试是多么容易和直接,并且,如果在检查某些用例时发现问题/复杂性,在添加测试时达到某些前提条件/行为,则可能表示设计和可用性不佳。测试中的代码,以及有充分的理由考虑对其进行重构/重构。

答案 1 :(得分:0)

您的方法可以返回状态(应该吗?)。然后,您可以断言该状态对于有效的电子邮件来说是正确的。

对于另一部分-引发异常:

import unittest
class MyTest(unittest.TestCase):
    def test_sample(self):
        with self.assertRaises(TypeError):
            c = "a" + 42
if __name__ == '__main__':
    unittest.main()

使用self.assertRaises(...),您可以告诉测试您将要做一些应该引起错误的事情。如果引发了异常,则测试通过(违反直觉,但可以进行测试)。因此,在上面添加带有int的字符串是TypeError,因为在python中没有定义带有int的字符串的加法定义。因此,该行引发TypeError异常。测试用例看到了异常,并且自从我告诉它将会发生,测试就通过了。

然后您应该在代码中引发一个异常,例如:

if not status:
    raise Exception(" Wrong email ")

理想情况下不会引发这样的泛型异常-您可能想创建一个自定义异常(或者如果您不知道/想获得泛型异常就好了,或者我在这里走得太远了)。