百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

自动化测试框架 pytest 自动化测试框架搭建思路

zhezhongyun 2024-12-15 17:54 45 浏览

对我来说 pytest 可以说是 Python 语言中我最喜欢的测试框架了,它功能特别强大,却又简单易上手,支持许多的插件可以扩展额外的功能。这篇文章来单独介绍下 pytest 的使用。

目录

  1. 安装
  2. 用例编写
  3. 测试执行(命令行及程序化执行、运行参数介绍)
  4. conftest.py 文件介绍(包括 fixture 的使用)

安装

pip install pytest

用例编写

只有满足以下条件才会被识别为 pytest 用例:

  • 文件名需要以 test_ 开头或 _test 结尾
  • 测试函数或方法需要以 test_ 开头
  • 如果要把测试用例放在类中,测试类需要以 Test 开头

示例:

文件 test_example.py

def test_of_example():
    text = "example"
    assert len(text) == 7
    
    
class TestAdd:
    def test_of_add(self):
        result = 1 + 1
        assert result == 2

具体的测试用例写起来很简单,不重点介绍了,今天要重点介绍的是下面的内容。

测试执行

命令行运行

如果要运行项目所有的测试用例,可以直接在命令行运行 pytest,如果要运行指定的文件则在 pytest 后直接加测试文件路径即可,路径后还可以用“::”连接测试类和测试方法或函数来直接指定特定的测试类或测试用例运行。比如要运行上面示例代码的 test_of_add 测试用例,可以这样运行:

pytest test_example.py::TestAdd::test_of_add

程序化运行

pytest 提供了程序化执行测试的入口 pytest.main(),执行效果和命令行运行几乎没有区别。pytest.main() 可以将参数以列表的形式传入,比如要通过程序化运行的方式指定测试用例可以这样写:

pytest.main(["test_example.py::TestAdd::test_of_add"])

运行参数

下面列举一些常用的 pytest 运行参数

参数

参数描述

-v

打印详细的运行日志。加上此参数终端会打印每条用例的运行结果

-s

打印控制台输出内容。带上此参数运行时才会打印代码中 print() 输出语句

-m

运行打了指定标记的用例。每条测试用例或测试类都可以用 @pytest.mark.xxx 的方式来打标记,然后可以使用 pytest -m xxx 的方式来运行打了标记的用例。支持使用 and(与)、or(或)、not(非) 来筛选用例

--lf

运行上次失败的用例

--ff

先运行上次失败的用例,再运行其它用例

--reruns

失败重跑。需安装 pytest-rerunfailures 插件,后面跟需重试的次数。可以另外跟 --reruns_delay 参数设置重试之前等待秒数

--html

生成 html 测试报告。需安装 pytest-html 插件,后面跟测试报告存放的路径。可以另外跟 --self-contained-html 参数来生成单独的 html 报告,html 样式等文件不另外存放

pytest.ini 配置文件

pytest.ini 配置文件可以用来存放测试运行时比较固定的一些参数等内容。

pytest.ini 文件需放在项目根目录。

pytest.ini 比较常见的配置内容:

# pytest.ini
[pytest]
markers:
    example: 测试用例示例
    add: 加法
    
testpaths:
    testcases/

addopts:
    -s
    -v
    --lf
    --capture=fd
    --self-contained-html

上面配置文件中,markers 配置了测试用例标记,如果测试用例进行了标记此处没有列出的话,运行测试时会有警告错误,可以添加 filterwarnings: ignore::UserWarning 忽略警告错误。testpaths 可以指定测试用例路径,如果指定了测试用例路径,运行时不需要再指定测试文件路径。addopts 可以配置命令行参数,此处配置了命令行参数后,运行的时候不需再额外传参数,如果运行时也传有参数,则会取两者的合集。

重点内容——conftest.py 文件

conftest.py 文件是一个很神奇的文件,它可以极大地方便你的测试用例编写,简化你的自动化测试流程。先说下它的一些特点:

  • 命名固定,不可随意更改
  • 作用域为其所在的整个文件夹,包括子文件夹。所以当其存在于根目录时,它可以作用于整个项目
  • 可以存在多个 conftest.py 文件,但每个文件夹只能存在唯一一个
  • conftest.py 不能被其它文件导入,在代码运行时 pytest 会自动导入,并在文件夹内其它文件运行之前运行

conftest.py 主要是和 fixture 结合来使用,一般用法就是在 conftest.py 文件内存放 fixture 函数,然后在测试文件内调用,来实现测试环境的准备或清理等操作。当 conftest.py 存在于根目录时,里面的 fixture 函数可以被整个项目的文件调用。下面我们需要先简单介绍下 fixture。

@pytest.fixture()

当一个函数使用 @pytest.fixture() 装饰之后,这个函数就是 fixture 函数,它可以用来执行一些测试用例初始环境配置或测试环境清理的工作,类似 unittest 的 setup 和 teardwon 的功能。它可以设置作用范围,可设置的作用范围有 session(会话级别,整次测试执行一次)、module(模块级别,调用该函数的整个测试文件运行之前执行一次)、class(类级别,整个类运行一次)和 function(函数/方法级别,默认,每个函数或方法都会调用一次)。

当我们要使用 fixture 函数时,可以直接将它函数或方法名作为参数传入,也可以使用 @pytest.mark.usefixtures('fixture_name') 装饰器,还可以直接使用 @pytest.fixture(autouse=True) 自动使用。

下面上代码示例:

# conftest.py 文件
import pytest


@pytest.fixture()
def my_function_fixture():
    print("测试开始")
    yield
    print("测试结束")


@pytest.fixture(scope="session", autouse=True)
def my_session_fixture():
    print("整个测试开始")
    yield
    print("整个测试结束")

