1.conftest.py解释

conftest.py是pytest框架里面一个很重要的东西,它可以在这个文件里面编写fixture,而这个fixture的作用就相当于我们unittest框架里面的setup()和teardown(),虽然pytest框架也有setup()和teardown()但是没必要写在用例里面,直接写在conftests.py里面就好了,这样更灵活,然后pytest框架会自动去找conftest.py这个文件里面的东西。

  1. conftest.py
    1 import pytest
  2. @pytest.fixture()
  3. def login():
  4. print("用例开始执行")
  5. yield #如果有返回值,可以在yield后面直接写返回值就好了,如果有多个直接用(返回值1,返回值2)
  6. print("用例执行完成")

2.目录结构

调用fixture有两种写法: 1.装饰器@pytest.mark.usefixtures("start") ; 2.直接在用例里面调用fixture装饰的方法当作参数输入def test_demo(self,start);3.设置fixture参数autouse=True

3.用例传fixture参数

1.项目跟目录下面的全局conftest.py

  1. import pytest
  2. @pytest.fixture()
  3. def start():
  4. print("\n全局conftest")

2.test_case_demo/conftest.py 和 test_demo.py

  1. conftest.py 代码
  2.  
  3. 1 import pytest
  4. @pytest.fixture()
  5. def start_1():
  6. print("\n局部test_case_demo")
  1. test_demo.py 代码
  2.  
  3. 1 import pytest
    2 class Test_demo():
  4. def test_demo(self,start,start_1): #标记代码
  5. assert 1==1
  6.  
  7. if __name__ == '__main__':
  8. pytest.main(["-s","-v","test_demo.py"])

运行结果:

3.test_case_demo_2/conftest.py 和 test_demo_2.py

  1. conftest.py 代码
  2.  
  3. 1 import pytest
  4. @pytest.fixture()
  5. def start_2():
  6. print("\n局部test_case_demo_2")
  1. test_demo_2.py 代码
    1 import pytest
    class Test_demo_2():
  2. def test_demo_2(selfstart,start_1): #标记代码
  3. assert 1==1
  4.  
  5. if __name__ == '__main__':
  6. pytest.main(["-s","test_demo_2.py","-v"])

运行结果可以看出,start起到全局作用,test_case_demo目录下的start_1不管它的运行级别是什么,也只能在test_case_demo下面被调用。
test_demo_2用例不能跨模块调用test_case_demo模块下的start_1,所以test_demo_2用例会运行失败

4.装饰器usefixtures

fixture有 function(默认选),class,module,session,四个级别

一.只有一个.py用例文件

1)定义为@pytest.fixture(scope="function")

  1. 跟目录下的conftest.py 代码
    1 import pytest
  2. @pytest.fixture(scope="function")
  3. def start():
  4. print("\n全局conftest")
  5.  
  6. @pytest.fixture()
  7. def iniv():
  8. print("\n全局iniv")
  1. test_demo.py 代码
  1. import pytest
  2. @pytest.mark.usefixtures("start") # 因为他们级别都是function,所以先运行iniv在运行start
  3. @pytest.mark.usefixtures("iniv")
  4. class Test_demo():
  5. def test_demo(self):
  6. assert 1==1
  7. def test_demo_1(self):
  8. assert 1==1
  9.  
  10. if __name__ == '__main__':
  11. pytest.main(["-s","-v","test_demo.py"])

运行结果:start和iniv两个fixture都打印了

2)定义为@pytest.fixture(scope="class")

  1. #跟目录下的conftest.py 代码
  2. import pytest
  3. @pytest.fixture(scope="class") #这个是装饰类
  4. def start():
  5. print("\n我是一个装饰class的start")
  6.  
  7. @pytest.fixture(scope="function") #这个是装饰用例
  8. def iniv():
  9. print("\n我是一个装饰function的iniv")
  1. import pytest
  2. @pytest.mark.usefixtures("start")
  3. @pytest.mark.usefixtures("iniv")
  4. class Test_demo():
  5. def test_demo(self):
  6. assert 1==1
  7. def test_demo_1(self):
  8. assert 1==1
  9.  
  10. if __name__ == '__main__':
  11. pytest.main(["-s","-v","test_demo.py"])

运行结果:他会先运行start的在运行iniv的。因为start只是作用于class级别,而iniv是作用于function级别,所以start只需要执行一次,而iniv会有多少用例就运行多少次

