pytest 教程

本文详细介绍了pytest的安装与使用,包括基本测试用例规则、运行方式、项目结构管理、参数详解、异步测试、默认执行顺序和pytest.ini配置。还探讨了如何通过命令行参数和pytest.ini文件定制测试执行行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 安装pytest

目前我使用的python版本是3.10.8

pip install pytest命令会安装下面的包:

exceptiongroup-1.2.0-py3-none-any.whl
iniconfig-2.0.0-py3-none-any.whl
packaging-23.2-py3-none-any.whl
pluggy-1.4.0-py3-none-any.whl
pytest-8.0.2-py3-none-any.whl
tomli-2.0.1-py3-none-any.whl

2. 初步尝试

2.1 使用pytest,默认的测试用例的规则以及基础应用

  1. 模块名必须以test_开头或者_test结尾
  2. 测试类必须以Test开头,并且不能有init方法。
  3. 测试方法必须以test开头

在这里插入图片描述
init.py内容为空,
test_login.py内容如下:

import pytest
class TestLogin:
    def test_01_baili(self):
        print('测试百里')
if __name__ == '__main__':
    pytest.main(['-s'])

2.2 运行方式

用python运行这个test_login.py输出结果如下:
在这里插入图片描述

或者在pytest_rutorial目录下,命令行执行pytest也可以成功运行。

2.3 下面对项目结构修改

在这里插入图片描述
init.py为空文件。
test_login.py内容如下:

class TestLogin:
    def test_01_baili(self):
        print('测试百里')

test_product.py内容如下:

class TestProduct:
    def test_02_xingyao(self):
        print('测试星瑶')

all.py内容如下:

import pytest

if __name__ == '__main__':
    pytest.main(['-sv'])

运行all.py输出如下:
在这里插入图片描述
发现自动运行了test_product.pytest_login.py文件的内容。

2.4 参数详解

pytest.main()中可以有很多参数选项:

  • -s:表示输出测试方法里面的调试信息,包括print()
  • -v:表示输出了详细的模块名、类名、模块名
  • -x:如果有失败的,则停止运行

pytest.main(['-vs','test_product.py'])则会仅运行test_product.py文件的测试。

3 测试不同的项目

目录结构如下:
在这里插入图片描述
tutorial_1表示第一个项目,tutorial_2表示第二个项目,两个项目中的**init.py**文件内容都是空的。

test_login.py内容如下:

class TestLogin:
    def test_01_baili(self):
        print('测试百里')

test_product.py内容如下:

class TestProduct:
    def test_02_xingyao(self):
        print('测试星瑶')

test_web.py内容如下:

class TestWeb:
    def test_03_interface(self):
        print('测试接口')

all.py内容如下:

import pytest

if __name__ == '__main__':
    pytest.main(['-sv'])

运行all.py会输出如下:
在这里插入图片描述
也可以仅测试一个用例,修改all.py

import pytest

if __name__ == '__main__':
    pytest.main(['-sv', './tutorial_2'])

运行all.py,输出:
在这里插入图片描述

这样就仅仅执行tutorial_2下的测试用例了。

3.1 如何执行test_web.py下的某一个函数而不是类中的方法

test_web.py内容如下:

def test_04_interface():
    print('函数')
class TestWeb:
    def test_03_interface(self):
        print('测试接口')

如果我只想执行test_04_interface函数如何做?

解决办法:

修改all.py内容:

import pytest

if __name__ == '__main__':
    pytest.main(['-sv', './tutorial_2/test_web.py::test_04_interface'])

在这里插入图片描述
这就可以指定函数来进行测试了。

同理,也可以通过这个方式来指定某个类下的某个方法,例如:

import pytest

if __name__ == '__main__':
    pytest.main(['-sv', './tutorial_2/test_web.py::TestWeb::test_03_interface'])

就会执行TestWeb类下面的test_03_interface方法。

3.2 异步测试

如果某一个测试用例非常耗时,那么就会阻塞。解决办法就是异步进行。

新建文件夹tutorial_3,新建文件test_web3.py内容如下:

import time

class TestWeb3:
    def test_03_interface_1(self):
        time.sleep(3)
        print('第一个接口')
    def test_03_interface_2(self):
        time.sleep(3)
        print('第二个接口')

all.py内容如下:

import pytest

if __name__ == '__main__':
    pytest.main(['-sv', './tutorial_3'])

