发布于2020-04-04 18:02 阅读(2831) 评论(0) 点赞(25) 收藏(4)
pytest插件地址
安装:pip install pytest
安装html报告的插件:pip install pytest -html
# 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")
unittest:assertEqual()、assertTure()… pytest:assert
表达式(结果为Ture:断言成功,否则失败) - 表达式可以是逻辑/成员/比较/函数返回值
unittest:TestLoader类/函数 + TestSuite、discover pytest:自动收集测试用例
pytest命令运行在哪,就从哪个目录下开始搜索用例
给用例打个标记 - 设计用例的时候就打标记 - 有目的的
先注册标签名
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
执行顺序
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() # 收集到的全部
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黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!