目录
pytest框架
pytest是目前非常成熟且功能齐全的一个测试框架,能够进行简单的单元测试和复杂的功能测试。还可以结合selenium/appnium进行自动化测试,或结合requests进行接口测试等,非常灵活,强大方便。
本文将讲述pyttest框架的基本使用,一些功能fixture夹具放到后一章再讲,看完本篇,你就可使用pytest进行简单的用例测试以及生成测试报告了
安装教程
1.windows下打开cmd,执行
pip install pytest
2.安装完成后,执行以下命令验证是否已成功安装
pytest --version #如果安装成功会出现安装的pytest版本号
3.打开pycharm(如果有,没有可以略过这一步),依次点击File->Settings,然后依次点击
输入pytest,然后安装即可:
这样我们就可以在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方法):
可以看到测试结果已经出来了,确实是第一个设计的用例错误,也把报错信息清楚地写了出来
同时,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语句:
然后我们使用pytest -v 打印出测试详细信息
可以看到这五个用例全部跳过执行了,原因都是我设置的“暂时不执行”
当我在第5个测试用例前面加上那条skip语句:
此时我们再执行,观察测试信息,发现只有第5条被跳过了,其它全部正常执行了
当然如果希望只在特定条件下执行,可以使用@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"文件,我们打开它:
可以看到已经成功生成,数据准确
这个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的关系,也就是说,当你想测试某个功能场景的时候,你必须要去编写一个对应的测试函数。当测试的场景越来越多,测试数据越来越复杂的情况下,需要编写更多的测心率函数,而这些函数的逻辑基本上是重复的。
比如我们为了测试sum函数,写了四个测试函数
在 pytest 当中可以使用参数化这种测试手段,简化编写用例函数的过程。我们并不需要为每一组测试数据单独去编写一个测试函数,而是采取多种数据共用一个函数的方式。如果测试操作几乎一致,可以重复使用这一个函数进行测试。
需要再
@pytest.mark.parametrize(args_name,args_value)
@pytest.mark.parametrize
是用于在 pytest 测试框架中参数化测试的装饰器。它允许通过不同的参数多次运行同一个测试函数,从而简化测试代码的编写和维护。
装饰器参数:
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
这样我们再执行测试:
可以发现结果完美的被测试了出来
我们对比一下,不用参数化,和使用参数化
不使用参数化:
使用参数化:
可以发现简洁了不少,这也便是参数化测试的好处
到这里,关于Pytest测试框架的基本使用就讲完了,下一章我们讲完fixture夹具的使用,pytest基本也就完成了。感谢你的阅读