Pytest接口自动化应用

news2024/11/16 1:56:10

目录

前言

一、接口自动化项目构成

二、Pytest基础介绍

1.安装Pytest

2.PyCharm中设置使用Pytest

3.pytest使用规则

4.pytest运行方式

a.读取配置文件pytest.ini

b.主函数模式

c.命令行模式

5.pytest参数化

6.pytest前置和后置

7.pytest断言

三、自动化实现部分源码

四、生成Allure报告

五、发送邮件通知


前言

作为一名测试工程师,最基本的是掌握功能测试,但是只掌握功能测试是远远不够的,想要成长,必不可少的就是学习自动化测试相关技术和性能测试相关技术。


测试工程师需要掌握的测试技术篇总结如下:

目前市场上常用的自动化测试技术在之前的博文中已经对自动化框架选型做了简单的对比,详情可了解:自动化测试框架对比与选型-CSDN博客


可通过之前的博文:Jenkins+Pytest+Python+Allure持续化集成-CSDN博客了解如何通过Jenkins+Pytest+Python+Allure框架实现代码持续集成。


本文想要简单介绍下Pytest框架在自动化测试中的应用。

一、接口自动化项目构成

以下是我的接口自动化项目组成。

common:封装公共方法

config:yaml配置文件(包括不同环境,登陆获取的token等)

log:存放日志

reports:生成的测试报告

results:生成的临时测试结果

testcase:测试用例合集

until:一些公共集成的方法

main.py:执行所有测试用例的入口(可以不要)

pytest.ini:pytest的配置
 

二、Pytest基础介绍

1.安装Pytest

pip install pytest

2.PyCharm中设置使用Pytest

配置路径:依次点击【File】→【Settings】→【Tools】→【Python Integrated Tools】,【Default test runner】选择“pytest”,然后点击【Apply】→【OK】,就可以使用Pytest啦

3.pytest使用规则

  • 测试文件以test_开头或者以_test结尾
  • 测试类以Test开头,且类中不能包含__init__方法
  • 测试函数/方法以test_开头
  • 断言使用基本的assert即可

4.pytest运行方式

a.读取配置文件pytest.ini

配置文件示例内容如下:

[pytest]
addopts = -vs
testpaths = testcase
python_files = test_*.py
python_classes = Test*
python_functions = test_*
log_cli = True

markers = 
    smoke : 冒烟用例
    mode1 : 模块1
    mode2 : 模块2

b.主函数模式

需要在项目根目录下新建一个可运行py文件,比如:test_login.py

if __name__ == '__main__':
    pytest.main(['-vs', 'test_login.py', '--clean-alluredir', '--alluredir=allure-results'])
    os.system(r"allure generate -c -o allure-report")

可通过上述执行主函数,运行py文件。

c.命令行模式

pytest ../Pytest								# 执行包中所有模块的用例
pytest -vs test_login.py						# 执行单独的pytest模块,test_learn.py文件
pytest -vs test_login.py::Testpy				# 只执行文件中的Testpy类
pytest -vs test_login.py::Testpy::test_method	# 只执行文件中Testpy类下的test_method方法
pytest -vs test_login.py::test_function			# 只执行文件中test_function函数

5.pytest参数化

可通过pytest装饰器来实现参数化,pytest.mark.parametrize(argnames,argvalues),参数化的名字要与方法中的参数名一一对应。

代码示例:

//测试方法和函数使用
@pytest.mark.parametrize("test_input,expected", [("3+5", 8), ("2+4", 6), ("3*9", 22)])
def test_eval(test_input, expected):
    assert eval(test_input) == expected


//测试类使用
@pytest.mark.parametrize("n,expected", [(1, 2), (3, 4)])
class TestClass:
    def test_simple_case(self, n, expected):
        assert n + 1 == expected

    def test_weird_simple_case(self, n, expected):
        assert (n * 1) + 1 == expected

//模块全局使用
pytestmark = pytest.mark.parametrize("n,expected", [(1, 2), (3, 4)])

