- ```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
- ```