Python 自动化测试框架unittest与pytest的区别

def tearDown(self) -> None:
    print("tearDown结束")

# 每条用例执行前执行
@classmethod
def setUpClass(cls) -> None:
    print("setUpClass开始")

@classmethod
def tearDownClass(cls) -> None:
    print("tearDownClass结束")

# 测试用例
def test_001(self):
    print("测试用例001")

class TestFixtures02(unittest.TestCase):
def test_002(self):
print(“测试类2”)

每个模块执行前执行

def setUpModule():
“”"
在所有测试类在调用之前会被执行一次,函数名是固定写法,会被unittest框架自动识别
“”"
print(‘集成测试 >>>>>>>>>>>>>>开始’)
def tearDownModule():
print(“集成测试 >>>>>>>>>>>>>>结束”)

if name == ‘main’:
unittest.main()


运行结果:


![](https://img-blog.csdnimg.cn/img_convert/93a0562929f4fdf3e9157345488a14df.png)


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


接下来看pytest的前后置:


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


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


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


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


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


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




def setup_module():
print(‘\n整个模块 前 只运行一次’)

def teardown_module():
print(‘\n整个模块 后 只运行一次’)

def setup_function():
print(‘\n不在类中的函数,每个用例 前 只运行一次’)

def teardown_function():
print(‘\n不在类中的函数,每个用例 后 只运行一次’)

def test_ab():
b = 2
assert b < 3

def test_aba():
b = 2
assert b < 3

class Test_api():

def setup_class(self):
    print('\n此类用例 前 只执行一次')
def teardown_class(self):
    print('\n此类用例 后 只执行一次')

def setup_method(self):
    print('\n此类每个用例 前 只执行一次')

def teardown_method(self):
    print('\n此类每个用例 后 执行一次')

def test_aa(self):
    a = 1
    print('\n我是用例:a')       # pytest -s 显示打印内容
    assert a > 0

def test_b(self):
    b = 2
    assert b < 3

运行结果:


![](https://img-blog.csdnimg.cn/img_convert/6f31ee9c3ea2944e8fc5a269aacc81c0.png)


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


![](https://img-blog.csdnimg.cn/img_convert/83309a91f3766490ef13ac7b8952a61a.png)


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



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

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

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

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

import pytest

def test_one(login):
print(“登陆后,操作111”)

def test_two():

print(“操作222”)

def test_three(login):

print(“登陆后,操作333”)


运行结果:


![](https://img-blog.csdnimg.cn/img_convert/89fc8d5a68c70368eb895a92893929a9.png)


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



import pytest

def test_one(login):
print(“登陆后,操作111”)

def test_two(login,open_page):
print(“测试用例2”)

def test_three(open_page):
print(“测试用例3”)


运行结果:


![](https://img-blog.csdnimg.cn/img_convert/9919e48006b636bec9dd69cdee99d7e1.png)


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


#### 参数化区别


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


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


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


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


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



test_data = [1,2,3]

@ddt.ddt
class Testddt(unittest.TestCase):
@ddt.data(*test_data)
def test_001(self,get_data):
print(get_data)
if name == ‘main’:
unittest.main()


运行结果:


![](https://img-blog.csdnimg.cn/img_convert/6cc7f417d1fd0de7b7d6efefe9020de8.png)


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


实例:



@pytest.mark.parametrize(‘data’,[1,2,3])
class Testddt(object):

def test_001(self,data):
    print(data)

if name == ‘main’:
pytest.main([‘-sv’])


运行结果:


![](https://img-blog.csdnimg.cn/img_convert/45c2f974c5d840037e291d161c6d4d93.png)


### 总结


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值