class TestClass:
    def test_simple_case(self, n, expected):
        assert n + 1 == expected

//mark标记使用
@pytest.mark.parametrize(
    "test_input,expected",
    [("3+5", 8), ("2+4", 6), pytest.param("3*9", 22, marks=pytest.mark.xfail)],
)
def test_eval(test_input, expected):
    assert eval(test_input) == expected

6.pytest前置和后置

模块级别:setup_module、teardown_module
函数级别:setup_function、teardown_function,不在类中的方法
类级别:setup_class、teardown_class
方法级别:setup_method、teardown_method
方法细化级别:setup、teardown

代码示例

def setup_module():
    print("---整个.py模块开始前只执行一次:打开浏览器---")

def teardown_module():
    print("---整个.py模块结束后只执行一次:关闭浏览器---")

def setup_function():
    print("---每个函数级别用例开始前都执行setup_function---")

def teardown_function():
    print("---每个函数级别用例结束后都执行teardown_function---")

def test_one():
    print("one")

class TestCase():
    def setup_class(self):
        print("---整个测试类开始前只执行一次setup_class---")

    def teardown_class(self):
        print("---整个测试类结束后只执行一次teardown_class---")

    def setup_method(self):
        print("---类里面每个用例执行前都会执行setup_method---")

    def teardown_method(self):
        print("---类里面每个用例结束后都会执行teardown_method---")

    def setup(self):
        print("---类里面每个用例执行前都会执行setup---")

    def teardown(self):
        print("---类里面每个用例结束后都会执行teardown---")

    def test_two(self):
        print("two")

7.pytest断言

pytest断言就用assert就好了。

代码示例:

def test_001(self):  
    assert 1+1 == 2

三、自动化实现部分源码

test_allure.py代码示例:

import allure
import pytest
import os
import sys


@allure.feature('test_success')
def test_success():
    """this test succeeds"""
    assert True


@allure.feature('test_xfail_expected_failure')
@pytest.mark.xfail(reason='该功能尚未实现')
def test_xfail_expected_failure():
    print("该功能尚未实现")
    assert False


@allure.feature('test_xfail_unexpected_pass')
@pytest.mark.xfail(reason='该Bug尚未修复')
def test_xfail_unexpected_pass():
    print("该Bug尚未修复")
    assert True


'''当条件为True则跳过执行'''
@allure.feature("test_skipif")
@pytest.mark.skipif("darwin" in sys.platform,reason="如果操作系统是Mac则跳过执行")
def test_skipif():
    print("操作系统是Mac,test_skipif()函数跳过执行")


@allure.step("步骤一")
def test_with_nested_steps():
    passing_step()
    step_with_nested_steps()

@allure.step("步骤二")
def passing_step():
    pass


@allure.step("步骤三")
def step_with_nested_steps():
    nested_step()


@allure.step("步骤四")
def nested_step():
    nested_step_with_arguments(1, 'abc')


@allure.step("步骤五")
def nested_step_with_arguments(arg1, arg2):
    pass


@allure.title("动态标题: {param1} + {param2} = {expected}")
@pytest.mark.parametrize('param1,param2,expected', [(2, 2, 4),(1, 2, 3)])
def test_with_parameterized_title(param1, param2, expected):
    assert param1 + param2 == expected


if __name__ =='__main__':
    pytest.main(['-vs', 'test_allure.py','--clean-alluredir','--alluredir=allure-results'])
    os.system(r"allure generate -c -o allure-report")

查看Jenkins上配置:

四、生成Allure报告

执行上述Jenkins,点击Build Now构建自动化任务,生成Allure报告结果图:

五、发送邮件通知

首先配置邮件(Jenkins全局配置+项目中配置),这里不再赘述!简单贴个图片~

可附上邮件内容源码!!

