繁体   English   中英

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

[英]How to write correct Pytest test for my code?

我想为 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() 

您可以执行以下操作:

  • 单独测试checkEmailOk()函数如何检查电子邮件以及它为哪个电子邮件返回什么状态
  • 使用模拟和/或pytest-mock
    • 模拟checkEmailOk()并返回一个真值或假值
    • 模拟displaymessage()函数来检查它是否被调用,并检查它被调用的参数是什么assert_called_once_with()如果你要使用pytest-mock ,则使用assert_called_once_with()断言方法)

但是,总的来说,添加测试是一件非常好的事情,因为您在代码编写测试时实际上是在使用它 请注意为您的代码添加测试是多么容易和直接,如果您在检查某些用例时看到问题/复杂性,在添加测试时达到某些先决条件/行为,这可能是设计和可用性不佳的标志测试中的代码以及考虑重构/重构它的一个很好的理由

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

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

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 ")

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM