大厂经验:第三方包Paramunittest参数化 VS Unittest内置参数化文本管理器subtest

大厂经验:第三方包Paramunittest参数化 VS Unittest内置参数化文本管理器subtest

代码解析

Paramunittest 核心逻辑

@paramunittest.parametrized(
    ('Testerr', 'test', 'Invalid Login or Password.', 'test_login_admin is passed'),
    ('Sam', 'test', 'Invalid Login or Password.', 'test_login_Sam is passed'),
    ('Tom', 'test', 'Invalid Login or Password.', 'test_login_Tom is passed')
)
class TestOder(unittest.TestCase, Oder):
    def setParameters(self, name, pwd, ass, txt):
        self.name = name
        self.pwd = pwd
        self.ass = ass
        self.txt = txt

    def test_login(self):
        self.get()
        self.login(self.name, self.pwd)
        sleep(2)
        assert self.element(self.invalid_login).text == self.ass
        print(self.txt)
实现步骤
  1. 参数化装饰器:通过@paramunittest.parametrized定义3组参数,每组包含用户名、密码、预期断言结果和日志文本。
  2. 参数映射setParameters方法将参数绑定到类属性。
  3. 测试执行test_login方法依次执行页面访问、登录操作,验证错误提示并输出结果。

subTest循环 核心逻辑

data = (
    {'name': 'Testerr', 'pwd': 'test', 'ass': 'Invalid Login or Password.', 'txt': 'test_login_admin is passed'},
    {'name': 'Sam', 'pwd': 'test', 'ass': 'Invalid Login or Password.', 'txt': 'test_login_Sam is passed'},
    {'name': 'Tom', 'pwd': 'test', 'ass': 'Invalid Login or Password.', 'txt': 'test_login_Tom is passed'}
)

class TestLogin(unittest.TestCase, Oder):
    def test_login(self):
        for d in data:
            with self.subTest(d):
                self.get()
                self.login(d['name'], d['pwd'])
                sleep(2)
                assert self.element(self.invalid_login).text == d['ass']
                print(d['txt'])
实现步骤
  1. 数据容器:通过data元组定义测试数据,每个元素为字典类型。
  2. 子测试循环:在test_login方法中使用subTest包裹循环体,每次迭代执行独立测试。
  3. 动态参数调用:直接从字典中提取参数执行登录操作和结果验证。

方法对比

维度paramunittestsubTest循环
代码可读性参数与用例分离,结构清晰数据集中管理,逻辑紧凑
测试报告每个参数组合生成独立测试条目所有子测试合并为一个方法条目
失败隔离性单条用例失败不影响其他参数执行单个子测试失败后,后续子测试仍继续执行
依赖项需第三方库paramunittest仅依赖标准库unittest
维护成本新增参数需修改装饰器新增参数只需扩展字典数据

大厂倾向性分析

更推荐 subTest 方案,原因如下:

  1. 零依赖:完全基于标准库实现,避免第三方库版本兼容问题。
  2. 原子性保障:即使某个子测试失败,其他子测试仍能完整执行。
  3. 团队协作友好:数据与逻辑分离的模式更符合主流测试框架设计思想(如Pytest)。

总结

  • 小型项目/快速验证paramunittest可提供更直观的测试报告。
  • 企业级应用subTest+数据驱动的模式在可维护性和稳定性上表现更优,是大厂主流选择。

完整代码

  • paramunittest 参数化
"""
Python :3.13.3
Selenium: 4.31.0
"""

import unittest
from time import sleep

import paramunittest
from chap3.po import *

# 处理 collections.Mapping 的兼容性问题
import collections

try:
    collections.Mapping
except AttributeError:
    import collections.abc

    collections.Mapping = collections.abc.Mapping


@paramunittest.parametrized(
    ('Testerr', 'test', 'Invalid Login or Password.', 'test_login_admin is passed'),
    ('Sam', 'test', 'Invalid Login or Password.', 'test_login_Sam is passed'),
    ('Tom', 'test', 'Invalid Login or Password.', 'test_login_Tom is passed')
)
class TestOder(unittest.TestCase, Oder):
    def setParameters(self, name, pwd, ass, txt):
        self.name = name
        self.pwd = pwd
        self.ass = ass
        self.txt = txt

    def test_login(self):
        self.get()
        self.login(self.name, self.pwd)
        sleep(2)
        assert self.element(self.invalid_login).text == self.ass
        print(self.txt)



if __name__ == '__main__':
    unittest.main()

  • subTest循环
"""
Python :3.13.3
Selenium: 4.31.0
"""


import unittest
from time import sleep
from chap3.po import *

data = (
    {'name': 'Testerr', 'pwd': 'test', 'ass': 'Invalid Login or Password.', 'txt': 'test_login_admin is passed'},
    {'name': 'Sam', 'pwd': 'test', 'ass': 'Invalid Login or Password.', 'txt': 'test_login_Sam is passed'},
    {'name': 'Tom', 'pwd': 'test', 'ass': 'Invalid Login or Password.', 'txt': 'test_login_Tom is passed'}
)

class TestLogin(unittest.TestCase, Oder):

    def test_login(self):
        for d in data:
            with self.subTest(d):
                self.get()
                self.login(d['name'], d['pwd'])
                sleep(2)
                assert self.element(self.invalid_login).text == d['ass']
                print(d['txt'])


if __name__ == '__main__':
    unittest.main()


「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值