#====================================================#
# example_test.py 文件
import pytest


@pytest.mark.usefixtures("my_function_fixture")
def test_of_example():
    text = "example"
    assert len(text) == 7


class TestAdd:
    def test_of_add(self, my_function_fixture):
        result = 1 + 1
        assert result == 2

上面代码运行 pytest -s -v 之后会输出以下内容

testcases/example_test.py::test_of_example 整个测试开始
测试开始
PASSED测试结束

testcases/example_test.py::TestAdd::test_of_add 测试开始
PASSED测试结束
整个测试结束

可以看到作用范围为 session 的 my_session_fixture 只在整个测试运行之前和之后执行了一次,作用范围为 function 的 my_function_fixture 在两个用例运行之前和之后都分别执行了一次。

yield 在 fixture 函数内起到了 return 的作用,但是它更大的作用是分割了测试执行之前和之后的代码,如示例的运行结果,yield之前的代码会在作用范围的代码运行之前执行,yield 之后的代码会在作用范围的代码运行之后执行,所以 fixture 函数可以实现类似 setup 和 teardown 的作用。

conftest.py 和 fixture 结合来实现 UI 自动化特别方便,可以使用 fixture 来实现测试之前手机连接,测试应用的安装等操作,还可以实现每条用例都重启应用,以保证每条用例都不受上一条用例的影响等。

下一篇文章会结合 pytest 和 uiautomator2 来完整地实现一个 UI 自动化项目。

相关推荐

JavaScript做个贪吃蛇小游戏(过关-加速),无需网络直接玩。

JavaScript做个贪吃蛇小游戏(过关-则加速)在浏览器打开文件,无需网络直接玩。<!DOCTYPEhtml><htmllang="en"><...

大模型部署加速方法简单总结(大模型 ai)

以下对大模型部署、压缩、加速的方法做一个简单总结,为后续需要备查。llama.cppGithub:https://github.com/ggerganov/llama.cppLLaMA.cpp项...

安徽医大第一医院应用VitaFlow Liberty(R)Flex为患者焕然一“心”

近日,在安徽医科大学第一附属医院心血管内科负责人暨北京安贞医院安徽医院业务副院长喻荣辉教授的鼎力支持和卓越带领下,凭借着先进的VitaFlowLiberty(R)Flex经导管主动脉瓣可回收可...

300 多行代码搞定微信 8.0 的「炸」「裂」特效!

微信8.0更新的一大特色就是支持动画表情,如果发送的消息只有一个内置的表情图标,这个表情会有一段简单的动画,一些特殊的表情还有全屏特效,例如烟花表情有全屏放烟花的特效,炸弹表情有爆炸动画并且消息和...

让div填充屏幕剩余高度的方法(div填充20px)

技术背景在前端开发中,经常会遇到需要让某个div元素填充屏幕剩余高度的需求,比如创建具有固定头部和底部,中间内容区域自适应填充剩余空间的布局。随着CSS技术的发展,有多种方法可以实现这一需求。实现步骤...

css之div内容居中(css中div怎么居中)

div中的内容居中显示,包括水平和垂直2个方向。<html><head><styletype="text/css">...

使用uniapp开发小程序遇到的一些问题及解决方法

1、swiper组件自定义知识点swiper组件的指示点默认是圆圈,想要自己设置指示点,需要获得当前索引,然后赋给当前索引不同的样式,然后在做个动画就可以了。*关键点用change方法,然后通过e.d...

微信小程序主页面排版(怎样设置小程序的排版)

开发小程序的话首先要了解里面的每个文件的作用小程序没有DOM对象,一切基于组件化小程序的四个重要的文件*.js*.wxml--->view结构---->html*.wxss--...

Vue动态组件的实践与原理探究(vue动态组件component原理)

我司有一个工作台搭建产品,允许通过拖拽小部件的方式来搭建一个工作台页面,平台内置了一些常用小部件,另外也允许自行开发小部件上传使用,本文会从实践的角度来介绍其实现原理。ps.本文项目使用VueCLI...

【HarmonyOS Next之旅】兼容JS的类Web开发(四) -> tabs

目录1->创建Tabs2->设置Tabs方向3->设置样式4->显示页签索引5->场景示例编辑1->创建Tabs在pages/index目录...

CSS:前端必会的flex布局,我把布局代码全部展示出来了

进入我的主页,查看更多CSS的分享!首先呢,先去看文档,了解flex是什么,这里不做赘述。当然,可以看下面的代码示例,辅助你理解。一、row将子元素在水平方向进行布局:1.垂直方向靠顶部,水平方向靠...

【HarmonyOS Next之旅】兼容JS的类Web开发(四) -> swiper

目录1->创建Swiper组件2->添加属性3->设置样式4->绑定事件5->场景示例编辑1->创建Swiper组件在pages/index...

CSS:Flex布局,网页排版神器!(css3 flex布局)

还在为网页排版抓狂?别担心,CSS的flex布局来了,让你轻松玩转各种页面布局,实现网页设计自由!什么是Flex布局?Flex布局,也称为弹性布局,是CSS中的一种强大布局方式,它能够让你...

移动WEB开发之flex布局,附携程网首页案例制作

一、flex布局体验传统布局兼容性好布局繁琐局限性,不能再移动端很好的布局1.1flex弹性布局:操作方便,布局极为简单,移动端应用很广泛PC端浏览器支持情况较差IE11或更低版本,不支持或仅部...

2024最新升级–前端内功修炼 5大主流布局系统进阶(mk分享)

2024最新升级–前端内功修炼5大主流布局系统进阶(mk分享)获课》789it.top/14658/前端布局是网页设计中至关重要的一环,它决定了网页的结构和元素的排列方式。随着前端技术的不断发展,现...