目录

Pytest测试框架的基本使用

Pytest测试框架的基本使用

目录


pytest框架

pytest是目前非常成熟且功能齐全的一个测试框架,能够进行简单的单元测试和复杂的功能测试。还可以结合selenium/appnium进行自动化测试,或结合requests进行接口测试等,非常灵活,强大方便。

本文将讲述pyttest框架的基本使用,一些功能fixture夹具放到后一章再讲,看完本篇,你就可使用pytest进行简单的用例测试以及生成测试报告了

安装教程

1.windows下打开cmd,执行

pip install pytest

2.安装完成后,执行以下命令验证是否已成功安装

pytest --version #如果安装成功会出现安装的pytest版本号

3.打开pycharm(如果有,没有可以略过这一步),依次点击File->Settings,然后依次点击

https://i-blog.csdnimg.cn/direct/b6839a0bb8e84c838a3668f8b7a5e277.png

输入pytest,然后安装即可:

https://i-blog.csdnimg.cn/direct/ee9d33660d9646f08419e7875245c36d.png 这样我们就可以在pycharm中使用pytest了

Pytest命名约束

在使用pytest构建测试用例时,需要遵循以下的规则:

对于 每个 测试文件文件后缀为.py,文件名格式为: test_ fileName.py 或者fileName _test .py

对于每个 文件中的测试类需要以Test开头 ,如Test_class1,TestClass2.(注意类中不能有init方法)

对于每个文件中的测试方法: 需要以test_开头 ,如test_case1,test_case2

此时,执行pytest时,会自动寻找 当前目录以及其子目录下 所符合以上命名规则的文件或代码进行执行

创建测试用例

首先我们创建一个.py文件,文件名为test_1.py.(名字随便,但要符合上面说的规则)

然后我们导入pytest库

import pytest

下一步,我们创建一个测试类,名为TestDemo,然后该类下有两个测试方法,分别为test_case1,test_case2.

同时我们定义一个加法函数,返回传入的两个参数之和

代码如下:

import pytest

def sum(a,b):
return a+b
class TestDemo:
def test_case1(self):
assert sum(1,4) == 3
def test_case2(self):
assert sum(1,4) == 5

可以看到我们使用 assert 进行断言,判断测试用例是否正确

Python 中常用的断言有以下几种:

assert xx #判断 xx 为真
assert not xx #判断 xx 不为真
assert a == b #判断 a 是否等于 b
assert a != b #判断 a 是否不等于 b
assert a in b #判断 a 是否在 b 中,即 b 是否包含 a 

执行测试用例

测试用例写好了,接下来我们需要执行刚才写的这些测试方法

两种方式: 1.代码         2.命令行

1.代码

我们在测试文件中加入 main 函数,然后调用 pytest 里的 main()方法即可。这样我们直接按正常执.py 文件就可以

import pytest

def sum(a,b):
return a+b
class TestDemo:
def test_case1(self):
assert sum(1,4) == 3
def test_case2(self):
assert sum(1,4) == 5

if **name** == '**main**':
pytest.main()

2.命令行

我们也可以直接在 终端 (cmd 窗口,或者 pycharm 自带的都可以)输入命令执行测试文件,命令格式如下:

pytest 文件名

当然我们也可以 只执行测试文件中的某个类,某个方法

pytest 文件名::类名::方法名

如果只输入 pytest,则会默认执行当前文件夹下所有以 test_开头(或_test 结尾)的文件。

然后我们在 cmd 窗口下执行我们刚才的测试文件(没有 main 方法):

https://i-blog.csdnimg.cn/direct/7b461da31d504c94bb879a7cd7a4b873.png

可以看到测试结果已经出来了,确实是第一个设计的用例错误,也把报错信息清楚地写了出来

同时,pytest 可以带参数执行测试文件,下面是一些常见的参数:

带参数执行

Pytest -v 输出用例更加详细的执行信息,比如用例所在文件和用例名称

pytest -k “key_name” 执行所有 case 中包含‘关键字’的用例

pytest -s 输出用例中的调试信息,比如 print 打印信息,如果不加参数则不输出待执行的用例

pytest -x 执行失败则停止执行,后面的用例不会被执行

pytest –maxfail=n 执行失败 n 次之后停止执行,n 是执行失败的次数

pytest –lf (last failed)重新运行上次失败的用例,若没有失败的会全部跑

pytest –ff (failed first)重新运行所有用例,但首先运行上次失败的用例

skip 跳过执行

某些用例可能暂时没写好,或不想执行这个用例,需要跳过该用例执行,那么我们需要 skip 该用例

使用方法:在需要跳过的用例前面加上 @pytest.mark.skip

(reason=“跳过原因”)

在测试类前面加上面的 skip 语句,则会将这个类的全部测试方法跳过

在测试方法前加上上面的 skip 语句,则只会跳过该方法执行

假设我们在类前面加上 skip 语句:

