Pytest

Pytest是python的一个测试工具, 可以用于所有类型和级别的软件测试。Pytest是一个可以自动查找到你编写的用例并运行后输出结果的测试框架。

Pytest特点

1. 是一个命令行工具, 编写用例简单,可读性强.
2. 非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考
2. 支持单元测试和功能测试.
3. 支持参数化.
4. 执行测试过程中可以将某些测试跳过,或者对某些预期失败的Case标记成失败
5. 支持重复执行失败的Case.
6. 支持运行由Unittest编写的测试Case
7. 具有很多第三方插件,并且可以自定义扩展
8. 方便的和持续集成工具集成.
9. 可以运行以test开头或test结尾的包 文件和方法
10. 可以使用assert进行断言

pytest安装

安装命令: pip install -U pytest
参数解释:   -U 是upgrade, 表示已安装就升级为最新版本.
安装成功校验: pytest --version # 会展示当前已安装版本

注意:测试的脚本文件中的测试函数或者测试类必须以test开头,否则测试函数不执行

pytest 的简单使用:

import pytest
import requests# 测试函数必须是以 test 开头
def test_baidu():r = requests.get('http://www.baidu.com')print(r.status_code)# 使用断言 若是 返回的状态码不是 200 则抛出错误信息为 访问出错assert  r.status_code == 200, '访问出错'# 当需要编写多个测试样例的时候,我们可以将其放到一个测试类当中,如:  测试类必须以 Test开头 测试类中的测试方法也要以 test 开头 并且不能带有 init 方法
class TestItcast(object):def testItcast(self):r = requests.get('http://www.itheima.com/')assert r.status_code == 100def test_two(self):x = "hello"assert hasattr(x, 'check')

命令行运行语句

模式1:直接运行test_se.py文件中的所有cases:

pytest test_se.py

模式2:运行test_se.py文件中的TestClassOne这个class下的两个cases:

pytest test_se.py::TestClassOne

模式3:运行test_se.py文件中的TestClassTwo这个class下的test_one:

pytest test_se.py::TestClassTwo::test_one

1.断言处理

1.1 什么是断言

断言就是用来检测程序是否正确, 若条件为假,就中断程序执行.

1.2 使用场景

  • 使用assert语句
  • 断言预期的异常
  • 断言预期的警告

1.3异常断言

在测试过程中,对某些方法进行测试时,预测输入某些特定数据,会抛出特定异常,若出现特定异常,则用例执行通过。对这类特定异常的断言,可以采用pytest中的**pytest.raises()**进行处理。

Pytest.raises() 测试抛出的异常是否是预期的异常类型,否则测试不会通过

Pytest.raises(expected_exception, args, kwargs) 参数解释

  • expected_exception : 预期的异常信息

         # 可以把异常信息存储到一个变量中, 变量的类型为异常类, 包含异常的type, value或者traceback等信息.# match 参数作用 是匹配输出的异常信息是否和 match 中设置的值一样 不一样 出抛出错误 (即设置了这个参数的话,需要错误类型和信息都一样才会通过测试)# match 参数匹配异常的信息的机制是和 正则里面的match方法一样的 (从头开始匹配)# with pytest.raises(TypeError,match='1568') as e:with pytest.raises(TypeError,match='传') as e:# with pytest.raises(ValueError,match='df') as e:leap_year.is_leap_year('15')
    

有时候我们可能需要在测试用到产生的异常信息, 我们可以把异常信息存储到一个变量中, 变量的类型为异常类, 包含异常的type, value或者traceback等信息.

如上面的 as e 其中 e 就是存储的异常信息

1.4 警告断言

pytest中对警告进行断言采用pytest.warns()方法,其断言的方法与pytest.raises()类似。pytest.warns()除了能断言告警外,还能够捕获告警信息,并对捕获的告警信息进行分类处理,可以设定出现特定告警信息时,则用例执行失败。

1. 使用方法

pytest.warns(expected_warning, *args, match, **kwargs)

  • expected_warning 预期的警告

    • DeprecationWarning 弃用警告
    • UserWarning 用户警告
  • match 可以自定义的警告内容

2. 直接抛出警告

# make_warnings.py
import warningsdef make_warn():# 抛出warnings.warn("deprecated", DeprecationWarning)def not_warn():pass

新建test_warn.py

# test_warn.py
import pytest
import make_warningclass TestWarns():def test_make_warn(self):with pytest.warns(DeprecationWarning):make_warning.make_warn()def test_not_warn(self):"""测试是否是无警告的, 传入的必须是警告类型"""with pytest.warns(SyntaxWarning):make_warning.not_warn()def test_user_warn(self):"""测试自定义的函数"""with pytest.warns(UserWarning):make_warning.user_warn()

执行后发现第二个抛出警告,因为第二个没对警告做处理.

