一 . Pytest 简介

Pytest是python的一种单元测试框架。

1. pytest 特点
  • 入门简单,文档丰富
  • 支持单元测试,功能测试
  • 支持参数化,重复执行,部分执行,测试跳过
  • 兼容其他测试框架(nose,unittest 等)
  • 支持生成html报告
  • 可集成CI环境(Jenkins 等)
  • 第三方插件丰富,良好的自定义扩展性
2. pytest 与 unittest

(1)unittest

  • 测试文件必须先 import unittest
  • 测试类必须继承unittest.TestCase
  • 测试方法必须以“test_”开头
  • 测试类必须要有unittest.main()方法
  • unittest只有setup/teardown装载测试用例
  • ...

(2)pytest

  • 测试文件名必须以“test_”开头
  • 测试类以Test开头,并且不能带有 init 方法
  • 测试方法必须以“test_”开头
  • 除了有setup/teardown,还能更自由的定义fixture装载测试用例
  • ...

(3)Comparison Table

 
Pytest vs Unittest

二 . Pytest 安装

# 安装
pip install -U pytest # 查看安装版本
pip show pytest # 或者
pytest --version

三 . Pytest 运行

一个简单的例子 test_class.py:

# test_class.py
class TestClass:
def test_one(self):
x = "this"
assert 'h' in x def test_two(self):
x = "hello"
assert hasattr(x, 'check')
1. cmd 中运行测试用例
# cmd中 cd到 test_class.py所在文件夹
# 运行 该文件夹中所有测试用例
pytest
# 或者
py.test # 运行指定测试用例,加上-q参数用来指定执行的文件
pytest -q test_class.py

pytest运行规则:
查找当前目录及其子目录下以test_.py或_test.py文件,
找到文件后,在文件中找到以test开头函数并执行。

2. pycharm 中运行测试用例

一个简单的例子 test_sample.py:

# content of test_sample.py
import pytest def func(x):
return x + 1 def test_answer():
assert func(3) == 5 if __name__ == "__main__":
pytest.main('-q test_sample.py')

pycharm中运行pytest:

  • file->Setting->Tools->Python Integrated Tools->项目名称->Default test runner->选择py.test
  • 右键选择pytest运行或者直接运行.py文件

四 . Pytest 装饰器

1. setup 与 teardown

装载运行级别:

  • 模块级(setup_module/teardown_module)开始于模块始末
  • 类级(setup_class/teardown_class)只在类中前后运行一次(在类中)
  • 方法级(setup_method/teardown_method)开始于方法始末(在类中)
  • 类里面的(setup/teardown)运行在调用方法的前后
  • 函数级(setup_function/teardown_function)只对函数用例生效(不在类中)

一个简单的例子 test_module.py:

# -*- coding: utf-8 -*-
# Version : V1.0
# Author : Seven
# Date : 2018/8/2 19:41 import pytest # 模块中的方法
def setup_module():
print("setup_module:整个.py模块只执行一次") def teardown_module():
print("teardown_module:整个test_module.py模块只执行一次") def setup_function():
print("setup_function:每个用例开始前都会执行") def teardown_function():
print("teardown_function:每个用例结束后都会执行") # 测试模块中的用例1
def test_one():
print("正在执行测试模块----test_one")
x = "this"
assert 'h' in x # 测试模块中的用例2
def test_two():
print("正在执行测试模块----test_two")
x = "hello"
assert hasattr(x, 'check') # 测试类
class TestCase(): def setup_class(self):
print("setup_class:所有用例执行之前") def teardown_class(self):
print("teardown_class:所有用例执行之后") def setup(self):
print("setup:每个用例开始前都会执行") def teardown(self):
print("teardown:每个用例结束后都会执行") def test_three(self):
print("正在执行测试类----test_three")
x = "this"
assert 'h' in x def test_four(self):
print("正在执行测试类----test_four")
x = "hello"
assert hasattr(x, 'check') if __name__ == "__main__":
pytest.main(["-s", "test_module.py"])

运行的效果:

collected 4 items                                                              

