前言

  最近在听极客时间的课程,里面的讲师极力推崇 pytest 框架,鄙视 unittest 框架,哈哈!然后查了些资料,发现了一条 python 鄙视链:pytest 鄙视 > unittest 鄙视 >  robotframework 。

  pytest 是 python 的第三方单元测试框架,比自带 unittest 更简洁和高效,支持315种以上的插件,同时兼容 unittest 框架。这就使得我们在 unittest 框架迁移到 pytest 框架的时候不需要重写代码。接下来我们在文中来对分析下 pytest 有哪些简洁、高效的用法。

一、安装

首先使用 pip 安装 pytest

pip3 install pytest

查看 pytest 是否安装成功

pip3 show pytest

二、简单使用

1.创建 test_sample.py 文件,代码如下:

#!/usr/bin/env python
# coding=utf-8
import pytest def inc(x):
return x + 1 def test_answer():
assert inc(3) == 5 if __name__ =="__main__":
pytest.main()

执行结果:

test_sample.py F                                                         [100%]

================================== FAILURES ===================================
_________________________________ test_answer _________________________________ def test_answer():
> assert inc(3) == 5
E assert 4 == 5
E + where 4 = inc(3) test_sample.py:19: AssertionError
============================== 1 failed in 0.41s ==============================

从上面的例子可以看出,pytest 中断言的用法直接使用 assert ,和 unittest 中断言 self.assert 用法有所区别。

2.总结一下:使用 pytest 执行测试需要遵行的规则:

  • .py 测试文件必须以test_开头(或者以_test结尾)

  • 测试类必须以Test开头,并且不能有 init 方法

  • 测试方法必须以test_开头

  • 断言必须使用 assert

三、fixture

pytest 提供的 fixture 实现 unittest  中 setup/teardown 功能,可以在每次执行case之前初始化数据。不同点是,fixture 可以只在执行某几个特定 case 前运行,只需要在运行 case 前调用即可。比 setup/teardown 使用起来更灵活。

1.fixture scope 作用范围

先看下 fixture 函数的定义:

def fixture(scope="function", params=None, autouse=False, ids=None, name=None):
"""
:arg scope: 可选四组参数:function(默认)、calss、module、package/session
:arg params: 一个可选的参数列表,它将导致多个参数调用fixture函数和所有测试使用它。
:arg autouse: 如果为True,则fixture func将为所有测试激活可以看到它。如果为False(默认值),则需要显式激活fixture。
:arg ids: 每个参数对应的字符串id列表,因此它们是测试id的一部分。如果没有提供id,它们将从参数中自动生成。
:arg name: fixture的名称。 这默认为装饰函数的名称。 如果fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽; 解决这个问题的一种方法是将装饰函数命名 “fixture_ <fixturename>”然后使用”@ pytest.fixture(name ='<fixturename>')”。
  """

重点说下 scope 四组参数的意义:

  • function:每个方法(函数)都会执行一次。

  • class:每个类都会执行一次。类中有多个方法调用,只在第一个方法调用时执行。

  • module:一个 .py 文件执行一次。一个.py 文件可能包含多个类和方法。

  • package/session:多个文件调用一次,可以跨 .py 文件。

在所需要调用的函数前面加个装饰器 @pytest.fixture()。举一个简单的例子:

#!/usr/bin/env python
# coding=utf-8
import pytest @pytest.fixture(scope='function')
def login():
print("登录") def test_1():
print('测试用例1') def test_2(login):
print('测试用例2') if __name__ =="__main__":
pytest.main(['test_sample.py','-s'])

执行结果:

test_sample.py
测试用例1
.
登录
测试用例2
. ============================== 2 passed in 0.07s ==============================

2.yield

我们刚刚实现了在每个用例之前执行初始化操作,那么用例执行完之后如需要 清除数据(或还原)操作,可以使用 yield 来实现。

#!/usr/bin/env python
# coding=utf-8
import pytest @pytest.fixture(scope='function')
def login():
print("登录")
yield
print("注销登录") def test_1():
print('测试用例1') def test_2(login):
print('测试用例2') if __name__ =="__main__":
pytest.main(['test_sample.py','-s'])

执行结果:

test_sample.py
测试用例1
.
登录
测试用例2
.注销登录 ============================== 2 passed in 0.08s ==============================

3.conftest

上面的案例都是写在同一个.py 文件内的。倘若有多个.py 文件需要调用 login() 方法,就必须把 login() 方法写在外面,这里引用了conftest.py 配置文件。test_xxx.py 测试文件中无需 import  conftest,pytest 会自动搜索同级目录中的 conftest.py 文件。

