赞
踩
前言:上一期文章,我们讲解了unittest框架的核心及使用方式,今天我们再来介绍另外一个框架:Pytest
a) 主流框架:
unittest -python自带
pytest -三方库
nose -三方库
behava -BDD
b) 安装Pytest:
1.安装命令:pip install pytest
2.设置pychram编译为:pytest
3.删除历史运行,不然pytest运行不了
a) 具体使用
1.用例名称:
不可以有__init__() ,类下下面的方法也是如此
函数名,必须以 def test_开头
2.断言比对:
断言(实际和预期的对比 ) assert 表达式(True/False)
例子: assert random_num() == 7 我希望这个随机数是7
3.异常捕获:
AssertionError就代表用例失败
用例抛其他异常了
异常报错示例:
b) 编写用例及运行
用例示例:
- import pytest
-
-
- class TestDemo: #类名以Test开头,不然识别不了这个个用例类
-
- #这里不能写__init__初始化函数,因为这是个测试类
-
- def test_demo001(self): #函数名以Test开头,不然识别不用例
- """测试用例函数"""
- assert 1 == 1 #assert:pytest内置的断言方法 ——》 assert A == B 断言A是否等于B
-
- def test_demo002(self):
- """测试用例函数"""
- assert 1 == 2
-
- pytest.main()
c) pytest运行方式:
- 方法一:
-
- 把用例运行器修改成 pytest, 点击播放键运行
-
- 方法二:
-
- - 在当前目录下运行
- - 运行所有的用例:pytest.main() 或者 pytest
d) pytest运行结果图解:
1、收集目录:以rootdir作为根目录。从rootdir目录下开始搜索用例
2、文件名称以test_**.py 或者文件名以_test结果的py文件
3、文件下的用例过滤:.py下的函数,函数名以test_开头/.py下类里面的方法,方法名以test开头
a)概念
应用场景:场景流程是一样的,只有数据不一样。 --- 参数化
python测试框架当中应用数据驱动:
unittest: ddt库
pytest: 自带的。
b) 参数化的使用
@pytest.mark.parametrize("参数名",列表数据)------参数化函数
参数名:用来接收每一项数据,并作为测试用例的参数。
列表数据:多组测试数据。
代码示例:
- 示例:
- import pytest
- from .login import login_check
-
- datas = [
- {"user":'python37', "passwd": 'lemonban', "check": {"code": 0, "msg": "登录成功"} },
- {"user":'python37', "passwd": 'lemonban666', "check": {"code": 1, "msg": "账号或密码不正确"} },
- {"user": 'python370', "passwd": 'lemonban', "check": {"code": 1, "msg": "账号或密码不正确"}},
- {"user": None, "passwd": 'lemonban', "check": {"code": 1, "msg": "所有的参数不能为空"}},
- {"user": 'python37', "passwd": None, "check": {"code": 1, "msg": "所有的参数不能为空"}}
- ]
-
- class TestLogin:#定义类
-
- # @pytest.mark.parametrize 专门是pyttest做的数据驱动,应用场景:场景流程是一样的,只有数据不一样——————参数化
- @pytest.mark.parametrize("case",datas) #case任意取得,datas是你要传进来的数据
- def test_login(self,case):#这里需要用case来接收每一组数据,这个case名字要跟上面取得名字一致
- actual = login_check(case["user"],case["passwd"])
- assert actual == case["check"]
- import pytest
-
- test_data = [{"测试数据001"},{"测试数据002"},{"测试数据003"},{"测试数据004"},{"测试数据005"}] #做数据驱动的数据,列表嵌套字典的格式
-
-
- class TestDemo: #类名以Test开头,不然识别不了这个个用例类
- #这里不能写__init__初始化函数,因为这是个测试类
-
- @pytest.mark.parametrize("info", test_data) #@pytest.mark.parametrize(自定义变量名,用到的数据驱动名称,比如这里就是test_data)
- def test_demo001(self,info): #函数名以Test开头,不然识别不用例
- """测试用例函数"""
- print(info)
- assert 1 == 1 #assert:pytest内置的断言方法 ——》 assert A == B 断言A是否等于B
-
- pytest.main()
a) 前置/后置原理:
测试用例的:
前置操作(准备工作 - 准备环境/数据/资源...)、
后置操作(清理工作 -关闭环境/清理数据/释放资源...)
a1) fixtrue的语法
前置工作 - setup:
在每条测试用例执行之前,打印:一条测试用例开始执行
yield#用来区分前后置
前后置代码的分割代码,yield之前是前置代码,yield是后置代码
后置工作 - teardown
在每条测试用例执行之后,打印:一条测试用例执行结束
a2) fixtrue的定义
a3) 代码示例:@pytest.fixture()
- 例子:
- @pytest.fixture(autouse=True)
- def hello(self):
- #前置准备工作的代码
- print("一条用例开始执行了")
- print("66666666666666666")
- yield #前后置代码的分割代码,yield之前是前置代码,yield是后置代码
- #后置清理工作的代码
- print("一条用例执行结束了")
- print("99999999999999999")
b) 夹具的function作用域
fixture 作用域:
-function(测试函数-默认)、
-class(测试类)
-module(测试模块)、
-session(测试会话)----用scope="xxx"来设置fixture 作用域:
- 函数
- 类
- 模块
- 包
- session顺序:
session -> 包 -》 模块 -》 类 -》函数
同一级别,哪个在前,先执行
b1) autouse:调用前后置
@pytest.fixture(autouse=True)
autouse就是用来调用前后置的
b2) 调用fixture
在测试类/测试用例的名字上:
@pytest.mark.usefixtures("定义的fixtrue名字") ----支持调用多个
b3 ) yield 返回值
在定义的时候:yield 返回值
在调用的时候,将fixture的名字作为用例的参数,去接收返回值并使用
如果fixture作为用例参数时,那么我们在用例前面是可以不用 @pytest..mark.usefixtures
b4 ) fixture继承
"继承" fixture使用其它的fixture
@pytest.fixture(scope="class")
def class_fix():
# 前置准备工作的代码
print("-----测试类下的用例开始执行------")
yield#用来区分前后置
# 后置清理工作的代码
print("-----测试类下的用例执行结束------")
- @pytest.fixture
- def hello(class_fix):
- # 前置准备工作的代码
- print("打开浏览器,打开淘宝,登陆成功")
- yield
- # 后置清理工作的代码
- print("退出帐号,关闭浏览器")
-
- 执行顺序:
- class_fix的前置
- hello的前置
- hellor的后置
- class_fix的后置
-
- fixture1(fixture2) --fixture2的scope不能低于fixture1
b5 ) fixture共享机制(conftest)
注意点:conftest(名字固定不能改)一般在工程根目录放一个conftest.py起到全局作用 ——重点
共享机制:
定义的fixture,不同的.py里的测试用例,都可以调用。公共的地方:conftest.py(存放fixtures)
不需要测试用例.py文件去引入,pytest会自动找的。
(fixtures可以放在类里面、 .py里面、 conftest.py)用例当中如果调用了fixture,
那么,首先找自己所在的文件有没有
如果有,优先用自己的。
如果没有,则会去找同级目录下的conftest.py里有没有
如果同级没有,则会去上找一级目录下的conftest.py里有没有
...
一直到rootdir
—— 踩坑
a) Allure报告安装及配置环境变量
allure报告 - allure插件
1、要生成allure工具可以解析的测试结果文件
2、再用allure工具,将测试结果文件生成报告
3、 命令:pip install allure-pytest,安装的是allure命令行工具,不是allure工具
下载allure工具:https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/
MAC配置Allure环境变量:https://zhuanlan.zhihu.com/p/343497208https://zhuanlan.zhihu.com/p/343497208
Windows配置环境变量:https://www.cnblogs.com/Simple-Small/p/11512337.html
b) 再用allure工具,将测试结果文件生成报告
PS:测试结果文件的路径不能出错
命令:allure serve 测试结果文件的路径
在pytest执行用例的命令当中,添加:
--alluredir =路径(相对于rootdir)
html报告 -html插件
安装:
Windows命令:pip install pytest -html
Mac命令:python3 -m pip install pytest-html
生成报告:
- pytest命令加入参数: --html=报告路径(相对于rootdir)
-
-
- import pytest
- pytest.main(["-s","-v","--html=py37.html"])#在命令行运行pytest效果一样
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。