pytest

news/2024/9/26 2:24:23

一、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==1def test_c001002(self):print('\n用例C001002')assert 2 == 2def 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==1def test_c001002(self):print('\n用例C001002')assert 2 == 2def test_c001003(self):print('\n用例C001003')assert 3 == 2class Test_错误密码2:def test_c002001(self):print('\n用例C001001')assert 1==1def test_c002002(self):print('\n用例C001002')assert 2 == 2def 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_错误密码:@classmethoddef setup_class(cls):print("\n *** 初始化-类 ***")@classmethoddef 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==1def test_c001002(self):print('\n用例C001002')assert 2 == 2def test_c001003(self):print('\n用例C001003')assert 3 == 2class Test_错误密码2:def test_c002001(self):print('\n用例C001001')assert 1==1def test_c002002(self):print('\n用例C001002')assert 2 == 2def test_c002003(self):print('\n用例C001003')assert 3 == 2

运行结果:

类级别

类级别的初始化、清除分别在整个类的测试用例执行前后执行,并且只会执行1次。

Test_错误密码.py

def setup_module():print("\n *** 初始化-模块 ***")
def teardown_module():print("\n *** 清除-模块 ***")class Test_错误密码:@classmethoddef setup_class(cls):print("\n *** 初始化-类 ***")@classmethoddef 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==1def test_c001002(self):print('\n用例C001002')assert 2 == 2def test_c001003(self):print('\n用例C001003')assert 3 == 2class Test_错误密码2:def test_c002001(self):print('\n用例C001001')assert 1==1def test_c002002(self):print('\n用例C001002')assert 2 == 2def 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### 初始化-目录甲')yieldprint(f'\n### 清除-目录甲')

Test_错误密码.py

def setup_module():print("\n *** 初始化-模块 ***")
def teardown_module():print("\n *** 清除-模块 ***")class Test_错误密码:@classmethoddef setup_class(cls):print("\n *** 初始化-类 ***")@classmethoddef 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==1def test_c001002(self):print('\n用例C001002')assert 2 == 2def test_c001003(self):print('\n用例C001003')assert 3 == 2class Test_错误密码2:def test_c002001(self):print('\n用例C001001')assert 1==1def test_c002002(self):print('\n用例C001002')assert 2 == 2def test_c002003(self):print('\n用例C001003')assert 3 == 2

运行结果如下:

 

  

  

 

  

 

  

 

 

  

  

  

  

  

 

  

  

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/56580.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

网站打开提示:”未检测到您服务器环境的sqlite3数据库扩展...“

当网站打开时提示“未检测到您服务器环境的sqlite3数据库扩展”,这表明您的服务器上缺少 SQLite3 扩展,或者虽然安装了 SQLite3 扩展,但是 PHP 并未正确配置来使用它。以下是一些排查和解决这个问题的方法: 1. 检查 SQLite3 扩展是否安装 首先,您需要确认 SQLite3 扩展是否…

IIS相关错误报错汇总整理及解决方案

解决方案400 Bad Request:检查请求是否包含错误的信息或格式。 401 Unauthorized:确认是否已经进行了身份验证。 403 Forbidden:检查是否有足够的权限访问资源。 404 Not Found:确认请求的URL是否正确,资源是否存在。 500 Internal Server Error:检查服务器日志,寻找错误…

中华财险60%研发人员用通义灵码全面提效,“越用越上瘾”

保险业被看成是社会“稳定器”和经济“助推器”,近年来已驶入数字化发展快车道。在 AI、大模型当道的今天,保险行业的研发流程、产品设计、场景拓展等业务链条各环节,都值得用大模型进行重塑。点击查看中华财险视频采访! 保险业被看成是社会“稳定器”和经济“助推器”,近…

安全:nginx安装modsecurity

一,modsecurity官网:官网: https://modsecurity.org/ 如图: 官方代码站: https://github.com/owasp-modsecurity/ModSecurity 二,安装环境准备: 1,安装依赖库: [root@localhost source]# yum install -y gcc make pcre-devel libxml2 libxml2-devel curl-devel httpd-dev…

java 二次反序列化

java 二次反序列化 SignedObject 该类是 java.security 下一个用于创建真实运行时对象的类,更具体地说,SignedObject 包含另一个 Serializable 对象。 先看其构造函数方法。看到参数接受一个可序列化的对象,然后又进行了一次序列化,继续看到该类的 getObject 方法(这是个 …

多通道卷积和卷积参数的理解

卷积的具体执行流程不属于本博客的重心。问题描述 卷积的大致执行流程是卷积核对输入张量进行多项式求和运算。如果输入的张量有多个通道,如RGB三通道,那么卷积又是怎么执行的呢?1X1卷积(记作一维卷积)不能获取到局部特征,那么其存在的意义是什么呢?一维卷积的可学习参数…

uniapp js 数独小游戏 写死的简单数独demo(优化完成) 数独 4.0

<template><view class="wrap"><view class="timeGame"><text class="time">时间 {{ gameTime }}</text></view><view class="listWrap"><view:class="[listWraps,sdNum == 4? li…

机械臂运动学-变换矩阵

将移动和转动整合在一起进行描述:以映射的方式: