首页 > 其他分享 >Pytest基础

Pytest基础

时间:2023-10-30 16:11:14浏览次数:37  
标签:vs 基础 pytest 用例 Pytest 测试 test main

一、前言

  Pytest基于Python设计,是一款开源免费、功能全面的单元测试框架,车载以太网测试中被广泛使用。

二、工具说明

Pycharm 2023
pytest 7.4.3

三、创建工程

  创建工程时重点要求使用VituralEnvironment,这里直接选择。

四、Pytest环境安装

在根目录下创建文件Requirements.txt文件,内容为:

pytest
pytest-html
pytest-xdist
pytest-ordering
pytest-rerunfailures
allure-pytest

随后在Pycharm的命令行窗口输入运行:

pip install -r Requirements.txt

安装完毕后继续命令行输入查看是否正确:

pytest --version

查看到版本号后即可正确使用,解释下刚才安装的包:

pytest               pytest环境
pytest-html          用于生成pytest-html格式报告
pytest-xdist         用于用例的分布式执行
pytest-ordering      用于用例的顺序调整
pytest-rerunfailures 用于失败重跑
allure-pytest        用于生成allure报告

五、Pytest框架

5.1 框架示意

在Pytest中表现为:

5.2 配置文件

Requirements.txt为环境安装文件,前面小节已经提到

pytest.ini文件为参数配置文件,具体见下一节。

5.3 主文件

测试入口,使用pytes.mian()开始测试,

import pytest

#执行本文件中的所有测试类,一个main会自动执行所有的py文件
if __name__ == '__main__':
    #基于pytest.ini运行
    pytest.main()

5.4 测试模块

定义编写各测试用例,例如:

import pytest

#测试类
class TestEcuSleepWakeup:
    #测试用例/测试接口/测试函数
    def test_01_sleep(self,test_fixture):
        print("这是一个测试ECU休眠用例!")

    @pytest.mark.useragemode #装饰器
    def test_02_wakeup(self,test_fixture):
        print("这是一个测试ECU唤醒用例!")

六、Pytest语法基础

6.1 命名规则

1.模块名必须以test_开头或者_test结尾
2.测试类必须以Test开头,不能有int方法
3.测试用例必须以test开头

6.2 运行方式

6.2.1 运行模式

1.主函数模式:
    (1)全局运行:pytest.main(['-vs'])
    (2)指定模块:pytest.main(['-vs','test_login.py'])
    (3)指定目录:pytest.main(['-vs','../test_interface'])
    (4)指定函数:pytest.main(['-vs','../test_interface/test_interface_01.py::test_02_TestcaseInterface'])
2.命令行模式:
    (1)切换到测试用例的目录:cd testcase
    (3)运行:pytest -vs test_login.py
3.读取ini文件运行:pytest.ini
    (1)ini文件,一般放在项目的根目录中
    (2)ANSI格式,可以Notepad修改,pytest 7.4.3 支持UTF8编码
    (3)将会同步修改主函数模式和命令函模式
    (4)分组执行:冒烟测试,分模块执行,分接口和web执行
        单选:pytest.main(['-vs','test_login.py','-m=somke'])
        多选:pytest.main(['-vs','-m=smoke or useragemode'])

6.2.2 基于读取Pytest.ini文件运行

  主要解释下第三种读取INI文件运行,需要在根目录下创建一个pytest.ini文件:

[pytest]
#命令行
addopts = -vs -m 'smoke or useragemode' --html ./report/report.html
#测试路径
;testpaths = ./testcase
#测试文件
python_files = test_*.py
#测试类名
python_classes = Test*
#测试函数名
python_functions = test_*
#分组名
markers =
    smoke:somking test
    useragemode:usage mode

  pytest.ini与主函数pytest.main()会有多个参数冲突,比如文件名、路径等,切记不可冲突!

6.2.3 命令行基础命令

  在pytest.ini - addopts或者Pycharm的命令行运行pytest时,可以有以下几种参数:

