python - 单元测试 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)
单元测试可以吗?
解决方案
首先要做的事情:我认为测试您的代码并熟悉类似unittest
. 此外,最好每个测试用例只测试一件事。因此,总的来说,您走在正确的轨道上。
但是,在您的特殊情况下,我认为目前您没有用两个测试用例测试任何东西。
你把
IpAdd
and设置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)
关于如何编写测试用例的一些更一般的技巧,我个人认为可以在这里找到有用的地方。此外,我认为在学习过程中尽早熟悉mocks 和 patch是个好主意。它使测试用例更清晰,并允许您专注于代码的重要点。
我希望这对您未来的步骤有所帮助。
推荐阅读
- kotlin-multiplatform - 如何避免“附加到使用 kotlin/native 编译器编译的项目的库”错误?
- django - 基于类的视图中的外键分配
- java - 如何捕获从 Java (tomcat) 发送到 Oracle DB 的查询?
- mongodb - 与展开聚合,如何限制每个文档而不是全局?(mongodb)
- reactjs - 我在反应应用程序中收到错误“未在 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定的超时内调用异步回调”
- python - 在 python 的特定列表中正确放置结果的问题
- python - Python selenium 一个按钮不能被点击
- reactjs - Apollo graphql useMutation 会触发组件重新渲染
- css - 删除 div 的默认边框线
- angular - FormGroup 初始化问题