Unittest自动化测试框架vs Pytest自动化测试框架

引言
  前面一篇文章Python单元测试框架介绍已经介绍了python单元测试框架,大家平时经常使用的是unittest,因为它比较基础,并且可以进行二次开发,如果你的开发水平很高,集成开发自动化测试平台也是可以的。而这篇文章主要讲unittest与pytest的区别,pytest相对unittest而言,代码简洁,使用便捷灵活,并且插件很丰富。

  Unittest vs Pytest
  主要从用例编写规则、用例的前置和后置、参数化、断言、用例执行、失败重运行和报告这几个方面比较unittest和pytest的区别:

  用例编写规则

 用例前置与后置条件

  断言

 测试报告

 失败重跑机制

 参数化

用例分类执行

  如果不好看,可以看下面表格:

 总体来说,unittest用例格式复杂,兼容性无,插件少,二次开发方便。pytest更加方便快捷,用例格式简单,可以执行unittest风格的测试用例,无须修改unittest用例的任何代码,有较好的兼容性。pytest插件丰富,比如flask插件,可用于用例出错重跑,还有xdist插件,可用于设备并行执行,效率更高。

  实例演示
  讲了七大区别,总要演示一下具体实例,用事实说话。

  前后置区别
  这里抽用例前置与后置的区别来讲,先看unittest的前后置使用:

  1. import unittest

  2. class TestFixtures01(unittest.TestCase):

  3. # 所有用例执行前执行

  4. def setUp(self) -> None:

  5. print("setUp开始")

  6. def tearDown(self) -> None:

  7. print("tearDown结束")

  8. # 每条用例执行前执行

  9. @classmethod

  10. def setUpClass(cls) -> None:

  11. print("setUpClass开始")

  12. @classmethod

  13. def tearDownClass(cls) -> None:

  14. print("tearDownClass结束")

  15. # 测试用例

  16. def test_001(self):

  17. print("测试用例001")

  18. class TestFixtures02(unittest.TestCase):

  19. def test_002(self):

  20. print("测试类2")

  21. # 每个模块执行前执行

  22. def setUpModule():

  23. """

  24. 在所有测试类在调用之前会被执行一次,函数名是固定写法,会被unittest框架自动识别

  25. """

  26. print('集成测试 >>>>>>>>>>>>>>开始')

  27. def tearDownModule():

  28. print("集成测试 >>>>>>>>>>>>>>结束")

  29. if __name__ == '__main__':

  30. unittest.main()

  运行结果:

从结果上得知, 三个方法的逻辑优先级: setUp()&tearDown() < setUpClass()&tearDownClass() < setUpModule()&tearDownModule()

接下来看pytest的前后置:

1、我们都知道在自动化测试中都会用到前后置,pytest 相比 unittest 无论是前后置还是插件等都灵活了许多,还能自己用 fixture 来定义。

首先了解一下,用例运行前后置级别如下:

  1.模块级:全局的,整个模块开只运行一次,优先于测试用例。

  2.类级别:定义在类里面,只针对此类生效。类似unittest的cls装饰器

  3.函数级:只对函数生效,类下面的函数不生效。

  4.方法级:定义在类里面,每个用例都执行一次

  1. def setup_module():

  2. print('\n整个模块 前 只运行一次')

  3. def teardown_module():

  4. print('\n整个模块 后 只运行一次')

  5. def setup_function():

  6. print('\n不在类中的函数,每个用例 前 只运行一次')

  7. def teardown_function():

  8. print('\n不在类中的函数,每个用例 后 只运行一次')

  9. def test_ab():

  10. b = 2

  11. assert b < 3

  12. def test_aba():

  13. b = 2

  14. assert b < 3

  15. class Test_api():

  16. def setup_class(self):

  17. print('\n此类用例 前 只执行一次')

  18. def teardown_class(self):

  19. print('\n此类用例 后 只执行一次')

  20. def setup_method(self):

  21. print('\n此类每个用例 前 只执行一次')

  22. def teardown_method(self):

  23. print('\n此类每个用例 后 执行一次')

  24. def test_aa(self):

  25. a = 1

  26. print('\n我是用例:a') # pytest -s 显示打印内容

  27. assert a > 0

  28. def test_b(self):

  29. b = 2

  30. assert b < 3

运行结果:

2、这是原始用法,下面看使用Fixture,Fixture 其实就是自定义 pytest 执行用例前置和后置操作,首先创建 conftest.py 文件 (规定此命名),导入 pytest 模块,运用 pytest.fixture 装饰器,默认级别为:函数级:

  其它用例文件调用即可,如下定义一个函数,继承 conftest.py 文件里的 login 函数即可调用:

  1. # conftest.py配置需要注意以下点:

  2. # conftest.py配置脚本名称是固定的,不能改名称

  3. # conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件

  4. # 不需要import导入 conftest.py,pytest用例会自动查找

  5. import pytest

  6. def test_one(login):

  7. print("登陆后,操作111")

  8. # def test_two():

  9. # print("操作222")

  10. #

  11. # def test_three(login):

  12. # print("登陆后,操作333")

运行结果:

3、扩展用法,多个自定义函数和全局级别展示:(全局的比如用于登录获取到token其他用例模块就不需要再登录了)

  1. import pytest

  2. def test_one(login):

  3. print("登陆后,操作111")

  4. def test_two(login,open_page):

  5. print("测试用例2")

  6. def test_three(open_page):

  7. print("测试用例3")

 运行结果:

细心的人应该可以知道,测试用例2并没有调用login函数,因为前置设置的是共享模式,类似全局函数。

  参数化区别
参数化应用场景,一个场景的用例会用到多条数据来进行验证,比如登录功能会用到正确的用户名、密码登录,错误的用户名、正确的密码,正确的用户名、错误的密码等等来进行测试,这时就可以用到框架中的参数化,来便捷的完成测试。

参数化 就是数据驱动思想,即可以在一个测试用例中进行多组的数据测试,而且每一组数据都是分开的、独立的。

unittest参数化其实是:ddt,叫数据驱动。

pytest数据驱动,就是参数化,使用@pytest.mark.parametrize

1.先看unittest如何进行参数化:

  1. test_data = [1,2,3]

  2. @ddt.ddt

  3. class Testddt(unittest.TestCase):

  4. @ddt.data(*test_data)

  5. def test_001(self,get_data):

  6. print(get_data)

  7. if __name__ == '__main__':

  8. unittest.main()

 运行结果:

2.pytest中参数化的用法

在测试用例的前面加上:
@pytest.mark.parametrize("参数名",列表数据)
参数名:用来接收每一项数据,并作为测试用例的参数。
列表数据:一组测试数据。

@pytest.mark.parametrize("参数1,参数2",[(数据1,数据2),(数据1,数据2)])
示例:
@pytest.mark.parametrize("a,b,c",[(1,3,4),(10,35,45),(22.22,22.22,44.44)])
def test_add(a,b,c):
res = a + b
assert res == c

实例:

  1. @pytest.mark.parametrize('data',[1,2,3])

  2. class Testddt(object):

  3. def test_001(self,data):

  4. print(data)

  5. if __name__ == '__main__':

  6. pytest.main(['-sv'])

运行结果:

总结

  以上就是unittest与pytest测试框架的区别,七大主要区别,这里已讲了两个区别的实例,其他五个有时间再补充,

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值