================================================================ FAILURES =================================================================
_________________________________________________________ TestWarns.test_not_warn _________________________________________________________self = def test_not_warn(self):with pytest.warns(SyntaxWarning):
>           make_warning.not_warn()
E           Failed: DID NOT WARN. No warnings of type (,) was emitted. The list of emitted warnings is: [].test_simple.py:12: Failed
======================================================= 1 failed, 2 passed in 0.03s ===

警告断言中,也有match参数,和异常断言中的用法一样,

将告警信息存入一个变量中,通过读取这个变量中的信息进行断言,包括:告警的个数、告警信息参数等。

import warnings
import pytestdef warn_message():warnings.warn("user", UserWarning)warnings.warn("runtime", RuntimeWarning)def test_warn_match():with pytest.warns(UserWarning, match=r'.*t.*') as record:warn_message()assert len(record) == 2assert str(record[0].message) == "user"assert str(record[1].message) == "runtime"

运行结果

test_simple.py F                                                                                                                    [100%]================================================================ FAILURES =================================================================
_____________________________________________________________ test_warn_match _____________________________________________________________def test_warn_match():with pytest.warns(UserWarning, match=r'.*t.*') as record:
>           warn_message()
E           Failed: DID NOT WARN. No warnings of type (,) matching ('.*t.*') was emitted. The list of emitted warnings is: [UserWarning('user',), RuntimeWarning('runtime',)].test_simple.py:10: Failed
============================================================ 1 failed in 0.03s ============================================================

从运行结果中,可以看到,返回的list中存储了2个warnings信息,即record是一个list,可以计算长度,并通过record[i].message获取告警信息。

2. setup 和 theardown

setup_function和teardown_function 每个测试用例都会执行, 不能在类中使用, 否则无效

setup_method 和teardown_method 每个测试用例都会执行,但是是只在类里面的方法,否则无效

setup_class和teardown_class 作用于一个class内,在类外不起作用。setup_class(self):每个类开始执行测试用例之前执行一次,teardown_class(self):每个类测试用例执行完之后执行一次

setup_module 和 teardown_module 作用于一个模块内的所有class和def,对于所有class和def,setup和teardown只执行一次(即在一个模块(py文件)最之前执行和最之后执行)

import pytest
'''
执行顺序:setup_module() 在会执行一个模块的时候,这个是最先执行的。teardown_module() 是在一个模块中最后执行的 都只执行一次
setup_function 在每个测试函数执行前执行,teardown_function 在每个测试函数执行完成后执行。  执行多少个测试函数就执行多少次(不能写在类中,否则无效)
setup_class(self) 在每个测试类执行之前执行一次,teardown_class(self) 在每个测试类执行结束后执行一次
setup_method(self) 在测试类中每个测试用例执行前执行一次, teardown_method(self)在测试类中每个测试用例执行结束后执行一次(只在测试类中其作用)(一个测试类中执行多少个测试用例就执行多少次这个函数)
'''
def setup_module():print("setup_module():在模块最之前执行")def teardown_module():print("teardown_module:在模块最之后执行")def setup_function():print("setup_function():每个方法之前执行")def teardown_function():print("teardown_function():每个方法之后执行")def test_10():print("正在执行test10")x = "this"assert 'h' in xdef sum(a,b):return a+bdef test_add():print("正在执行test_add()")assert sum(3,4) == 7class TestMethod(object):'''setup_class和teardown_class 作用于一个 class 内的 在所有test用例执行前、执行完后各执行一次(和Django中的一样)setup_class 会在 测试类中第一个用例 执行setup_method 前执行 teardown_class 会在 最后一个测试类中的用例执行完 teardown_method 后执行setup_class 的优先级比 teardown_method 高'''def setup_class(self):print("setup_class(self):每个类最之前执行一次")def teardown_class(self):print("teardown_class(self):每个类最之后执行一次")def setup_method(self):print("setup_method(self):在每个方法之前执行")def teardown_method(self):print("teardown_method(self):在每个方法之后执行\n")def add(self,a,b):print("这是加法运算")return a+bdef test_01(self):print("正在执行test1")x = "this"assert 'h' in xdef test_add(self):print("正在执行test_add()")

运行结果

collected 4 items                                                                                                                         test_simple.py setup_module():在模块最之前执行
setup_function():每个方法之前执行
正在执行test10
.teardown_function():每个方法之后执行
setup_function():每个方法之前执行
正在执行test_add()
.teardown_function():每个方法之后执行
setup_class(self):每个类最之前执行一次
setup_method(self):在每个方法之前执行
正在执行test1
.teardown_method(self):在每个方法之后执行setup_method(self):在每个方法之前执行
正在执行test_add()
.teardown_method(self):在每个方法之后执行teardown_class(self):每个类最之后执行一次
teardown_module:在模块最之后执行

