一、Pytest特点
基于Python语言的自动化测试框架最知名的有如下
1、 unitest
2、 pytest
3、 robotframework
前两款框架主要聚焦在开发者的白盒单元测试
而robotframework主要聚焦在系统测试上。
Pytest可以用来做系统测试的自动化,它的特点有:
1、 用Python编写测试用例,简便易用
2、 可以用文件系统目录层次对应手工测试用例层次结构
3、 灵活的初始化清除机制
4、 可以灵活挑选测试用例执行
5、 利用第三方插件,可以生成不错的报表
Pytest的功能非常多,我们这里主要介绍常用的功能。
安装
直接执行如下命令即可安装pytest
pip install pytest
我们还需要产生测试报表,所以需要安装一个pytest-html,执行如下命令安装
pip install pytest-html
二、快速上手
Pytest如何知道你哪些代码是自动化的测试用例
官方文档给出了pytest寻找测试项的具体规则
1、 如果未指定命令行参数,则从testpath(如果已配置)或当前目录开始收集
如果命令行参数,指定了目录、文件名或node id的任何组合,则按参数来找
2、 寻找过程会递归到目录中,除非它们匹配上norecursedirs
3、 在这些目录中,搜索由其测试包名称导入的test_*.py或*_test.py文件
4、 从这些文件中,收集如下测试项:
test为前缀的函数
Test为前缀的类里面的test为前缀的方法。
测试用例代码
首先,我们编写的测试用例代码文件,必须以test_开头,或者以_test结尾
比如我们创建一个文件名为test_错误登录.py,放在目录autotest\cases\登录下面。
其中autotest是我们创建的自动化项目根目录。
Test_错误密码.py
class Test_错误密码: def test_c001001(self): print('\n用例C001001') assert 1==1 def test_c001002(self): print('\n用例C001002') assert 2 == 2 def test_c001003(self): print('\n用例C001003') assert 3 == 2
运行用例,打开cmd,进入项目根目录
显示找到3个测试项,2个执行通过,1个执行不通过。
通过的用例用一个绿色小点表示,不通过的用例用一个红色的F表示,并且会在后面显示具体不通过的用例和不通过的检查点代码细节。用例代码中有些打印语句没有显示出具体内容,如果想显示测试代码中print的内容,可以加上命令行参数-s。
pytest -s
如果希望得到更详细的执行信息,包括每个测试类、测试函数的名字,可以加上参数-v,这个参数可以和-s合并为-sv
pytest -sv
执行pytest时,如果没有指定目标目录或者文件,它会自动搜索当前目录下所有符合条件的文件、类、函数。所以上面,就找到了3个测试方法,对应3个用例。我们目前项目根目录中只有一个cases目录用例存放测试用例,将来还会有其他目录。
产生报告
前面安装pytest,我们也安装了pytest-html插件,这个插件就是用来产生测试报告的。要产生报告,在命令行加上参数—html=report.html –self-contained-html,如下
pytest cases --html=report.html --self-contained-html
生成报告
三、初始化清除
对于自动化测试框架来说,初始化清除功能至关重要。
模块级别
模块级别的初始化、清除分别在整个模块的测试用例执行前后执行,并且只会执行1次。它主要是用来为该模块中所有的测试用例做公共的初始化和清除。
如下定义setup_module和teardown_module全局函数
Test_错误密码.py
def setup_module(): print("\n *** 初始化-模块 ***") def teardown_module(): print("\n *** 清除-模块 ***") class Test_错误密码: def test_c001001(self): print('\n用例C001001') assert 1==1 def test_c001002(self): print('\n用例C001002') assert 2 == 2 def test_c001003(self): print('\n用例C001003') assert 3 == 2 class Test_错误密码2: def test_c002001(self): print('\n用例C001001') assert 1==1 def test_c002002(self): print('\n用例C001002') assert 2 == 2 def test_c002003(self): print('\n用例C001003') assert 3 == 2
运行结果:
方法级别
方法级别的初始化、清除分别在每个测试方法执行前后执行,并且每个用例分别执行1次,如下定义setup_class和teardown_class类方法
Test_错误密码.py
def setup_module(): print("\n *** 初始化-模块 ***") def teardown_module(): print("\n *** 清除-模块 ***") class Test_错误密码: @classmethod def setup_class(cls): print("\n *** 初始化-类 ***") @classmethod def teardown_class(cls): print("\n *** 清除-类 ***") def setup_method(self): print("\n *** 初始化-方法 ***") def teardown_method(self): print("\n *** 清除-方法 ***") def test_c001001(self): print('\n用例C001001') assert 1==1 def test_c001002(self): print('\n用例C001002') assert 2 == 2 def test_c001003(self): print('\n用例C001003') assert 3 == 2 class Test_错误密码2: def test_c002001(self): print('\n用例C001001') assert 1==1 def test_c002002(self): print('\n用例C001002') assert 2 == 2 def test_c002003(self): print('\n用例C001003') assert 3 == 2
运行结果:
类级别
类级别的初始化、清除分别在整个类的测试用例执行前后执行,并且只会执行1次。
Test_错误密码.py
def setup_module(): print("\n *** 初始化-模块 ***") def teardown_module(): print("\n *** 清除-模块 ***") class Test_错误密码: @classmethod def setup_class(cls): print("\n *** 初始化-类 ***") @classmethod def teardown_class(cls): print("\n *** 清除-类 ***") def setup_method(self): print("\n *** 初始化-方法 ***") def teardown_method(self): print("\n *** 清除-方法 ***") def test_c001001(self): print('\n用例C001001') assert 1==1 def test_c001002(self): print('\n用例C001002') assert 2 == 2 def test_c001003(self): print('\n用例C001003') assert 3 == 2 class Test_错误密码2: def test_c002001(self): print('\n用例C001001') assert 1==1 def test_c002002(self): print('\n用例C001002') assert 2 == 2 def test_c002003(self): print('\n用例C001003') assert 3 == 2
运行结果:
目录级别
目录级别的初始化清除,就是针对整个目录执行的初始化、清除。我们在需要初始化的目录下面创建一个名为conftest.py的文件,里面的内容如下:
conftest.py
import pytest @pytest.fixture(scope='package',autouse=True) def st_emptyEnv(): print(f'\n### 初始化-目录甲') yield print(f'\n### 清除-目录甲')
Test_错误密码.py
def setup_module(): print("\n *** 初始化-模块 ***") def teardown_module(): print("\n *** 清除-模块 ***") class Test_错误密码: @classmethod def setup_class(cls): print("\n *** 初始化-类 ***") @classmethod def teardown_class(cls): print("\n *** 清除-类 ***") def setup_method(self): print("\n *** 初始化-方法 ***") def teardown_method(self): print("\n *** 清除-方法 ***") def test_c001001(self): print('\n用例C001001') assert 1==1 def test_c001002(self): print('\n用例C001002') assert 2 == 2 def test_c001003(self): print('\n用例C001003') assert 3 == 2 class Test_错误密码2: def test_c002001(self): print('\n用例C001001') assert 1==1 def test_c002002(self): print('\n用例C001002') assert 2 == 2 def test_c002003(self): print('\n用例C001003') assert 3 == 2
运行结果如下:
标签:用例,self,assert,test,pytest,print,def From: https://www.cnblogs.com/longlyseul/p/18396906