首页 > 解决方案 > 单元测试 Python

问题描述

在单元测试方面没有太多经验,有人可以帮助我复习或解释这里的预期。我知道单元测试的概念,但对操作功能感到困惑。

因此,例如,我有一个带有此的脚本。

def validateName(machineName):
    if machineName:
        pattern = "^[a-z][a-z\d-]+$$"
        if not re.match(pattern,machineName):
           return False 
    return True


def validateIp(inputIp):
    try:
        ipaddress.ip_address(inputIp)
    except ValueError as err:
        raise(err)  

所以对于我的 unittest 脚本,我有这样的东西:(忽略语法,我正在学习 unittest )

class TestValidateF(unittest.TestCase):
    def test_validateIpAddress(self):
        IPAdd = "10.75.10.98"
        if isinstance(IPAdd, str) == False:
            message="Error Parameter is empty or has an ivalidad format. Verify it does not star with hiphen "
        #self.assertTrue(ValideIPAdd(IPAdd),True)
            self.assertRaises(IPAdd, message)
    
def test_validateMachineName(self):
    sitename = "machineName"
    if isinstance(machineName, str) == False:
        message="Error Parameter is empty or has an ivalidad format."
    #self.assertTrue(machineName(machineName),True)
        self.assertRaises(machineName, message)

单元测试可以吗?

标签: pythonunit-testing

解决方案


首先要做的事情:我认为测试您的代码并熟悉类似unittest. 此外,最好每个测试用例只测试一件事。因此,总的来说,您走在正确的轨道上。

但是,在您的特殊情况下,我认为目前您没有用两个测试用例测试任何东西。

  1. 你把IpAddand设置machineNamestrings,但是添加一个if只有当这两个变量不是strings的时候才会执行的语句。因此,看起来self.assertRaises没有执行。

  2. assertRaises倾向于期望异常,在传递有效参数时往往不会引发异常。因此,在您提供的两种情况下,您的两个评论self.assertTrue(...)陈述往往更合理。


def test_validateIpAddress(self):
        IPAdd = "10.75.10.98"
        self.assertTrue(ValideIPAdd(IPAdd))
  1. 通过测试是否正确处理了无效参数,尝试覆盖所有多个路径。

def test_invalid_machine_name(self):
        machineName = '9-not_valid%' 
        self.assertFalse(machineName(machineName))
  1. 测试是否在您期望异常时引发异常:

def test_validateIpAddress(self):
        IPAdd = None
        with self.assertRaises(ValueError):
                ValideIPAdd(IPAdd)

关于如何编写测试用例的一些更一般的技巧,我个人认为可以在这里找到有用的地方。此外,我认为在学习过程中尽早熟悉mocks 和 patch是个好主意。它使测试用例更清晰,并允许您专注于代码的重要

我希望这对您未来的步骤有所帮助。


推荐阅读