pytest-conftest.py作用范围
1.conftest.py解释
conftest.py是pytest框架里面一个很重要的东西,它可以在这个文件里面编写fixture,而这个fixture的作用就相当于我们unittest框架里面的setup()和teardown(),虽然pytest框架也有setup()和teardown()但是没必要写在用例里面,直接写在conftests.py里面就好了,这样更灵活,然后pytest框架会自动去找conftest.py这个文件里面的东西。
- conftest.py
1 import pytest- @pytest.fixture()
- def login():
- print("用例开始执行")
- yield #如果有返回值,可以在yield后面直接写返回值就好了,如果有多个直接用(返回值1,返回值2)
- print("用例执行完成")
2.目录结构
调用fixture有两种写法: 1.装饰器@pytest.mark.usefixtures("start") ; 2.直接在用例里面调用fixture装饰的方法当作参数输入def test_demo(self,start);3.设置fixture参数autouse=True
3.用例传fixture参数
1.项目跟目录下面的全局conftest.py
- import pytest
- @pytest.fixture()
- def start():
- print("\n全局conftest")
2.test_case_demo/conftest.py 和 test_demo.py
- conftest.py 代码
- 1 import pytest
- @pytest.fixture()
- def start_1():
- print("\n局部test_case_demo")
- test_demo.py 代码
- 1 import pytest
2 class Test_demo():- def test_demo(self,start,start_1): #标记代码
- assert 1==1
- if __name__ == '__main__':
- pytest.main(["-s","-v","test_demo.py"])
运行结果:
3.test_case_demo_2/conftest.py 和 test_demo_2.py
- conftest.py 代码
- 1 import pytest
- @pytest.fixture()
- def start_2():
- print("\n局部test_case_demo_2")
- test_demo_2.py 代码
1 import pytest
class Test_demo_2():- def test_demo_2(self,start,start_1): #标记代码
- assert 1==1
- if __name__ == '__main__':
- 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")
- 跟目录下的conftest.py 代码
1 import pytest- @pytest.fixture(scope="function")
- def start():
- print("\n全局conftest")
- @pytest.fixture()
- def iniv():
- print("\n全局iniv")
- test_demo.py 代码
- import pytest
- @pytest.mark.usefixtures("start") # 因为他们级别都是function,所以先运行iniv在运行start
- @pytest.mark.usefixtures("iniv")
- class Test_demo():
- def test_demo(self):
- assert 1==1
- def test_demo_1(self):
- assert 1==1
- if __name__ == '__main__':
- pytest.main(["-s","-v","test_demo.py"])
运行结果:start和iniv两个fixture都打印了
2)定义为@pytest.fixture(scope="class")
- #跟目录下的conftest.py 代码
- import pytest
- @pytest.fixture(scope="class") #这个是装饰类
- def start():
- print("\n我是一个装饰class的start")
- @pytest.fixture(scope="function") #这个是装饰用例
- def iniv():
- print("\n我是一个装饰function的iniv")
- import pytest
- @pytest.mark.usefixtures("start")
- @pytest.mark.usefixtures("iniv")
- class Test_demo():
- def test_demo(self):
- assert 1==1
- def test_demo_1(self):
- assert 1==1
- if __name__ == '__main__':
- pytest.main(["-s","-v","test_demo.py"])
运行结果:他会先运行start的在运行iniv的。因为start只是作用于class级别,而iniv是作用于function级别,所以start只需要执行一次,而iniv会有多少用例就运行多少次
3)定义为@pytest.fixture(scope="module")
- #跟目录下的conftest.py 代码
- import pytest
- @pytest.fixture(scope="module")
- def start():
- print("\n我是一个装饰module的start")
- @pytest.fixture(scope="function")
- def iniv():
- print("\n我是一个装饰function的iniv")
- #test_demo.py代码
- import pytest
- @pytest.mark.usefixtures("start")
- @pytest.mark.usefixtures("iniv")
- class Test_demo():
- def test_demo(self):
- assert 1==1
- def test_demo_1(self):
- assert 1==1
- @pytest.mark.usefixtures("start")
- @pytest.mark.usefixtures("iniv")
- class Test_demo_1():
- def test_demo(self):
- assert 1==1
- def test_demo_1(self):
- assert 1==1
- if __name__ == '__main__':
- 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")
- #跟目录下的conftest.py 代码
- import pytest
- @pytest.fixture(scope="session",autouse=True) #居然你是会话级别了,那么直接默认autouse=True就行了,不用调用就自动执行,或者不写autouse=True,直接在随便的,py用例文件里面调用以下就行了
- def start():
- print("\n我是一个装饰session的start")
- @pytest.fixture(scope="function")
- def iniv():
- print("\n我是一个装饰function的iniv")
- #test_demo.py代码
- import pytest
- @pytest.mark.usefixtures("iniv")
- class Test_demo():
- def test_demo(self):
- assert 1==1
- def test_demo_1(self):
- assert 1==1
- if __name__ == '__main__':
- 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
- 跟目录下的conftest.py 代码
- import pytest
- @pytest.fixture(autouse=True) #启用
- def start():
- print("\n全局conftest")
- @pytest.fixture(autouse=False) #不启用
- def iniv():
- print("\n全局iniv")
- import pytest
- #@pytest.mark.usefixtures("start") 这里注释掉了
- class Test_demo():
- def test_demo(self):
- assert 1==1
- def test_demo_1(self):
- assert 1==1
- if __name__ == '__main__':
- pytest.main(["-s","-v","test_demo.py"])
运行结果:结果还是调用了start
pytest-conftest.py作用范围的更多相关文章
- conftest.py作用范围
前言 一个测试工程下是可以有多个conftest.py的文件,一般在工程根目录放一个conftest.py起到全局作用.在不同的测试子目录也可以放conftest.py,作用范围只在该层级以及以下目录 ...
- pytest进阶之conftest.py
前言 前面几篇随笔基本上已经了解了pytest 命令使用,收集用例,finxture使用及作用范围,今天简单介绍一下conftest.py文件的作用和实际项目中如是使用此文件! 实例场景 首先们思考这 ...
- pytest文档25-conftest.py作用范围
前言 一个测试工程下是可以有多个conftest.py的文件,一般在工程根目录放一个conftest.py起到全局作用. 在不同的测试子目录也可以放conftest.py,作用范围只在该层级以及以下目 ...
- pytest框架: fixture之conftest.py
原文地址:https://blog.csdn.net/BearStarX/article/details/101000516 一.fixture优势1.fixture相对于setup和teardown ...
- 『德不孤』Pytest框架 — 14、Pytest中的conftest.py文件
目录 1.conftest.py文件介绍 2.conftest.py的注意事项 3.conftest.py的使用 4.不同位置conftest.py文件的优先级 5.conftest.py中Fixtu ...
- pytest自动化3:fixture之conftest.py实现setup
出处:https://www.cnblogs.com/yoyoketang/p/9390073.html 前言: 前面一篇讲到用例加setup和teardown可以实现在测试用例之前或之后加入一些操作 ...
- pytest 3.fixture介绍一 conftest.py
前言: 前面一篇pytest2 讲到用例加setup和teardown可以实现在测试用例之前或之后加入一些操作,但这种是整个脚本全局生效的,如果我想实现以下场景: 用例1需要先登录,用例2不需要登录, ...
- pytest文档5-fixture之conftest.py
前言 前面一篇讲到用例加setup和teardown可以实现在测试用例之前或之后加入一些操作,但这种是整个脚本全局生效的,如果我想实现以下场景: 用例1需要先登录,用例2不需要登录,用例3需要先登录. ...
- pytest执行用例时从conftest.py抛出ModuleNotFoundError:No module named 'XXX'异常的解决办法
一.问题描述 在项目根目录下执行整个测试用例,直接从conftest.py模块中抛出了ModuleNotFoundError:No module named 'TestDatas'的异常: 二.解决方 ...
- Pytest系列(6) - conftest.py的详细讲解
如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 什么是conftest.py 可以 ...
随机推荐
- 题解【洛谷P2668】[NOIP2015]斗地主
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的 $ A $ 到 $ K $ 加上大小王的共 $ 54 $ 张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据 ...
- Reading Comprehensive
我是红色 When I re-entered the full-time workforce a few years ago after a decade of solitary[隐士,独居] sel ...
- JavaWeb项目忘记添加依赖
有的时候我们建项目的时候忘记添加项目的依赖了,这里示范一个提示错误,就是 The superclass "javax.servlet.http.HttpServlet" was n ...
- 通过scrapy,从模拟登录开始爬取知乎的问答数据
这篇文章将讲解如何爬取知乎上面的问答数据. 首先,我们需要知道,想要爬取知乎上面的数据,第一步肯定是登录,所以我们先介绍一下模拟登录: 先说一下我的思路: 1.首先我们需要控制登录的入口,重写star ...
- js数组和对象
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 记一次if控制器的使用
1.添加if控制器 2.输入判断条件:常见的就是某个变量是不是等于某个值 3.或者用函数助手中的函数 每个版本jmeter函数助手的入口不同,我的直接在菜单上: 选择__jexl3,输入判断条件,点击 ...
- 1.4 Eclipse 自动补全功能
1.访问Content Assit 菜单项 window--preferences --Java---Editor--Content Assit 2. auto activation delay : ...
- 威佐夫博奕(Wythoff Game)poj 1067
有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 这种情况下是颇为复杂的.我们用(ak,bk)(ak ≤ bk ,k=0,1,2,…, ...
- Laravel Vuejs 实战:开发知乎 (5)设计问题表
1.执行命令: php artisan make:model Models/Question -cm 2.设计问题的数据库迁移文件中的字段: <?php use Illuminate\Datab ...
- Bootstrap环境安装加使用---开启Bootstrap 之旅
1.首先去Bootstrap官网https://getbootstrap.com/上下载Bootstrap 的最新版本 对应的中文页面如下: 下载自己所需要的版本(目前我自己下载的是编译的css和js ...