程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

pytest和unittest区别

发布于2020-04-04 18:02     阅读(2831)     评论(0)     点赞(25)     收藏(4)


pytest插件地址
安装:pip install pytest
安装html报告的插件:pip install pytest -html

1.表达用例:

# unittest:
class TestA(unittest.TestCase):
	def test_01(self):
		print("1")
		
# pytest:
def test_a():
	print("a")
class TestA:
	def test_b(self)
		print("b")		

2.断言的表达

unittest:assertEqual()、assertTure()… pytest:assert
表达式(结果为Ture:断言成功,否则失败) - 表达式可以是逻辑/成员/比较/函数返回值

3.收集用例

unittest:TestLoader类/函数 + TestSuite、discover pytest:自动收集测试用例
pytest命令运行在哪,就从哪个目录下开始搜索用例

4.用例筛选:pytest - mark

给用例打个标记 - 设计用例的时候就打标记 - 有目的的

先注册标签名
1)pytest.ini文件 – 注释不能使用中文

[pytest]
markers =
	标签名1: miao shu xinxi
	标签名2
	demo

2)打标记范围:测试用例 测试类 模块文件

方法一:在测试用例上/测试类前面加:@pytest.mark.已注册的标签名

@pytest.mark.标记名
def test_aaa():
    print("aaa")
    assert True
    
@pytest.mark.标记名
class TestA:
    def test_bbb(self):
        print("bbb")
        assert 1 == 2

其他标记方法:

# 在测试类里,使用以下声明(测试类下,所有用例都被打上该标签):
class TestA(object):
	pytestmark = pytest.mark.已注册的标签名   # 单标签
	# pytestmark = [pytest.mark.标签1,pytest.mark.标签2] # 多标签模式
# 在模块文件里,同理(py文件下,所有测试函数和测试类里的函数,都有该标签)
import pytest
pytestmark = pytest.mark.已注册的标签名 # 单标签
# pytestmark = [pytest.mark.标签1,pytest.mark.标签2] # 多标签模式

def test_aaa():
    print("aaa")
    assert True
    
class TestA:
    def test_bbb(self):
        print("bbb")
        assert 1 == 2

5.运行:

执行顺序
a.文件名 - ASCII
b.文件内部 - 代码的先后顺序,从上到下

1.cmd -
目录下全部搜索用例: pytest -s -v
只运行标记的用例:pytest -m 标记 -s -v
2.运行某个模块下 pytest -m 标签名 -s -v 模块名
3.run.py

import pytest
pytest,main(["-s","-v","-m","标签名"])  # 选中的用例
pytest.main() # 收集到的全部

6.fixture前置后置

unittest:setUp&tearDown setupClass&teardownClass - 固定的名称
pytest:function(用例) -> class(测试类) -> Module(.py) -> Session(会话)

问题1:.怎么知道函数是一个前置后置
在函数前面: @pytest.fixtures

@pytest.fixtures()
def init():
	pass

问题2:.如何区分前置后置?
yield - 前后置分隔线

@pytest.fixtures()
def init():
	print("我是前置")
	a = 1
	yield
	print("我是后置")
	b = 2

问题3:作用域是什么?测试函数/类/模块/会话 ??定义作用域

@pytest.fixtures(scope=)
function:默认值 – unittest当中的setUp和teardowm
class:测试类 - unittest当中的setupclass和teardownclass
module:模块 —整个py文件
session:收集到的所有测试用例

问题4:测试用例当中如何调用前置后置?
注意:同时调用两个前置后置,需要这两个互不影响
在测试用例/类的前面 @pytest.mark.userfixtures(“定义fixture的名称”)

@pytest.fixtures()
def init():
	print("我是函数级别前置")
	a = 1
	yield
	print("我是函数别后置")
	b = 2

@pytest.fixture(scope="class")
def init1():
	print("我是类级别前置")
	c = 3
	yield
	print("我是类级别后置")
	d = 4

@pytest.mark.usefixtures("init")
def test_aaa():
    print("aaa")
# @pytest.mark.usefixtures("init") # 这个也可以
# @pytest.mark.usefixtures("init1")   # 作用于类下面的所有用例
class TestA:
    def test_bbb(self):
        print("bbb")
        
    def test_ccc(self):
    	print("ccc")

问题5:如何接收fixture的返回值?

# 返回前置中的变量
def init():
	yield 返回值
	yield 返回值多个  -- 元组 列表

接收返回值的方式
将fixture的函数名称,作为用例的参数 - 用例的参数 = 返回值
如果要使用fixture的返回值,用例一定要传参,然后可以不用@pytest.mark.usefixtures() - 会自己找
如果不使用fixture的返回值,测试用例要使用,必须声明@pytest.mark.usefixtures()

测试用例如果有参数:
1.数据驱动ddt
2.fixture的返回值

@pytest.fixtures()
def init():
	print("我是函数级别前置")
	a = 1
	yield a  -- 返回单个
	yield [a,b]  -- 返回多个,可以用元组/列表
	print("我是函数别后置")
	b = 2
	
@pytest.mark.usefixtures("init")  # 不使用返回值就需要声明
class TestA:
    def test_bbb(self):
        print("bbb")
     
    def test_ccc(self): 
    	print("ccc")

@pytest.mark.usefixtures("init")  # 使用返回值就不需要声明 -- 也可以声明不影响	
def test_aaa(self,init): # 使用返回值就不需要声明 --会自动找init
    print("aaa")
    c = a + 1
    print(c)
    
# 不用声明会自己找
def test_ddd(self,init[0]) 
	print("ddd")
	d = a + 1
	print(d)

总结:

fixture - 灵魂很自由。定义/调用
定义:申明pytest.fixture/yield区分前后置/作用域scope
1.测试用例文件当中定义
2.conftest.py当中定义 – 共享
…conftest.py定义的fixture – conftest.py所在的包下,所有的用例均可以。
…在不同的包下,可以创建自己的conftest.py

调用:测试用例/测试类
1.用例不需要使用fixture返回值:@pytest.mark.usefixtures("")
2.用例要使用fixture的返回值:
方式一:@pytest.mark.usefixtures("")。fixture函数名称作为用例参数。
方式二:fixture函数名称作为用例参数。
3.你需要的时候才调用。
4.如果测试类下面,所有的测试用例,都使用同一个函数级别的前置后置,
那么可以直接在类名上,申明调用:@pytest.mark.usefixtures(“函数级别的fixture”)

原文链接:https://blog.csdn.net/weixin_44941728/article/details/105299407



所属网站分类: 技术文章 > 博客

作者:以拯救苍生己任

链接:https://www.pythonheidong.com/blog/article/304949/8dce2cfc1efbd416c71a/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

25 0
收藏该文
已收藏

评论内容:(最多支持255个字符)