https://i-blog.csdnimg.cn/direct/c65dab90e3f54d3db00cb53b0c0a8316.png

然后我们使用 pytest -v 打印出测试详细信息

https://i-blog.csdnimg.cn/direct/19bbf6b5e65844c39a0f62df5bb8f60b.png

可以看到这五个用例全部跳过执行了,原因都是我设置的“暂时不执行”

当我在第 5 个测试用例前面加上那条 skip 语句:

https://i-blog.csdnimg.cn/direct/ab02ff90252c4c53ab503c17d88ba97b.png

此时我们再执行,观察测试信息,发现只有第 5 条被跳过了,其它全部正常执行了

https://i-blog.csdnimg.cn/direct/643ba820088c40268856776570f704c9.png

当然如果希望只在特定条件下执行,可以使用 @pytest.mark.skipif(condition, reason="")

这里便不再举例子了

生成测试报告

pytest 本身是没有生成测试报告的功能,但是 pytest 中有很多插件,我们可以通过插件来生成测试报告。下面会给大家介绍一个生成报告的方式。 生成 html 报告

生成 html 报告

首先我们需要安装 pytest-html,在 cmd 窗口下,执行:

pip install pytest-html

安装完成后,和刚才的步骤一样,在 pycharm(如果有),在 File>Settings>Project>Project Interpreter 界面,点击“ + ”搜索 pytest-html 即可进行安装。

安装好后,我们可以执行下面的指令,生成一份 html 报告

pytest --html=report.html test_1.py

执行后,它会在当前目录下生成一个"report.html"文件,我们打开它:

https://i-blog.csdnimg.cn/direct/3fb5c6c2efac43c0bb79060d2fddbf8b.png

可以看到已经成功生成,数据准确

这个 html 文件会生成到当前目录,如果想 生成到指定目录,可以在指定报告名时加入:

pytest --html=C:/Users/h/Desktop/report.html .\test_1.py

当然这个 css 样式是保存在本地的,如果分享给其他人这个 html 文件,会造成 css 样式丢失

我们可以使用

pytest --html=report.html --self-contained-html

将 css 样式合并到 html 里,这样邮箱分享给其他人时也能正常显示了

参数化测试

现在我们编写的函数和测试用例是 1 对 1 的关系,也就是说,当你想测试某个功能场景的时候,你必须要去编写一个对应的测试函数。当测试的场景越来越多,测试数据越来越复杂的情况下,需要编写更多的测心率函数,而这些函数的逻辑基本上是重复的。

https://i-blog.csdnimg.cn/direct/e518cdde575d471d8dd7f4c13bd40b49.png

比如我们为了测试 sum 函数,写了四个测试函数

在 pytest 当中可以使用参数化这种测试手段,简化编写用例函数的过程。我们并不需要为每一组测试数据单独去编写一个测试函数,而是采取多种数据共用一个函数的方式。如果测试操作几乎一致,可以重复使用这一个函数进行测试。

需要再

@pytest.mark.parametrize(args_name,args_value)

@pytest.mark.parametrize 是用于在 pytest 测试框架中参数化测试的装饰器。它允许通过不同的参数多次运行同一个测试函数,从而简化测试代码的编写和维护。

  1. 装饰器参数:

    • args_name :参数名称,可以是一个字符串或者一个字符串列表,用于标识测试函数中的参数。
    • args_value :参数值,可以是一个可迭代对象(如列表、元组、集合等),每个元素是一个参数组合,对应于测试函数的参数名称。

这么直接说可能有一些难理解,我举个例子吧

还是拿刚才所说的加法函数来说,用例格式为 a+b=expected?

这样 args_name 需要传入三个参数,第一个是第一个参数 a,第二个是 b,第三个是相加的期望结果 expected,即"a,b,expected"

args_value 与其对应,假设我们想测试 1+4=5?那么可以传入一个元组,(1,4,5)

所以我可以这样写:

@pytest.mark.parametrize("a,b,expected",[
(1,4,5)
])
def test_addSum(a,b,expected):
assert sum(a,b) == expected

当然我们可以多加几组数据测试:

@pytest.mark.parametrize("a,b,expected",[
(1,4,5),(1,4,4),
(5,5,10),(5,3,10)
])
def test_addSum(a,b,expected):
assert sum(a,b) == expected

这样我们再执行测试:

https://i-blog.csdnimg.cn/direct/d9751401f85b487d983b80a586615b93.png

可以发现结果完美的被测试了出来

我们对比一下,不用参数化,和使用参数化

不使用参数化:

https://i-blog.csdnimg.cn/direct/7fd38a19c73b468399f0ee58e57a2a6e.png

使用参数化:

https://i-blog.csdnimg.cn/direct/1fac3126ca0746dbbccba36f1f51cbb6.png

可以发现简洁了不少,这也便是参数化测试的好处

到这里,关于 Pytest 测试框架的基本使用就讲完了,下一章我们讲完 fixture 夹具的使用,pytest 基本也就完成了。感谢你的阅读