conftest.py 与 测试文件 目录层级关系

# 新建conftest.py,和 test_sample.py 同级目录
import pytest @pytest.fixture(scope='function')
def login():
print("登录") # test_sample.py 代码如下
import pytest def test_1():
print('测试用例1') def test_2(login):
print('测试用例2') if __name__ =="__main__":
pytest.main(['test_sample.py','-s'])

执行结果:

test_sample.py
测试用例1
.
登录
测试用例2
. ============================== 2 passed in 0.01s ==============================

Pytest 使用简介的更多相关文章

  1. pytest基础简介及实践举例

    一.pytest简介 pytest 是 python 的第三方单元测试框架,比自带的 unittest 更简洁和高效,同时兼容 unittest 框架.它还有如下优点: 1.简单灵活,容易上手,文档丰 ...

  2. pytest使用简介

    pytest是基于py unittest的一个单元测试框架,用起来比unittest简单不少,不过和unittest使用不太一样,总结如下: 格式: case的py文件名必须是test开头 def用例 ...

  3. pytest 简介与安装

    前面我们已经基本上掌握了unittest测试框架,下面我们将学习新的pytest测试框架.之于原因嘛,太流行啦!掌握一个框架是不够的,急需另外一个,于是瞅上了pytest. pytest是什么? py ...

  4. pytest.1.快速开始

    From: http://www.testclass.net/pytest/quick_start/ 简介 pytest测试框架可以让我们很方便的编写测试用例,这些用例写起来虽然简单,但仍然可以规模化 ...

  5. Pytest自动化测试-简易入门教程(02)

    Pytest框架简介 Pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:1.简单灵活,容易上手,支持参数化2.能够支持简单的单元测试和复杂的功能测试,3.还可以用来做sel ...

  6. python+pytest接口自动化(11)-测试函数、测试类/测试方法的封装

    前言 在python+pytest 接口自动化系列中,我们之前的文章基本都没有将代码进行封装,但实际编写自动化测试脚本中,我们都需要将测试代码进行封装,才能被测试框架识别执行. 例如单个接口的请求代码 ...

  7. pytest测试框架 -- 简介

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

  8. pytest简介

    pytest有哪些优点? 允许直接使用assert进行断言,而不需要使用self.assert*; 可以自动寻找单测文件.类和函数; Modular fixtures可以用于管理小型或参数化的测试信息 ...

  9. 【Pytest】python单元测试框架pytest简介

    1.Pytest介绍 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高.根据pytest的官方网站介绍 ...

随机推荐

  1. 二级目录下的运行main.py,找不到上级目录的解决方法

    import os, sys sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))

  2. asp.net 关于gridview使用的一些小技巧

    gridview中嵌套控件示例 —— 添加了一个linkbutton 前台: <asp:GridView ID="gv2" runat="server" ...

  3. python基础(30):黏包、socket的其他方法

    1. 黏包 1.1 黏包现象 让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd) 同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接 ...

  4. Python3中13个实例汇总

    1.Python数字求和 # -*- codingLuft-8 -*- #Filename: test.py #author by:Leq #用户输入数字 num1 = input("输入第 ...

  5. 计科菜鸟玩生信(一)——Windows10下用docker安装GATK

    1.官网下载GATK. (学校网速实在是太慢了,下载几个小时到自闭) 下载地址:https://software.broadinstitute.org/gatk/download/ 下载完成后文件夹中 ...

  6. IDEA设置默认WorkingDirectory

  7. 概要设计文档(final)

    1. 引言部分 引言部分主要说明编写目的.系统的范围和参考资料等. 1.1目的 该文档的目的是描述“自习吧”微信小程序的概要设计,主要内容包括系统功能简介.系统结构设计.模块设计和界面设计等. 本文档 ...

  8. Mysql中 instr与concat

    #INSTR(字符串, 子串),#返回值:第一个子串的索引-1#类似indexOf()#例如:SELECT INSTR('人民万岁,世界万岁','万')SELECT INSTR('人民万岁,世界万岁' ...

  9. SRDC - ORA-30036: Checklist of Evidence to Supply (Doc ID 1682700.1)

    SRDC - ORA-30036: Checklist of Evidence to Supply (Doc ID 1682700.1) Action Plan 1. Execute srdc_db_ ...

  10. Python—版本和环境的管理工具(Pipenv)

    pipenv简介 虚拟环境本质是一个文件,是为了适应不同的项目而存在.pipenv相当于virtualenv和pip的合体. 整合了 pip+virtualenv+Pipfile,能够自动处理好包的依 ...