没有太多的单元测试经验,有人可以帮我复习一下,解释一下这里的期望。我知道unittest的概念,但对操作功能感到困惑。
例如,我有一个这样的脚本。
def validateName(machineName):
if machineName:
pattern = "^[a-z][a-zd-]+$$"
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)
fine是单位测试吗?
首先:我认为测试您的代码并熟悉unittest
之类的东西是一个好主意。另外,最好每个测试用例只测试一件事。因此,总的来说,你是在正确的轨道上。
然而,在你的特殊情况下,我认为目前你没有用你的两个测试用例测试任何东西。
-
您将
IpAdd
和machineName
设置为string
s,但添加if
语句,该语句仅在这两个变量不是string
s时执行。因此,看起来好像没有执行self.assertRaises
。 -
assertRaises
倾向于期望一个异常,当传递有效参数时往往不会引发异常。因此,在您提供的两种情况下,您的两个注释self.assertTrue(...)
语句往往更合理。
def test_validateIpAddress(self):
IPAdd = "10.75.10.98"
self.assertTrue(ValideIPAdd(IPAdd))
- 通过测试是否正确处理无效参数来尝试覆盖所有多个路径
def test_invalid_machine_name(self):
machineName = '9-not_valid%'
self.assertFalse(machineName(machineName))
- 测试当你期待异常时是否会引发异常:
def test_validateIpAddress(self):
IPAdd = None
with self.assertRaises(ValueError):
ValideIPAdd(IPAdd)
关于如何编写测试用例的更多通用技巧,我个人认为在这里可以找到有用的地方。此外,我认为在学习过程中尽早熟悉mock和补丁是个好主意。它使测试用例更清晰,并允许您将精力集中在您的代码的重点上。
我希望这对你今后的步骤有帮助。