test_module.py setup_module:整个.py模块只执行一次
setup_function:每个用例开始前都会执行
正在执行测试模块----test_one
.teardown_function:每个用例结束后都会执行
setup_function:每个用例开始前都会执行
正在执行测试模块----test_two
Fteardown_function:每个用例结束后都会执行
setup_class:所有用例执行之前
setup:每个用例开始前都会执行
正在执行测试类----test_three
.teardown:每个用例结束后都会执行
setup:每个用例开始前都会执行
正在执行测试类----test_four
Fteardown:每个用例结束后都会执行
teardown_class:所有用例执行之后
teardown_module:整个test_module.py模块只执行一次

从结果看出:

  • setup_module/teardown_module的优先级是最大的
  • 然后函数里面的setup_function/teardown_function与类里面的setup_class/teardown_class互不干涉
2. fixture

一个简单的例子 test_fixture.py:

# conftest.py
# -*- coding: utf-8 -*-
import pytest @pytest.fixture(scope="function")
def login():
print("请先输入账号和密码,然后登陆") yield
print("退出登陆")
# test_1.py
# -*- coding: utf-8 -*-
import pytest def test_fix1(login):
print("test_fix1 in test_1.py:需要登陆再执行操作") def test_fix2():
print("test_fix2 in test_1.py:不需要登陆再执行操作") def test_fix3(login):
print("test_fix3 in test_1.py:需要登陆再执行操作") if __name__ == "__main__":
pytest.main(['-s', 'test_1.py'])
# test_2.py
# -*- coding: utf-8 -*-
import pytest def test_fix3():
print("test_fix3 in test_2.py:不需要登陆再执行操作") def test_fix4(login):
print("test_fix4 in test_2.py:需要登陆再执行操作") if __name__ == "__main__":
pytest.main(['-s', 'test_2.py'])

文件结构:

 
conftest configuration

运行效果:

pytest -s test_1.py

collected 3 items                                                              

test_1.py 请先输入账号和密码,然后登陆
test_fix1 in test_1.py:需要登陆再执行操作
.退出登陆
test_fix2 in test_1.py:不需要登陆再执行操作
.请先输入账号和密码,然后登陆
test_fix3 in test_1.py:需要登陆再执行操作
.退出登陆
pytest -s test_2.py

collected 2 items                                                              

test_2.py test_fix3 in test_2.py:不需要登陆再执行操作
.请先输入账号和密码,然后登陆
test_fix4 in test_2.py:需要登陆再执行操作
.退出登陆

从结果看出:
(1) scope 参数 实现控制 setup 级别
(2) conftest.py 配置 实现跨文件调用装饰器
(3) yield 实现 teardown


五 . Pytest 断言

  • pytest允许使用python的标准assert语句进行断言处理

六 . Pytest 自动生成报告

# 生成xml格式的报告
pytest -v test_1.py --junitxml=Path # 生成txt格式的报告
pytest -v test_1.py --resultlog=Path # 生成html格式的报告
# 需预先装上pytest-html
pip install pytest_html
pytest -v test_1.py --html=Path

生成报告效果图:

 
pytest_report

转自:https://www.jianshu.com/p/75c27fe23b4e

