自动化测试用什么框架?Pytest框架 vs Unittest框架

前言

安装方式不同

unittest是python自带的库,不用安装
pytest是第三方单元测试库,需要安装(pip install pytest)

测试用例设计规则不同

unittest里面测试类需要继承unittest.TsetCase类,
且测试类必须有unittest.main()方法,
测试函数必须以”test_”开头

pytest不需要继承,可以是测试类,也可以是测试函数;
测试文件的文件名必须以”test_”开头,或者以”_test”结尾,
测试类命名必须以”Test”开头,测试函数名必须以”test”开头,
测试类里面不能使用”init”方法

测试用例执行方式不同

unittest,需要先用测试套件suite收集测试用例,然后使用TextTestRunner,最后去执行(run);

pytest,只要一个pytest.py文件,pytest.main()就可以自动收集用例去执行,会方便很多

参数化使用不同

unitest,使用参数化需要依赖第三方库,使用ddt去做参数化;

pytest,使用参数化是直接用parametrize实现参数化

测试报告使用方式不同

unittest,测试报告通过HTMLTestRunner生成,或者通过导入第三方库unittestreport生成;

pytest,通过pytest-html生成html格式报告,或者通过allure生成

夹具(前后置)使用方式不同

unittest,每个测试文件必须单独设置前后置
通过setUp每个用例执行前执行,tearDown每个用例执行后执行
通过setUpClass()类里面所有用例执行前执行,tearDownClass()类里面所有用例执行后执行,且必须添加@classmethod装饰器一起使用

pytest,创建conftest.py文件,当前目录下所有的测试文件都能自动调用该夹具;
通过@pytest.fixture()来声明为夹具,yield之前是为前置,yield之后为后置,并且可以用参数(scope)来设置夹具的作用域:
function:默认作用域,每一个函数或方法都会调用
class:每个测试类只执行一次
module:每个.py文件只调用一次
package:每个python包只执行一次
session:整个会话只执行一次,即运行项目时,整个过程只执行一次
在调用夹具的时候,直接当作参数把夹具名称传进去就可以了
可以设置自动调用,通过fixture设置参数autouse=True
因此Pytest的夹具会比unittest的夹具方便,简便的多

失败重运行

unittest不支持失败重运行;

pytest支持失败重运行,pytest --reruns=2(2表示重运行2次)

挑选用例执行

unittest不支持筛选用例执行

pytest支持标记用例执行
标记你需要运行的用例 @pytest.mark.smoke (smoke为自定义的名称,可以为其他)
运行用例, pytest -m “smoke”(命令行方式)或者pytest.main([“-m=smoke”]) (main方法使用)

断言方式

unittest 断言:
assertEqual(a, b) # 判断a和b是否相等
assertNotEqual(a, b) # 判断a不等于b
assertTrue(a) # 判断a是否为Ture
assertFalse(a) #判断a是否为False
assertIn(a, b) # a 包含在b里面
asserNotIn(a, b) # a 不包含在b里面

pytest 断言:
pytest只需要用assert 来断言就行,assert 后面加需要断言的条件就可以了,例如:assert a = = b # 判断a是否等于b、
assert a != b # 判断a不等于b、assert a in b # 判断b包含a

快速失败

unittest不支持快速失败;

pytest可以用例快速失败
通过命名pytest --x实现,一但用例失败即停止运行
也可以通过pytest --maxfail=10 失败多少次停止运行

从 unittest 迁移到 pytest

以下情况不能pytest与unittest不能混用:
当继承了unittest.TestCase之后,不能使用pytest的夹具和参数化,不然会报错

迁移策略:
1、先用 pytest 收集用例、运行用例,生成测试报告,以及使用 pytest 除了夹具和参数的其他特征,比如用例筛选特征,重复运行的特征,快速失败
2、 参数化, 换一个 @pytest.mark.parametrize()
3、夹具的迁移:
1)用一个独立的类来存储(涉及到其他的改动,不建议使用) ;
2) fixture(定义一个方法存放前后置,上面添加装饰器@pytest.fixture(scope=“class”));
3)setup_class() setup_method()(这个改动最小,只用更换方法名称就可以了,建议使用这个)

小结
Pytest 的语法简单直观,使得编写测试用例变得容易。与其他测试框架相比,学习曲线较平缓。
功能丰富:Pytest 提供了许多内置插件和扩展,可以支持各种不同类型的测试,包括功能测试、性能测试、并发测试等。
灵活性:Pytest 具有很高的灵活性,可以轻松地扩展和自定义测试过程,从而使其适应各种测试需求。
易于集成:Pytest 可以与其他 Python 库和工具很好地集成,如 Selenium、Appium、Docker、Jenkins 等,使得整个测试流程更加完整和自动化。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值