python pytest测试框架

python pytest测试框架


嗨!收到一张超级美丽的风景图,愿你每天都能顺心!

框架介绍

测试框架概念

测试框架是指为自动化测试而设计的一组工具、库;提供了一种标准的方法来编写、运行和维护自动化测试用例。自动化测试框架由一个或多个模块集合组成,例如测试用例的管理、测试环境的配置和管理、测试数据的准备、测试结果的分析和报告等方面。使用自动化测试框架可以有效地提高软件测试的效率和质量,缩短测试周期。

pytest测试框架的好处

无框架的自动化测试,存在的问题:

  • 用例代码较多寻找不便捷,管理混乱;
  • 多个文件无法同时执行,效率低;
  • 用例执行失败了无法重跑;
  • 无法生成美观的测试报告;

Pytest 是一个成熟的测试框架,简单灵活易上手,支持参数化 ,失败自动重试等,支持很多第三方插件并可以自定义进行扩展,有allure(完美的测试报告) ,更符合项目中使用的自动化测试框架。
注:要安装好测试环境
python web自动化测试环境搭建

pytest以及插件安装

  • 安装pytest:pip install pytest==7.2.0
    在这里插入图片描述

  • cmd中查看版本:pytest --version
    在这里插入图片描述

  • 插件安装: pip install allure-pytest==2.12.0
    在这里插入图片描述

pytest基础