-s     打印所有的调试信息
-v     打印用例名及测试结果
-vs    组合使用
-x     测试失败时停止测试
-k='string'   根据用例的部分字符串指定测试用例
-m='string'   根据ini文件定义的测试分组执行用例 pytest.main(['-vs','test_login.py','-m=somke'])
--maxfail=num 最大用例失败数
-n=num        多线程/分布式运行    pytest.main(['-vs','test_login.py','-n=2'])
--reruns=num  失败重跑num次        pytest.main(['-vs','test_login.py','--reruns=2'])

  例如我们已经给出的:

#命令行
addopts = -vs -m 'smoke or useragemode' --html ./report/report.html

6.2.4 分组执行

  在pytest.ini文件中,我们定义了分组名Smokeuseragemode,因此测试函数前只需要加上相关标签即可。

import pytest

#测试类
class TestEcuSleepWakeup:
    #测试用例/测试接口/测试函数
    def test_01_sleep(self,test_fixture):
        print("这是一个测试ECU休眠用例!")

    @pytest.mark.useragemode #分组
    def test_02_wakeup(self,test_fixture):
        print("这是一个测试ECU唤醒用例!")

  在pytest.ini的命令行添加即可选择分组运行:

#命令行
addopts =-m 'smoke or useragemode'

6.2.5 顺序执行及跳过

可以在用例前添加装饰器来执行当前测试类中的用例执行顺序:

@pytest.mark.run(order=1)  #执行顺序:1为执行顺序,可以是3,可以时2
@pytest.mark.skip(age<=18,reason = '年龄跳过') #有条件跳过:小于18岁跳过;可以删除条件
import pytest
import time

import setuptools

#测试类
class TestLogin:

    #测试用例/测试接口/测试函数
    @pytest.mark.run(order=2) #装饰器:第二个执行
    def test_login_01_Print(self):
        time.sleep(3)
        print("这是一个TestLogin用例!")
        assert 1==2 #断言

    # @pytest.mark.skip(reason = '不想执行')
    @pytest.mark.run(order=1)  #装饰器:第一个执行
    def test_login_02_Print(self):
        time.sleep(3)
        print("这是一个TestLogin用例!")

6.2.6 固定夹具及装饰器

setup_method()     相当于prepare,作用于添加的测试类中每一个用例
teardown_method()  相当于finalize,作用于添加的测试类中每一个用例
setup_class()      作用于添加的测试类整体,只执行一次初始化工作
setup_teardown()   作用于添加的测试类整体,只执行一次扫尾动作

 分组执行时pytest用例执行的核心:

import pytest
import time

import setuptools

#测试类
class TestLogin:

    def setup_class(self):
        print("\n给类做一些前置工作");

    #夹具
    def setup_method(self):
        print("\n给用例做一些前置工作");

    #测试用例/测试接口/测试函数
    @pytest.mark.run(order=2) #装饰器:第二个执行
    @pytest.mark.smoke #装饰器:自定义测试分组,比如冒烟测试
    def test_login_01_Print(self):
        time.sleep(3)
        print("这是一个TestLogin用例!")
        assert 1==2 #断言

    # @pytest.mark.skip(reason = '不想执行')
    @pytest.mark.run(order=1)  #装饰器:第一个执行
    @pytest.mark.useragemode
    def test_login_02_Print(self):
        time.sleep(3)
        print("这是一个TestLogin用例!")

    def teardown_method(self):
        print("\n给用例一些结束动作")

    def teardown_class(self):
        print("\n给类做一些结束工作");

 

标签:vs,基础,pytest,用例,Pytest,测试,test,main
From: https://www.cnblogs.com/YiMo9929/p/17798127.html