3)定义为@pytest.fixture(scope="module")

  1. #跟目录下的conftest.py 代码
  2. import pytest
  3. @pytest.fixture(scope="module")
  4. def start():
  5. print("\n我是一个装饰module的start")
  6.  
  7. @pytest.fixture(scope="function")
  8. def iniv():
  9. print("\n我是一个装饰function的iniv")
  1. #test_demo.py代码
  2. import pytest
  3. @pytest.mark.usefixtures("start")
  4. @pytest.mark.usefixtures("iniv")
  5. class Test_demo():
  6. def test_demo(self):
  7. assert 1==1
  8. def test_demo_1(self):
  9. assert 1==1
  10. @pytest.mark.usefixtures("start")
  11. @pytest.mark.usefixtures("iniv")
  12. class Test_demo_1():
  13. def test_demo(self):
  14. assert 1==1
  15. def test_demo_1(self):
  16. assert 1==1
  17.  
  18. if __name__ == '__main__':
  19. pytest.main(["-s","-v","test_demo.py"])

运行结果:他会先运行start的在运行iniv的。因为start只是作用于module级别,而iniv是作用于function级别,虽然我们在test_demo.py里面装饰了两次start,但是因为它是装饰模块的,并且也只有test_demo.py这个一个模块,所以start只需要执行一次,而iniv会有多少用例就运行多少次

4)定义为@pytest.fixture(scope="session")

  1. #跟目录下的conftest.py 代码
  2. import pytest
  3. @pytest.fixture(scope="session",autouse=True) #居然你是会话级别了,那么直接默认autouse=True就行了,不用调用就自动执行,或者不写autouse=True,直接在随便的,py用例文件里面调用以下就行了
  4. def start():
  5. print("\n我是一个装饰session的start")
  6.  
  7. @pytest.fixture(scope="function")
  8. def iniv():
  9. print("\n我是一个装饰function的iniv")
  1. #test_demo.py代码
  2. import pytest
  3. @pytest.mark.usefixtures("iniv")
  4. class Test_demo():
  5. def test_demo(self):
  6. assert 1==1
  7. def test_demo_1(self):
  8. assert 1==1
  9.  
  10. if __name__ == '__main__':
  11. pytest.main(["-s","-v","test_demo.py"])

运行结果:他会先运行start的在运行iniv的。因为start只是作用于session级别,而iniv是作用于function级别,而且我们直接autouse=True,所以不用调用也会执行,而且start只需要执行一次,而iniv会有多少用例就运行多少次

二.多个.py用例文件(这里不展示代码,自己去实践吧)

多个.py用例文件,其实运行结果:

1)function级别:有多少用例就运行多少次。

2)class级别:装饰多少个类上面的,那么一个就运行多少次,例如一个.py用例里面有两个类,都装饰了class级别的,那么就运行两次,如果有两个.py用例文件都有两个类,都装饰了class级别,那么就运行四次。

3)module级别:如果有一个.py用例文件,那么就运行一次module级别,如果有两个.py用例文件,那么就运行两次。

4)session级别:不管有多少个.py用例文件,始终就运行一次

5.设置autouse=True  (这种不建议,因为你不调用它,它始终就会运行)

fixture默认autouse=False

  1.  
  1. 跟目录下的conftest.py 代码
  1. import pytest
  2. @pytest.fixture(autouse=True) #启用
  3. def start():
  4. print("\n全局conftest")
  5.  
  6. @pytest.fixture(autouse=False) #不启用
  7. def iniv():
  8. print("\n全局iniv")
  1. import pytest
  2. #@pytest.mark.usefixtures("start") 这里注释掉了
  3. class Test_demo():
  4. def test_demo(self):
  5. assert 1==1
  6. def test_demo_1(self):
  7. assert 1==1
  8. if __name__ == '__main__':
  9. pytest.main(["-s","-v","test_demo.py"])

运行结果:结果还是调用了start

