设为首页 加入收藏

TOP

Pytest 框架执行用例流程浅谈(一)
2023-09-09 10:25:45 】 浏览:158
Tags:Pytest 程浅谈

背景:

  根据以下简单的代码示例,我们将从源码的角度分析其中的关键加载执行步骤,对pytest整体流程架构有个初步学习。

代码示例:

import pytest

def test_add():

assert 1 + 1 == 2

def test_sub():

assert 2 - 1 == 1

  通过 pytest test_example.py 运行此代码示例后,会触发pytest的入口函数main(),这个函数定义在src/pytest/__main__.py中,它的作用是创建一个PytestConfig对象,并调用其

do_configure()和do_main()方法。PytestConfig对象是pytest的核心配置类,它负责解析命令行参数、读取配置文件、注册插件、创建Session对象等。PytestConfig对象定义在

src/_pytest/config/__init__.py中,它继承了pluggy.HookimplMarker类,也就是说它可以作为一个插件管理器,调用各种hook函数。

```python
# src/pytest/__main__.py

def main():
    # 创建PytestConfig对象
    config = PytestConfig()
    # 调用config.do_configure()方法
    config.do_configure()
    # 调用config.do_main()方法
    config.do_main()
```

```python
# src/_pytest/config/__init__.py

class PytestConfig(pluggy.HookimplMarker):
    def __init__(self):
        # 解析命令行参数
        self.parse_args()
        # 读取配置文件
        self.read_config_files()
        # 注册插件
        self.register_plugins()
        # 创建Session对象
        self.session = Session(self)
    
    def do_configure(self):
        # 调用hook函数pytest_configure
        self.hook.pytest_configure(config=self)
    
    def do_main(self):
        # 调用hook函数pytest_sessionstart
        self.hook.pytest_sessionstart(session=self.session)
        # 调用Session对象的main()方法
        self.session.main()
```
 

  Session对象是pytest的核心上下文类,它负责管理整个测试过程的信息,包括收集测试用例、执行测试用例、生成测试报告等。Session对象定义在src/_pytest/main.py中,它继承了

Collector类,也就是说它可以作为一个测试用例收集器。Session对象的main()方法是执行测试用例的主要入口,它会调用perform_collect()方法来收集测试用例,并返回一个列表items;然后

调用runtestloop()方法来循环执行items中的每个Item对象;最后调用hook函数pytest_sessionfinish来结束测试会话,并返回一个退出码exitstatus。

```python
# src/_pytest/main.py

class Session(Collector):
    def __init__(self, config):
        # 初始化一些属性和状态信息
    
    def main(self):
        # 调用perform_collect()方法收集测试用例,并返回items列表
        items = self.perform_collect()
        # 调用runtestloop()方法循环执行items中的每个Item对象,并返回退出码exitstatus
        exitstatus = self.runtestloop(items)
        # 调用hook函数pytest_sessionfinish来结束测试会话,并返回退出码exitstatus
        self.hook.pytest_sessionfinish(session=self, exitstatus=exitstatus)
        return exitstatus
    
    def perform_collect(self):
        # 调用hook函数pytest_collectstart表示开始收集测试用例
        self.hook.pytest_collectstart(collector=self)
        # 调用自身的collect()方法来递归遍历指定的测试文件或目录,并返回一个列表items
        items = self.collect()
        # 调用hook函数pytest_collectreport表示收集测试用例结束,并生成收集报告
        self.hook.pytest_collectreport(report=CollectReport(self, "passed", items))
        # 调用hook函数pytest_collection_modifyitems允许对收集到的Item对象进行修改
        self.hook.pytest_collection_modifyitems(session=self, config=self.config, items=items)
        # 调用hook函数pytest_deselected表示从收集到的Item对象中筛选出需要执行的Item对象
        self.hook.pytest_deselected(items=self.deselected)
        # 调用hook函数pytest_collection_finish表示收集和筛选测试用例完成,并返回最终要执行的Item对象列表
        self.hook.pytest_collection_finish(session=self)
        return items
    
    def runtestloop(self, items):
        # 调用hook函数pytest_runtestloop表示开始循环执行测试用例
        self.hook.pytest_runtestloop(session=self)
        # 遍历items列表,依次取出每个Item对象
        for item in items:
            # 调用Item对象的runtestprotocol()方法来执行单个测试用例的协议
            item.runtestprotocol()
        # 返回退出码0表示成功
        return 0
```

  

  Item对象是pytest的核心测试类,它负责封装和执行单个测试用例的信息,包括名称、位置、参数化信息、标记信息等。Item对象定义在src/_pytest/python.py中,它继承了Node类,也

就是说它可以作为一个测试节点。Item对象的runtestprotocol()方法是执行单个测试用例的主要入口,它会调用hook函数pytest_runtest_logstart来开始记录日志信息;然后调用runtest()方法

来执行测试用例的前置、主体

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Python条件控制和循环语句(if wh.. 下一篇【matplotlib基础】--画布

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目