运行all.py输出如下:
在这里插入图片描述
可以看到用了6.03秒的时间。先执行了第一个接口,然后顺序执行第二个接口。

因此可以使用pytest中的多线程来执行。但是需要安装pytest-xdist

首先执行pip install pytest-xdist,这个插件需要如下两个包:

execnet-2.0.2-py3-none-any.whl 
pytest_xdist-3.5.0-py3-none-any.whl

然后修改all.py内容:


import pytest

if __name__ == '__main__':
    pytest.main(['-sv', './tutorial_3', '-n=2'])

这里的-n=2表示利用两个线程来执行。输出结果如下:
在这里插入图片描述
发现执行时间减少了。

4. 默认执行顺序

pytest默认的执行顺序是从上到下执行的。

例如下面的test_web3.py文件内容如下:

import time

class TestWeb3:
    def test_03_interface_1(self):
        time.sleep(3)
        print('第一个接口')
    def test_03_interface_3(self):
        time.sleep(3)
        print('第三个接口')
    def test_03_interface_2(self):
        time.sleep(3)
        print('第二个接口')

all.py内容如下:


import pytest

if __name__ == '__main__':
    pytest.main(['-sv', './tutorial_3'])

执行all.py输出结果如下:
在这里插入图片描述

4.1 修改执行顺序

要想修改执行顺序,需要安装pytest-ordering库,执行pip install pytest-ordering,需要的包:pytest_ordering-0.6-py3-none-any.whl

修改test_web3.py内容:

import time
import pytest

class TestWeb3:
    @pytest.mark.run(order=2)
    def test_03_interface_1(self):
        time.sleep(3)
        print('第一个接口')
    @pytest.mark.run(order=1)
    def test_03_interface_3(self):
        time.sleep(3)
        print('第三个接口')
    @pytest.mark.run(order=3)
    def test_03_interface_2(self):
        time.sleep(3)
        print('第二个接口')

all.py内容如下:


import pytest

if __name__ == '__main__':
    pytest.main(['-sv', './tutorial_3'])

执行all.py输出如下:
在这里插入图片描述

5. 通过读取pytest.ini全局配置文件运行

pytest.ini这个文件它是pytest单元测试框架的核心配置文件。

  1. pytest.ini文件位置:一般放在项目的根目录
  2. 作用:改变pytest默认的行为。
  3. 运行的规则;不管是主函数的模式运行,命令行模式运行,都会去读取这个配置文件。

pytest.ini文件格式样例

[pytest]
addopts=-vs #命令行的参数,用空格分隔
testpaths=./pytest_tutorial #测试用例的路径
python_files=test_*.py #模块名的规则
python_classes=Test* #类名的规则
python_functions= test #方法名的规则

6. 分组执行

Python中,pytest是一个用于编写和运行测试的框架。它提供了丰富的功能和灵活的语法,使得编写和管理测试变得更加简单和高效。以下是一个简单的pytest教程,帮助您入门: 1. 安装pytest: 您可以使用pip命令安装pytest框架。打开终端或命令提示符,并执行以下命令: ``` pip install pytest ``` 2. 编写测试函数: 在您的项目中创建一个测试文件(通常以`test_`开头),并在其中定义测试函数。每个测试函数应以`test_`开头,并且可以使用各种pytest提供的断言函数来检查期望的结果。 ```python def test_addition(): assert 2 + 2 == 4 def test_subtraction(): assert 5 - 3 == 2 ``` 3. 运行测试: 打开终端或命令提示符,并导航到包含测试文件的目录。然后执行以下命令来运行所有的测试函数: ``` pytest ``` pytest会自动发现并执行所有以`test_`开头的函数,并输出测试结果。 4. 断言函数: pytest提供了丰富的断言函数来检查期望的结果。一些常用的断言函数包括: - `assert expression`:断言表达式为真。 - `assert condition == expected_result`:断言条件与期望结果相等。 - `assert condition != expected_result`:断言条件与期望结果不相等。 - `assert condition in container`:断言条件存在于容器中。 - `assert condition not in container`:断言条件不存在于容器中。 您可以根据需要选择合适的断言函数来编写测试。 这只是一个简单的pytest教程,让您快速入门。pytest还提供了许多其他功能,如参数化测试、测试装置等,您可以根据需要进一步探索和学习。希望对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值