测试学习笔记之--pytest使用和断言处理以及setup,theardown使用相关推荐

  1. KALI LINUX渗透测试学习笔记

    KALI LINUX渗透测试学习笔记 (苑房弘主讲) 第1章 课程介绍 任务1:Kali Linux渗透测试介绍.exe 安全问题的根源: 分层思想 只求功能实现 最大的威胁是人 渗透测试: 尝试挫败 ...

  2. kali linux 渗透测试学习笔记——被动信息收集

    kali linux 渗透测试学习笔记--linux 被动信息收集 被动信息收集 被动信息收集 公开渠道可获得的信息 已公开的信息,通过互联网等渠道去获得 与目标系统不产生直接交互 不对目标访问,扫描 ...

  3. 渗透测试学习笔记之案例二

    0x00 前言 渗透是个持续的过程,不断地搜集信息,整理信息,以及利用信息,最终的目标就是拿到系统乃至整个网络的最高权限.在笔者看来,渗透测试与安全研究的最大不同就是前者擅长利用后者的研究成果并运用到 ...

  4. 软件测试-柠檬班python全栈自动化50期测试学习笔记分享

    数组(1174536086)←v是有序的元素序列.用于差异数组的各个元素的数字编号称为下标.若将有限个类型相同的变量的集结命名,那么这个名称为数组名.数组是一个固定长度的存储相同数据类型的数据结构,数 ...

  5. 测试学习总结之---Pytest配置文件和标记

    Pytest配置文件 pytest的配置文件通常放在测试目录下,名称为pytest.ini,命令运行时会使用该配置文件中的配置 配置文件时以 [pytest] 开头 ,pytest.ini文件格式示例 ...

  6. 霍格沃兹测试开发学社技术学习笔记之pytest的使用

    1. 简介 pytest是一个成熟的全功能python测试框架 测试用例的skip和xfail,自动失败重试等处理 能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium ...

  7. 渗透测试学习笔记20.11.20

    目录 杂项 Kali linux Metasploitable2 (Linux) POC.EXP.Payload与Shellcode dvwa Apache cdn如何防止DDOS攻击 Kali抓包破 ...

  8. 渗透测试 学习笔记 思维导图

    资源简介 此资源为本人自学渗透测试过程中做的一些笔记,为思维导图模式,用XMind ZEN 可打开,主要涉及到渗透测试的基本步骤,所用到的工具和渗透方法,ruby语言的简单学习,近源渗透测试的详细学习 ...

  9. 阿里云天池 Python训练营Task5:Python训练营测试 学习笔记

    一.学习知识点概要 本次是Python训练营的测试,在45分钟内完成25题,满分100分及格80分.题目主要考察Task1到Task3里面的Python基础知识.在我随到的25道题里,知识点有: 变量 ...

最新文章

  1. MyBatis 如何兼容所有日志框架?
  2. 矩阵乘法的优化及其在卷积中的应用
  3. 在肚子上开个通到胃大洞,牛瘤胃微生物组是这样研究的
  4. 汽车之家基于 Flink + Iceberg 的湖仓一体架构实践
  5. 两个摄像头自动切换画面_利用OBS虚拟摄像头实现假装开会
  6. Oracle实用技巧
  7. Android开发(一):android环境搭建
  8. base昆明,腾讯云在合作伙伴的阵营中@了TA
  9. ExtJS 4.2 教程-07:Ext.Direct
  10. nginx php 没认,NginX没有执行PHP
  11. mysql 建模教程 pdf,PowerDesigner 15 系统分析与建模实战 PDF扫描版[50MB]
  12. 谈谈我选择VC界面皮肤库的标准
  13. JavaEE项目 Web聊天室(JSP实现)
  14. org.mybatis.caches.ehcache.LoggingEhcache
  15. Simulated maze模拟迷宫(C++实现)
  16. 疯狂原始人手游怎么用电脑玩 疯狂原始人手游PC电脑版教程
  17. List接口如何实例化?(Java)
  18. 【JS里面使用var声明变量存在的三个问题】
  19. PL2303 Windows8.1驱动
  20. Taylor formulation

热门文章

  1. 除了VR 还有什么能在2016年撬动物联网?
  2. oracle服务端下载(10g)
  3. 微信小程序开发工具第一次使用,网络连接不上怎么办
  4. Mapbox简易入门教程
  5. 再探Direct3D流水线
  6. 非常喜欢的一期《晓松奇谈》
  7. 十年饮冰鸿蒙将至,咕哒:十年饮冰难凉热血 十年头牌阿联可称忠烈
  8. 安全领域知识图谱建设与典型应用场景
  9. 运动想象EEG背景知识
  10. html表格转excel有科学计数法,table2excel生成excel表格出现科学计数法问题