<!DOCTYPE html>    
<html>    
<head>    
<meta charset="UTF-8">    
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>    
</head>    
    
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"    
    offset="0">    
    <table width="95%" cellpadding="0" cellspacing="0"  style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">    
        <tr>    
            本邮件由系统自动发出,无需回复!<br/>            
            各位同事,大家好,以下为${PROJECT_NAME }项目构建信息</br> 
            <td><font color="#CC0000">构建结果 - ${BUILD_STATUS}</font></td>   
        </tr>    
        <tr>    
            <td><br />    
            <b><font color="#0B610B">构建信息</font></b>    
            <hr size="2" width="100%" align="center" /></td>    
        </tr>    
        <tr>    
            <td>    
                <ul>    
                    <li>项目名称 : ${PROJECT_NAME}</li>    
                    <li>构建编号 : 第${BUILD_NUMBER}次构建</li>    
                    <li>触发原因: ${CAUSE}</li>    
                    <li>构建状态: ${BUILD_STATUS}</li>    
                    <li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>    
                    <li>构建  Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>    
                </ul>    

            </td>    
        </tr>    
    </table>    
</body>    
</html>

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

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

相关文章

工程项目管理系统源码与Spring Cloud:实现高效系统管理与二次开发

随着企业规模的不断扩大和业务的快速发展&#xff0c;传统的工程项目管理方式已经无法满足现代企业的需求。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;企业需要借助先进的数字化技术进行转型。本文将介绍一款采用Spring CloudSpring BootMybat…

Win10子系统Ubuntu实战(一)

在 Windows 10 中安装 Ubuntu 子系统&#xff08;Windows Subsystem for Linux&#xff0c;简称 WSL&#xff09;有几个主要的用途和好处&#xff1a;Linux 环境的支持、跨平台开发、命令行工具、测试和验证、教育用途。总体而言&#xff0c;WSL 提供了一种将 Windows 和 Linux…

phpcms v9后台添加草稿箱功能

一、后台添加文章模板phpcms/modules/content/templates/content_add.tpl.php中94行增加”保存草稿“按钮&#xff1a; <div class"button"><input value"<?php echo L(save_draft);?>" type"submit" name"dosubmit_draf…

【YOLO系列】 YOLOv4思想详解

前言 以下内容仅为个人在学习人工智能中所记录的笔记&#xff0c;先将目标识别算法yolo系列的整理出来分享给大家&#xff0c;供大家学习参考。 本文未对论文逐句逐段翻译&#xff0c;而是阅读全文后&#xff0c;总结出的YOLO V4论文的思路与实现路径。 若文中内容有误&#xf…

A借助AI工具提升电子邮件营销内容效果

随着互联网的普及和电子邮件的广泛应用&#xff0c;邮件营销已成为企业推广产品和服务的重要手段之一。为了提高邮件营销的效果&#xff0c;我们需要关注邮件内容的质量和吸引力。而百度文言一心等AI工具作为一款强大的在线写作工具&#xff0c;可以帮助我们提升邮件营销内容的…

pytorch基础(八)-TensorBoard

一、TensorBoard运行机制 python记录可视化的数据--》存储到硬盘--》在web端进行可视化 1.python记录可视化的数据 writer.add_scalar(名称, y轴, x轴) writer SummaryWriter(commenttest_tensorboard)for x in range(100):writer.add_scalar(y2x, x * 2, x)writer.add_sc…

Go新手别再被切片复制坑了

概述 Go 语言中切片的复制是非常重要也比较容易让新手困惑的问题。本文将通过大量示例代码,全面介绍切片复制的相关知识,包括: 切片的结构 copy()函数的用法 切片复制的本质 浅复制和深复制的区别 如何实现切片深复制 copy()函数的常见用途 切片复制需要注意的几点 1. 切…

GB28181视频汇聚平台EasyCVR级联后,部分通道视频无法播放是什么原因?

GB28181协议智慧安防平台EasyCVR是基于各种IP流媒体协议传输的视频汇聚和融合管理平台。视频流媒体服务器EasyCVR采用了开放式的网络结构&#xff0c;支持高清视频的接入和传输、分发&#xff0c;平台提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制…

如何计算JMeter性能和稳定性测试中的TPS?