Pytest 测试框架的更多相关文章

  1. pytest测试框架 -- 简介

    一.pytest测试框架简介: (1)pytest是python的第三方测试框架,是基于unittest的扩展框架,比unittest更简洁,更高效. (2)pytest框架可以兼容unittest用 ...

  2. Pytest测试框架(一):pytest安装及用例执行

    PyTest是基于Python的开源测试框架,语法简单易用,有大量的插件,功能非常多.自动检测测试用例,支持参数化,跳过特定用例,失败重试等功能. 安装 pip install -U pytest  ...

  3. Pytest测试框架(二):pytest 的setup/teardown方法

    PyTest支持xUnit style 结构, setup() 和 teardown() 方法用于初始化和清理测试环境,可以保证测试用例的独立性.pytest的setup/teardown方法包括:模 ...

  4. Pytest测试框架(三):pytest fixture 用法

    xUnit style 结构的 fixture用于初始化测试函数, pytest fixture是对传统的 xUnit 架构的setup/teardown功能的改进.pytest fixture为测试 ...

  5. Pytest测试框架(五):pytest + allure生成测试报告

    Allure 是一款轻量级.支持多语言的开源自动化测试报告生成框架,由Java语言开发,可以集成到 Jenkins. pytest 测试框架支持Allure 报告生成. pytest也可以生成juni ...

  6. 『德不孤』Pytest框架 — 1、Pytest测试框架介绍

    目录 1.什么是单元测试框架 2.单元测试框架主要做什么 3.单元测试框架和自动化测试框架有什么关系 4.Pytest测试框架说明 5.Pytest框架和Unittest框架区别 (1)Unittes ...

  7. python pytest测试框架介绍二

    在介绍一中简单介绍了pytest的安装和简单使用,接下来我们就要实际了解pytest了 一.pytest的用例发现规则 pytest可以在不同的函数.包中发现用例,发现的规则如下 文件名以test_开 ...

  8. 技术面试没过,居然是没有用pytest测试框架

    1.引言 我有一个朋友是做Python自动化测试的.前几天他告诉我去参加一个大厂面试被刷了. 我问他是有没有总结被刷下来的原因.他说面试官问了一些 pytest 单元测试框架相关的知识,包括什么插件系 ...

  9. 【pytest系列】- pytest测试框架介绍与运行

    如果想从头学起pytest,可以去看看这个系列的文章! https://www.cnblogs.com/miki-peng/category/1960108.html 前言​ ​ 目前有两种纯测试的测 ...

随机推荐

  1. Spring Boot的注解,你知道或者不知道的都在这里!

    1.1 定义 Annotation(注解),用于为Java代码提供元数据.简单理解注解可以看做是一个个标签,用来标记代码.是一种应用于类.方法.参数.变量.构造器及包的一种特殊修饰符. 1.2 注解的 ...

  2. /etc/profile和~/.bash_profile等文件的区别和联系

    对比说明:/etc/profile:为系统的每个用户设置环境信息和启动程序,当用户第一次登录时,该文件被执行,其配置对所有登录的用户都有效.当被修改时,必须重启才会生效.英文描述:”System wi ...

  3. 转.HTML中img标签的src属性绝对路径问题解决办法,完全解决!

    HTML中img标签的src属性绝对路径问题解决办法,完全解决   需求:有时候自己的项目img的src路径需要用到本地某文件夹下的图片,而不是直接使用项目根目录下的图片. 场景:eclipse,to ...

  4. IOS系统在Safari安装ipa文件

    配置点击下载的地址 itms-services://?action=download-manifest&url= "plist文件路径"plist文件配置 IIS网站配置要 ...

  5. spark streaming整合kafka

    版本说明:spark:2.2.0: kafka:0.10.0.0 object StreamingDemo { def main(args: Array[String]): Unit = { Logg ...

  6. BayaiM__MySQL 5.7 新特性详解

    原创 作者:bayaim 时间:2016-06-15 11:40:50 122 0                            阅读(22130) | 评论(43443) | 转发(3232 ...

  7. asp.net core全局异常过滤并监控系统BUG将异常信息记录到日志

    添加: using Dw.Util.Helper; using Microsoft.AspNetCore.Mvc.Filters; using System; using System.Collect ...

  8. CentOS7破解root密码

    第一步: reboot重启系统,进入修改密码步骤,出现此界面后,按e进行编辑 2.找到linux16这一段中的 ro  crashkernel=xxx, 将 ro 改成rw init=/sysroot ...

  9. Python 修饰符@用法

    def funA(desA): print("It's funA") def funB(desB): print(desB( )) print("It's funB&qu ...

  10. python 连接数据库,查询结果写入数据到excel

    使用Python链接数据库查询数据,并将查询结果写入到Excel中,实现方法上主要有两步,第一,查数据,第二,写Excel. 一.导入需要的包 import time import xlwt from ...