pytest使用规则

  • python文件名称要求以test_xxx开头,或者是 xx_test结尾
  • 测试用例使用以test开头的函数进行设计 例:def testAAA()
  • 注意事项,不用面向对象思想编写测试用例, 也不使用`init特殊构造方法(会导致执行用例时无法找到文件)

pytest运行

(1) pytest的运行方式有:主函数模式运行 、读取配置文件方式运行(主要的运用方式)主函数运行----执行所有符合pytest规则的python文件: pytest.main()

import pytest
def test_a(self):
    print("这是类里面的测试用例1")
   
def test_b(self):
    print("这是类里面的测试用例2")
        
if __name__ == '__main__':
    pytest.main()           # 主函数模式运行所有符合pytest规则的文件

我们以打开百度为例:

from selenium import webdriver
from time import sleep
import pytest


def test_baidu():
    # 控制Chrome浏览器窗口
    drive = webdriver.Chrome()
    # 将浏览器窗口设置为全屏
    drive.maximize_window()
    # 全局等待5s
    drive.implicitly_wait(5)
    # 打开百度
    drive.get('https://www.baidu.com/')
    sleep(2)


# 主函数模式运行所有符合pytest规则的文件
if __name__ == '__main__':
    pytest.main()

在这里插入图片描述

  • pytest: 这是Python的测试框架pytest,用于执行单元测试和集成测试。
  • test_framework_learning.py: 这是你想要测试的Python文件的路径,通常包含测试用例。
  • ::test_baidu: 这是一个测试标识符,表示你想运行的是名为test_baidu的特定测试函数或类方法。::符号用于指定模块和测试方法的层次结构。
  • –no-header: 选项表示在测试结果中不显示标题行,通常用于控制输出的简洁性。
  • –no-summary: 类似于上面的选项,这个参数意味着不提供测试的总结信息,只显示测试执行的详细情况。
  • -q: 这个选项代表“quiet”或“quiet mode”,表示测试运行时输出的详细程度较低,仅显示错误和失败的测试。
  • collected 1 item只收集符合规则的函数

显示了一个名为test_baidu的测试用例在test_框架学习.py文件中成功通过(PASSED),执行时间大约为6.08秒。这个结果表明您的代码在进行百度相关的测试时没有遇到问题。

(2) pytest执行时可以携带参数,完成特定的功能,参数解释如下

-vs         打印调试详细信息            
if __name__ == '__main__':
    pytest.main(['-vs'])   
--disable-warnings          禁用告警信息
if __name__ == '__main__':
    pytest.main(['--disable-warnings']) 

参数组合使用

if __name__ == '__main__':
    pytest.main(['-vs', '--disable-warnings'])

在这里插入图片描述

在这里插入图片描述

接下来以打开博主的csdn为例
注:接下来的代码会使用到python web自动化基本操作,对代码不熟悉的可以看这篇文章。
python web自动化基本操作
在这里插入图片描述

在这里插入图片描述

注:1、验证时必须刷新一次页面,有可能网页会给一个随机生成数或字母的XPath,每一次打开页面都不一样,这个时候就需要我们自己手写了!!!
2、一定要家时间暂停,不然代码运行太快了。

drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div[1]/div[1]/span[4]').click()
    sleep(2)

由于登录过的账号密码可能已经保存过了,这里我们先进行一个删除操作。
在这里插入图片描述

drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[1]/div[1]/div/input').clear()
    drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[1]/div[1]/div/input').send_keys('账号')
    sleep(2)

第三步输入密,同理
接下来就是三个点击操作
在这里插入图片描述

方法一样,接下来我们来看总代码吧

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
import pytest


def test_xuexitong():
    # 控制Chrome浏览器窗口
    drive = webdriver.Chrome()
    # 将浏览器窗口设置为全屏
    drive.maximize_window()
    # 全局等待5s
    drive.implicitly_wait(5)
    # 打开学习通
    drive.get('https://passport.csdn.net/login?code=applets')
    drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div[1]/div[1]/span[4]').click()
    sleep(2)
    drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[1]/div[1]/div/input').clear()
    drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[1]/div[1]/div/input').send_keys('账号')
    sleep(2)
    drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[1]/div[2]/div/input').clear()
    drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[1]/div[2]/div/input').send_keys('密码')
    sleep(2)
    drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[2]/div[1]/i').click()
    drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[2]/div[2]/i').click()
    drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[1]/div[4]/button').click()
    sleep(5)
    print('执行完成')


# 主函数模式运行所有符合pytest规则的文件
if __name__ == '__main__':
    pytest.main(['-vs', '--disable-warnings'])  # -vs输出调试信息,--disable-warning警用告警信息

看看运行效果吧!
在这里插入图片描述

是不是帮我们自动打开了浏览器,并登录了我的博客账号,在5s后关闭了浏览器。

那如果我们想运行多个文件呢?
直接再创一个文件就好了(注意命名规范)
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注:pytest写一个就可以跑所有文件了(所以以后我们会单独创建一个文件去写pytest。)
在这里插入图片描述

pytest.ini配置文件

pytest.ini 是用于全局的配置文件,主要管理 执行的参数配置,当项目中添加了 ini配置文件,pytest在执行时会读取配置信息,按配置的参数去运行。

创建名字为pytest.ini的文件放在项目根目录下,文件名称固定是pytest.ini不能更改

文件的顶部 加类型识别 [pytest]

注释使用的是 #

pytest中不要使用注释不要用中文,避免造成编码格式问题。

(1)常用的配置项

 	运行的参数:addopts    常用的参数如:  -vs     --alluredir 路径    --clean-alluredir   (每个参数需要间隔)

	执行目录参数:testpaths               会运行此目录下的用例

	执行文件参数:python_files            可以指定文件运行,也可以全部文件运行

接下来我们就再控制台运行一个指定的文件(运行上述test_baidu.py)
在这里插入图片描述

在这里插入图片描述
1467bbd9eef35366f41f7.png#pic_center)

这样以后我们想运行那个文件就运行那个文件,可以是多个。

pytest进阶

在这里插入图片描述

当我们有成千上万个文件的时候,复制上万次显然不可取,那么有什么办法解决呢?

conftest + fixture结合使用(全局应用)

Pytest支持在测试的目录中,创建conftest.py文件,进行全局fixture配置使用

1、conftest.py文件名是固定的不能修改,文件放在项目根目录下

import pytest


@pytest.fixture
def my_fix():
    print('开始执行了......')

现在在conftest.py文件里写了这么一串代码,那么如果我想要调用怎么用呢?
在这里插入图片描述
a8fad8c0579.png#pic_center)

需要把my_fix()当作形参,放进函数里面去

一个文件需用用另一个文件的函数,前提条件是不是应该先把函数导进来。
但是需要注意的是这是用的框架,框架有自己的特性,这是一个全局的配置。
在这里插入图片描述

既然如此
我们直接把我们开头需要重复操作的代码剪切到我们的conftest.py文件里
在这里插入图片描述

依然可以帮我们执行想要的操作
既然有前置操作,那么肯定也有后置操作,不过今天的分享就到这里,后置操作以及其他内容会在下次分享。

结语

本次分享就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区留言,如果给小伙伴们带来了一些收获,请留下你的小赞,你的点赞和关注将会成为博主分享每日学习的动力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值