pytest-conftest.py作用范围的更多相关文章

  1. conftest.py作用范围

    前言 一个测试工程下是可以有多个conftest.py的文件,一般在工程根目录放一个conftest.py起到全局作用.在不同的测试子目录也可以放conftest.py,作用范围只在该层级以及以下目录 ...

  2. pytest进阶之conftest.py

    前言 前面几篇随笔基本上已经了解了pytest 命令使用,收集用例,finxture使用及作用范围,今天简单介绍一下conftest.py文件的作用和实际项目中如是使用此文件! 实例场景 首先们思考这 ...

  3. pytest文档25-conftest.py作用范围

    前言 一个测试工程下是可以有多个conftest.py的文件,一般在工程根目录放一个conftest.py起到全局作用. 在不同的测试子目录也可以放conftest.py,作用范围只在该层级以及以下目 ...

  4. pytest框架: fixture之conftest.py

    原文地址:https://blog.csdn.net/BearStarX/article/details/101000516 一.fixture优势1.fixture相对于setup和teardown ...

  5. 『德不孤』Pytest框架 — 14、Pytest中的conftest.py文件

    目录 1.conftest.py文件介绍 2.conftest.py的注意事项 3.conftest.py的使用 4.不同位置conftest.py文件的优先级 5.conftest.py中Fixtu ...

  6. pytest自动化3:fixture之conftest.py实现setup

    出处:https://www.cnblogs.com/yoyoketang/p/9390073.html 前言: 前面一篇讲到用例加setup和teardown可以实现在测试用例之前或之后加入一些操作 ...

  7. pytest 3.fixture介绍一 conftest.py

    前言: 前面一篇pytest2 讲到用例加setup和teardown可以实现在测试用例之前或之后加入一些操作,但这种是整个脚本全局生效的,如果我想实现以下场景: 用例1需要先登录,用例2不需要登录, ...

  8. pytest文档5-fixture之conftest.py

    前言 前面一篇讲到用例加setup和teardown可以实现在测试用例之前或之后加入一些操作,但这种是整个脚本全局生效的,如果我想实现以下场景: 用例1需要先登录,用例2不需要登录,用例3需要先登录. ...

  9. pytest执行用例时从conftest.py抛出ModuleNotFoundError:No module named 'XXX'异常的解决办法

    一.问题描述 在项目根目录下执行整个测试用例,直接从conftest.py模块中抛出了ModuleNotFoundError:No module named 'TestDatas'的异常: 二.解决方 ...

  10. Pytest系列(6) - conftest.py的详细讲解

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 什么是conftest.py 可以 ...

随机推荐

  1. 在Linux服务器上安装Python3.7

    我的Linux版本是CentOS 6,自带2.7版本的Python.源码安装和系统中默认存在的Python不冲突. 1.在Python官网下载源码包,进入官网https://www.python.or ...

  2. 洛谷P1433 吃奶酪

    #include<iostream> #include<math.h> using namespace std ; ; int n; bool st[N]; double x[ ...

  3. 阿里云的maven仓库 地址

    <mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name&g ...

  4. Linux - Shell - #!/bin/bash

    概述 简单解释一下 shell 脚本卡头的 #!/bin/bash 水一篇, 少一篇 背景 shell 脚本中的注释 通常是 以# 卡头的行 但是有时候执行 shell 的时候, 会有这种内容 #!/ ...

  5. Django_静态文件/中间件/分页

    1. 静态文件配置 2. 中间件 在不修改源代码的前提下,动态的逻辑控制代码执行(装饰器) 2.1 切入函数 2.2 自定义中间件 中奖 访问限制 2.3 分页 paginator 常见错误

  6. Customized Mini LED Keychain For Better Brand Identity

    Looking for products that tell people the brand name? Then you'll find an affordable product that wi ...

  7. codeforce D. Shortest Cycle(floyd求最短环)

    题目链接:http://codeforces.com/contest/1206/problem/D 给n个点,如果点a[ i ] &a[ j ] 不为0,则点a[ i ] 和 a[ j ] 直 ...

  8. 共有T个硬币,其中Z个正面,F个反面,分为两堆,要如何操作使得两堆中的正面硬币数目相等。

    类似题目如下(数值是可变化的) 你的面前有30个硬币,其中有10个正面朝上,20个反面朝上,混乱在一团. 要求:现在用厚布遮住你的眼睛.要你把30个硬币分成2团,每团正面朝上的硬币个数相等.问:你要怎 ...

  9. python面向对象封装案例2

    封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对象,然后 让对象调用方法 对象方法的细节 都被 封装 在 类 ...

  10. 转载: HDMI 基础知识

    转自:http://www.cnblogs.com/TaigaCon/p/3840653.html HDMI,全称为(High Definition Multimedia Interface)高清多媒 ...