1、普通计算公式 TPS 总请求数 / 总时间 按照需求得到基础数据&#xff0c;比如在去年第xxx周&#xff0c;某平台有5万的浏览量那么总请求数我们可以估算为5万&#xff08;1次浏览都至少对应1个请求&#xff09; 总请求数 50000请求数 总时间&#xff1a;由于不知道每个请…

CAN FD和传统CAN的组网技术

在汽车领域&#xff0c;特别是新能源汽车技术的发展&#xff0c;对汽车内部的数据传输带宽提出了越来越高的要求&#xff0c;因此新的总线协议CAN FD应运而生&#xff0c;其最大传输速率可达8Mbps。然而由于历史原因以及成本因素&#xff0c;在相当长的一段时间内&#xff0c;传…

python 工作目录 与 脚本所在目录不一致

工作目录&#xff1a;执行脚本的地方 我以为工作目录会是当前执行脚本的目录位置&#xff0c;但其实不是&#xff0c;例如&#xff1a; 图中红色文件为我执行的脚本文件&#xff0c;但是实际的工作目录是PYTHON LEARNING 可以用如下代码查询当前工作目录&#xff1a; import os…

游戏引擎支持脚本编程有啥好处

很多游戏引擎都支持脚本编程。Unity、Unreal Engine、CryEngine等大型游戏引擎都支持使用脚本编写游戏逻辑和功能。脚本编程通常使用C#、Lua或Python等编程语言&#xff0c;并且可以与游戏引擎的API进行交互来控制游戏对象、设置变量、执行行为等。使用脚本编程&#xff0c;游戏…

【Proteus仿真】【Arduino单片机】路灯控制系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用LCD1602显示模块、人体红外传感器、光线检测模块、路灯继电器控制等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示时间、工作…

TCP三次握手过程?

TCP三次握手过程&#xff1f; 分享 回答 1 浏览 3662 一颗小胡椒 2 CISM-WSE CISP-PTS 三次握手是 TCP 连接的建立过程。在握手之前&#xff0c;主动打开连接的客户端结束 CLOSE 阶段&#xff0c;被动打开的服务器也结束 CLOSE 阶段&#xff0c;并进入 LISTEN 阶段。随后进入…

LeetCode(209)长度最小的子数组⭐⭐

给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例&#xff1a; 输入&#xff1a;s 7, nums [2,3,1,2,4,3]输出&#xff1a;2…

Linux———head,tail命令详解(狠狠爱住)

目录 head 命令&#xff1a; head 命令基本语法&#xff1a; 常用选项 示例 显示文件的前 10 行&#xff1a; 显示文件的前 5 行&#xff1a; 显示文件的前 100 个字节&#xff1a; 不显示文件名的标题信息&#xff1a; 显示文件名的标题信息&#xff1a; tail 命令&…

网络原理OSI

目录 一、应用层 1、功能 2、协议的分类 二、UDP原理&#xff08;传输层&#xff09; 1、协议端格式 2、格式解释 三、TCP原理&#xff08;传输层&#xff09; 1、协议端格式 2、长度 3、可靠传输 &#xff08;1&#xff09;确认应答 &#xff08;2&#xff09;超时…

RBAC权限管理概念

基于RBAC模型的权限设计&#xff1a;如何设计系统权限体系&#xff1f; | 人人都是产品经理 一&#xff0c;什么是RBAC RBAC(基于角色的权限控制)模型的核心是在用户和权限之间引入了角色的概念。取消了用户和权限的直接关联&#xff0c;改为通过用户关联角色、角色关联权限的…

软件测试|MySQL主键自增详解:实现高效标识与数据管理

简介 在MySQL数据库中&#xff0c;主键自增是一种常见的技术&#xff0c;用于自动为表中的主键字段生成唯一的递增值。本文将深入讨论MySQL主键自增的原理、用途、使用方法&#xff0c;以及在实践中的注意事项和最佳实践。 主键自增 主键自增的原理 主键自增是通过使用AUTO…