当前位置:   article > 正文

Python下使用Pytest参数化+Fixture+Allure_pytest-bdd参数化

pytest-bdd参数化

        前言:上一期文章,我们讲解了unittest框架的核心及使用方式,今天我们再来介绍另外一个框架:Pytest

 

一、pytest安装

a) 主流框架:

unittest -python自带

pytest -三方库

nose -三方库

behava -BDD

b) 安装Pytest:

1.安装命令:pip install pytest

 2.设置pychram编译为:pytest

3.删除历史运行,不然pytest运行不了

 

 

二、pytest的使用

a) 具体使用

1.用例名称:

        不可以有__init__() ,类下下面的方法也是如此

        函数名,必须以 def test_开头

2.断言比对:        

        断言(实际和预期的对比 )  assert 表达式(True/False)

        例子:    assert  random_num() == 7   我希望这个随机数是7

3.异常捕获: 

           AssertionError就代表用例失败

           用例抛其他异常了

异常报错示例: 

b) 编写用例及运行

用例示例:

  1. import pytest
  2. class TestDemo: #类名以Test开头,不然识别不了这个个用例类
  3. #这里不能写__init__初始化函数,因为这是个测试类
  4. def test_demo001(self): #函数名以Test开头,不然识别不用例
  5. """测试用例函数"""
  6. assert 1 == 1 #assert:pytest内置的断言方法 ——》 assert A == B 断言A是否等于B
  7. def test_demo002(self):
  8. """测试用例函数"""
  9. assert 1 == 2
  10. pytest.main()

c) pytest运行方式: 

  1. 方法一:
  2. 把用例运行器修改成 pytest, 点击播放键运行
  3. 方法二:
  4. - 在当前目录下运行
  5. - 运行所有的用例:pytest.main() 或者 pytest

d) pytest运行结果图解: 

三、pytest收集用例的原理

1、收集目录:以rootdir作为根目录。从rootdir目录下开始搜索用例

2、文件名称以test_**.py  或者文件名以_test结果的py文件

3、文件下的用例过滤:.py下的函数,函数名以test_开头/.py下类里面的方法,方法名以test开头

四、pytest的数据驱动方式(DDT方式)

a)概念

应用场景:场景流程是一样的,只有数据不一样。 --- 参数化

python测试框架当中应用数据驱动:

unittest: ddt库
pytest:  自带的。

b) 参数化的使用

@pytest.mark.parametrize("参数名",列表数据)------参数化函数

        参数名:用来接收每一项数据,并作为测试用例的参数。

        列表数据:多组测试数据。

代码示例:

  1. 示例:
  2. import pytest
  3. from .login import login_check
  4. datas = [
  5. {"user":'python37', "passwd": 'lemonban', "check": {"code": 0, "msg": "登录成功"} },
  6. {"user":'python37', "passwd": 'lemonban666', "check": {"code": 1, "msg": "账号或密码不正确"} },
  7. {"user": 'python370', "passwd": 'lemonban', "check": {"code": 1, "msg": "账号或密码不正确"}},
  8. {"user": None, "passwd": 'lemonban', "check": {"code": 1, "msg": "所有的参数不能为空"}},
  9. {"user": 'python37', "passwd": None, "check": {"code": 1, "msg": "所有的参数不能为空"}}
  10. ]
  11. class TestLogin:#定义类
  12. # @pytest.mark.parametrize 专门是pyttest做的数据驱动,应用场景:场景流程是一样的,只有数据不一样——————参数化
  13. @pytest.mark.parametrize("case",datas) #case任意取得,datas是你要传进来的数据
  14. def test_login(self,case):#这里需要用case来接收每一组数据,这个case名字要跟上面取得名字一致
  15. actual = login_check(case["user"],case["passwd"])
  16. assert actual == case["check"]
  1. import pytest
  2. test_data = [{"测试数据001"},{"测试数据002"},{"测试数据003"},{"测试数据004"},{"测试数据005"}] #做数据驱动的数据,列表嵌套字典的格式
  3. class TestDemo: #类名以Test开头,不然识别不了这个个用例类
  4. #这里不能写__init__初始化函数,因为这是个测试类
  5. @pytest.mark.parametrize("info", test_data) #@pytest.mark.parametrize(自定义变量名,用到的数据驱动名称,比如这里就是test_data)
  6. def test_demo001(self,info): #函数名以Test开头,不然识别不用例
  7. """测试用例函数"""
  8. print(info)
  9. assert 1 == 1 #assert:pytest内置的断言方法 ——》 assert A == B 断言A是否等于B
  10. pytest.main()

 

五、pytest的前后置(fixtrue)

a) 前置/后置原理:

测试用例的:

                     前置操作(准备工作 - 准备环境/数据/资源...)、
                     后置操作(清理工作 -关闭环境/清理数据/释放资源...)

a1) fixtrue的语法

前置工作 - setup:

                     在每条测试用例执行之前,打印:一条测试用例开始执行

yield#用来区分前后置       

                     前后置代码的分割代码,yield之前是前置代码,yield是后置代码     

后置工作 - teardown

                     在每条测试用例执行之后,打印:一条测试用例执行结束

a2) fixtrue的定义

 a3) 代码示例:@pytest.fixture()

  1. 例子:
  2. @pytest.fixture(autouse=True)
  3. def hello(self):
  4. #前置准备工作的代码
  5. print("一条用例开始执行了")
  6. print("66666666666666666")
  7. yield #前后置代码的分割代码,yield之前是前置代码,yield是后置代码
  8. #后置清理工作的代码
  9. print("一条用例执行结束了")
  10. 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("-----测试类下的用例执行结束------")

  1. @pytest.fixture
  2. def hello(class_fix):
  3. # 前置准备工作的代码
  4. print("打开浏览器,打开淘宝,登陆成功")
  5. yield
  6. # 后置清理工作的代码
  7. print("退出帐号,关闭浏览器")
  8. 执行顺序:
  9. class_fix的前置
  10. hello的前置
  11. hellor的后置
  12. class_fix的后置
  13. 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

六、pytest的测试报告(Allure)

—— 踩坑

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)

 

七、pytest的测试报告(HTML)——不推荐,不好用,难看

html报告 -html插件

安装:

        Windows命令:pip install pytest -html

        Mac命令:python3 -m pip install pytest-html

生成报告:

  1. pytest命令加入参数: --html=报告路径(相对于rootdir)
  2. import pytest
  3. pytest.main(["-s","-v","--html=py37.html"])#在命令行运行pytest效果一样
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/143778
推荐阅读
相关标签
  

闽ICP备14008679号