![pytest框架与自动化测试应用](https://wfqqreader-1252317822.image.myqcloud.com/cover/848/47216848/b_47216848.jpg)
1.4.3 pytest的框架结构
在执行测试的过程中,我们经常会做些准备工作,再进行测试,测试完成后通常也会将现场恢复原状,因此我们希望执行测试的框架能提供各层次的测试前和测试后的方法。
绝大多数的测试框架只提供setup与teardown。在setup的方法中进行准备代码,在teardown方法中进行销毁代码。
pytest提供了相对自由和层次丰富的setup与teardown框架结构。pytest支持5个层次的setup和teardown,包括:session会话级、module模块级、function函数级、class类级、method方法级。
(1)模块级(setup_module/teardown_module):开始于模块始末(不在类中)。
(2)函数级(setup_function/teardown_function):对函数用例生效(不在类中)。
(3)方法级(setup_method/teardown_method):开始于方法始末(在类中)。
(4)类级(setup_class/teardown_class):只在类中前后运行一次(在类中)。
(5)还有兼容的类里面的层级(setup/teardown):运行在调用方法的前后。
这些级别用在配置初始化setup和销毁teardown中,同样可以配合pytest中fixture功能而变得更强大。将在3.3节具体讲解。
下面给大家逐步演示常用级别所影响的范围层次。先演示模块级和函数级,之后演示方法级、类级及兼容的setup和teardown,最后将整体5个常用级别放在一起演示执行效果。
模块和函数级实践步骤如下:
(1)新建Python文件test_frame_1.py。
(2)在文件中输入如下代码。
(3)单击执行代码。
(4)查看运行结果是否与方法中输入的文字含义相同。
完整代码如下:
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P26_31826.jpg?sign=1738830291-R9nQa5HkqcRUPMjtpmqkn8pWyqNurjdF-0-7b77a97daedef0c3e4d659d321a5c2da)
执行结果如下:module级在py文件中只执行一次,function则在非类的测试方法前后执行,每个测试方法都会调用一次。
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P27_31829.jpg?sign=1738830291-hXvQfufERDk5H4A409hkbfm8qqLJ4igg-0-4f64bccecaf279e0c8874aac7ff63e70)
整体文件结构、代码及运行结果如图1-4所示。
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P28_10159.jpg?sign=1738830291-BpxF3ABTH1hCMDXITrhJifVZWKaGWd0W-0-d89c2668bd31a5483d2342ad2b701423)
图1-4 test_frame_1.py文件执行结果
类和方法级实践如下:
(1)新建Python文件test_frame_2.py。
(2)在文件中输入如下代码。
(3)单击执行代码。
(4)查看运行结果是否与方法中输入的文字含义相同。
完整代码如下:
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P28_31832.jpg?sign=1738830291-btwN9n9C1pLiqva59GLX7IPPFredwHIs-0-4709fc8379333e8b69eb58e1d39f6416)
执行结果如下:
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P29_31834.jpg?sign=1738830291-lOhxocTvsbiMnfw07c9dF2nMwXp3OHiS-0-e303d5f8f7e13530cf43b06b473356c4)
将类中方法和非在类中的方法等所有级放在一起执行,代码如下:
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P30_31836.jpg?sign=1738830291-yLLanGKoLxCcGC9nwIjolu0ewjO2euPL-0-248097d6ab2afedaa73be70044bb0c0b)
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P31_31840.jpg?sign=1738830291-S69PaB8u2UPl1RhAW27hSZKJ4YrWi3PL-0-2862fd29ff99d8bfd4d233f0233436d0)
执行结果如下:
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P31_31841.jpg?sign=1738830291-vDefij2p6AK5FLEyGbmxyx7z9oM7xLLw-0-4cf4fcca98df8ab29271ab80828220ac)