相关文章

  • python爬虫知识体系80页md笔记,0基础到scrapy项目高手,第(2)篇:http协议复习精讲
    本文主要学习一下关于爬虫的相关前置知识和一些理论性的知识,通过本文我们能够知道什么是爬虫,都有那些分类,爬虫能干什么等,同时还会站在爬虫的角度复习一下http协议。完整体系笔记直接地址:请移步这里共8章,37子模块,总计5.6w+字今天这一篇主讲:爬虫基础本阶段本文主要学......
  • 零基础学前端开发可行吗?
    零基础学前端开发可行吗?答案是可行,前端入门简单,但是深入学习高级的技术,还是有一定学习难度的。谁不是零基础开始学的呢?不过对于一点代码基础都没有的小白来说,最重要的是考虑好自己的选择。对于一个没接触过的东西,需要花费的时间与精力是不可估计的,学习过程中很容易半途而废。前端开......
  • TypeScript入门到精通——TypeScript类型系统基础——类
    类 JavaScript是一门面向对象的编程语言,它允许通过对象来建模和解决实际问题。同时,JavaScript也支持基于原型链的对象继承机制。虽然大多数的面向对象编程语言都支持类,但是JavaScript语言在很长一段时间都没有支持它。在JavaScript程序中,需要使用函数来实现类的功能。 ......
  • TypeScript入门到精通——TypeScript类型系统基础——类型别名
    类型别名 如同接口声明能够为对象类型命名,类型别名声明能够为TypeScript中的任意类型命名。一、类型别名声明 类型别名声明能够定义一个类型别名,它的基本语法如下所示:typeAliasName=Type 在该语法中,type是声明类型别名的关键字;AliasName表示类型别名的名称;Ty......
  • 手搭手Ajax经典基础案例省市联动
    环境介绍技术栈springboot+mybatis-plus+mysql软件版本mysql8IDEAIntelliJIDEA2022.2.1JDK1.8SpringBoot2.7.13mybatis-plus3.5.3.2pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns......
  • Linux Shell 基础 -- 总结几种括号、引号的用法
    Shell脚本中经常需要用到一些括号、引号表达式,功能各不相同,本文详细介绍一下。1、双引号""双引号常用于包含一组字符串,在双引号中,除了"$"、"\"、"`(反引号)"有特殊含义外,其余字符(如IFS、换行符、回车符等)没有特殊含义。$a=3$echo"$a"输出结果为3,在双引号中$符......
  • 【java基础-实战3】list遍历时删除元素的方法
    在实际的业务开发中,容器的遍历可以说是非常非常常见的场景了,遍历删除呢,用的机会也比较多,那么有哪几种删除元素的方法呢?你用对了吗~本文循序渐进,先说几种容易出问题的方法,再引出几种比较可靠的方法~首先,初始化一个数组,用于后面的事例演示:List<Integer>list=newArrayList<>();......
  • 神经网络基础篇:详解导数(Derivatives)
    导数一个函数\(f(a)=3a\),它是一条直线。下面来简单理解下导数。让看看函数中几个点,假定\(a=2\),那么\(f(a)\)是\(a\)的3倍等于6,也就是说如果\(a=2\),那么函数\(f(a)=6\)。假定稍微改变一点点\(a\)的值,只增加一点,变为2.001,这时\(a\)将向右做微小的移动。0.001的差别实在是太小了,不......
  • 嵌入式linux系统中设备树基础知识
    笔记整理自百问网+正点原子前言之前分享的笔记:【Linux笔记】总线设备驱动模型中在platform_device部分有简单说明描述设备有两种方法:一种是使用platform_device结构体来指定;另一种是使用设备树来描述。本篇笔记我们就来简单地学习一下设备树的一些知识。什么是设备树设备树简单理解......
  • 狂神go语言零基础教学视频学习笔记
    前言该笔记灵感来源于B站《【狂神说】Go语言零基础学习视频通俗易懂》源视频地址:【狂神说】Go语言零基础学习视频通俗易懂个人声明:本文记录个人在进行该视频学习中的知识总结,帮助大家能更快地进行对该视频内容的学习;一.环境安装下载网站:Go下载-Go语言中文网-Golang中......