pytest简介

pytestpython的一种单元测试框架,它非常的简洁、清晰。

pytest 安装

pip install -U pytest

查看pytest版本

pytest --version

入门

创建、运行第一个 test

test_first.py

def inc(x):
return x + 1 def test_inc():
assert inc(10) == 20

运行 pytest

an@hosta:~/PycharmProjects/testproject/pytest_study$ pytest     # 运行命令
========================================================== test session starts ==========================================================
platform linux -- Python 3.5.2, pytest-3.3.2, py-1.5.2, pluggy-0.6.0
rootdir: /home/an/PycharmProjects/testproject/pytest_study, inifile: pytest.ini
plugins: xdist-1.22.0
collected 1 item # 搜集到的测试用例数量 test_cont.py F # F 代表测试出错, [100%] # 测试完成率 =============================================================== FAILURES ================================================================
_______________________________________________________________ test_inc ____________________ # 测试模块名 _______________________________________ def test_inc():
> assert inc(10) == 20 # 报错的位置
E assert 11 == 20 # 报错原因
E + where 11 = inc(10) # 错误的来源 test_cont.py:6: AssertionError
======================================================= 1 failed in 0.04 seconds =============# 测试结果 =======================================

pytest 测试代码中抛出的异常

cont_test.py
import pytest def inc(x):
return x + 1 def test_inc():
assert inc(10) == 11 def f():
raise SyntaxError() def test_f():
with pytest.raises(SyntaxError):
f()

运行pytest

an@hosta:~/PycharmProjects/testproject/pytest_study$ pytest
========================================================== test session starts ==========================================================
platform linux -- Python 3.5.2, pytest-3.3.2, py-1.5.2, pluggy-0.6.0
rootdir: /home/an/PycharmProjects/testproject/pytest_study, inifile: pytest.ini
plugins: xdist-1.22.0
collected 2 items # 两个测试用例 cont_test.py .. # 两个 . 表示都测试成功了 F 表示失败 [100%] ======================================================= 2 passed in 0.01 seconds ========= #测试结果 =======================================

另一种方式运行多个测试。构造一个 测试类 里面包含多个测试用例

cont_test.py
import pytest
class TestClass:
def test_one(self):
x = "this"
assert x != "that" def test_two(self):
x = "hello"
assert hasattr(x, "upper") def test_three(self):
with pytest.raises(IndexError):
raise IndexError

运行 pytest

运行pytest的退出码

Exit code 0:	All tests were collected and passed successfully
Exit code 1: Tests were collected and run but some of the tests failed
Exit code 2: Test execution was interrupted by the user
Exit code 3: Internal error happened while executing tests
Exit code 4: pytest command line usage error
Exit code 5: No tests were collected
指定测试用例失败次数失败之后,就停止测试

pytest -x 在第一次失败之后,就停止运行剩余的测试

pytest --maxfail=2 两次失败之后,就停止运行剩余测试

指定运行测试用例

目录结构
|---pytest_test
|
|---cont_test.py # 模块内容
cont_test.py import pytest def inc(x):
return x + 1 def test_inc():
assert inc(10) == 11 def f():
raise SyntaxError() @pytest.mark.slow
def test_f():
with pytest.raises(SyntaxError):
f() class TestClass:
def test_one(self):
x = "t"
assert x == "that" def test_two(self):
x = "hello"
assert hasattr(x, "pper") def test_three(self):
with pytest.raises(IndexError):
raise IndexError
  • 指定运行目录

    pytest pytest_test

  • 自动搜索运行本目录内的测试模块(以test开头或结尾)

    pytest_test$ pytest

  • 指定运行模块

    pytest_test$ pytest cont_test.py

  • 指定测试函数

    pytest_test$ pytest cont_test.py::test_inc

  • 指定测试类

    pytest_test$ pytest cont_test.py::TestClass

  • 指定测试方法

    pytest_test$ pytest cont_test.py::TestClass::test_one

  • 指定被mark的测试

    pytest_test$ pytest -m slow

将结果输出到 XML 文件

pytest --junitxml=/tmp/zz.xml

禁用pytest的扩展

pytest -p no:doctest -p no:django

方法二:
创建一个 pytest.ini 文件
pytest.ini
[pytest]
addopts = -p no:django -p no:forked -p no:xdist-1.22.0 -p no:celery
;禁用扩展

异常

捕获程序中故意引发的异常
def f():
raise SyntaxError() def test_f():
with pytest.raises(SyntaxError):
f()
指定测试失败的信息

def test_f():
with pytest.raises(SyntaxError, message='this is i expected error'):
pass —————————————————————————————— ------------------------------------------------ generated xml file: /home/an/haha.xml -------------------------------------------------
=============================================================== FAILURES ================================================================
________________________________________________________________ test_f _________________________________________________________________ def test_f():
with pytest.raises(SyntaxError, message='this is i expected error'):
> pass
E Failed: this is i expected error # 正是我们所希望失败 cont_test.py:17: Failed
================================================== 1 failed, 3 passed in 0.06 seconds =====
进一步限定我们所期望的异常,match使用的 python 中 re.search 方法进行匹配
def test_f():
with pytest.raises(ValueError, match=r'.?1'):
raise ValueError("a1")
# 正常

def test_f():
with pytest.raises(ValueError, match=r'.?1'):
raise ValueError("z3")
_____________________________________________ ============================================================== FAILURES ================================================================
________________________________________________________________ test_f _________________________________________________________________ def test_f():
with pytest.raises(ValueError, match=r'.?1'):
> raise ValueError("z3")
E ValueError: z3 cont_test.py:17: ValueError During handling of the above exception, another exception occurred: def test_f():
with pytest.raises(ValueError, match=r'.?1'):
> raise ValueError("z3")
E AssertionError: Pattern '.?1' not found in 'z3' # 匹配失败 cont_test.py:17: AssertionError
================================================== 1 failed, 3 passed in 0.10 seconds ============

pytest 单元测试的更多相关文章

  1. Pytest单元测试框架-测试用例运行规则

    1.Pytest测试用例运行规则 在pytest单元测试框架下面执行用例,需要满足以下几个特点: 1. 文件名以test_*.py开头或者*_test.py 2. 测试类.测试函数以test开头 3. ...

  2. Pytest单元测试框架-Pytest环境安装

    unittest是python自带的单元测试框架,它封装好了一些校验返回的结果方法和一些用例执行前的初始化操作,使得单元测试易于开展,因为它的易用性,很多同学也拿它来做功能测试和接口测试,只需简单开发 ...

  3. Pytest单元测试框架:插件-allure-pytest环境搭建并在本地生成一个测试报告

    之前写了allure-pytest的官方文档啃的内容,有些交流的朋友,实践起来没什么头绪,所以就有了这篇文章,也给自己填个坑 第一步:搭建Allure.JDK环境 1. 搭建JDK环境 不装jdk你会 ...

  4. Pytest单元测试框架之简单操作示例

    前言: Pytest是第三方单元格测试框架,更加简单,灵活,而且提供了更多丰富的扩展: Pytest与UnitTest框架的区别 UnitTest测试用例执行顺序是依照ascii码执行,而Pytest ...

  5. Pytest 单元测试框架

    1.pytest 是 python 的第三方单元测试框架,比自带 unittest 更简洁和高效 2.安装 pytest pip install pytest 3.验证 pytest 是否安装成功 p ...

  6. Pytest单元测试框架——Pytest+Allure+Jenkins的应用

    一.简介 pytest+allure+jenkins进行接口测试.生成测试报告.结合jenkins进行集成. pytest是python的一种单元测试框架,与python自带的unittest测试框架 ...

  7. Pytest单元测试框架-学习

    pytest: Python的一个单元测试框架,基于UnitTest二次开发,语法上更加简洁,可以用来做Python开发项目的单元测试,UI自动化.接口自动化测试等,有很多的插件访问Pytest插件汇 ...

  8. Pytest单元测试框架之FixTure基本使用

    前言: 在单元测试框架中,主要分为:测试固件,测试用例,测试套件,测试执行及测试报告: 测试固件不难理解,也就是我们在执行测试用例前需要做的动作和测试执行后的需要做的事情: 比如在UI自动化测试中,我 ...

  9. pytest单元测试框架

    一.安装方式 1.安装命令:pip install pytest 2.html安装插件:pip install pytest -html 二.pytest执行指定测试用例 1.思想:通过对测试用例进行 ...

随机推荐

  1. javascript-时间戳

    // 获取当前时间戳(以s为单位) var timestamp = Date.parse(new Date()); timestamp = timestamp / 1000; console.log( ...

  2. CF865D Buy Low Sell High

    /* 贪心来选择, 如果能找到比当前小的, 就用最小的来更新当前的 优先队列即可 */ #include<cstdio> #include<algorithm> #includ ...

  3. 点击DIV随机换颜色

    <!DOCTYPE html> <html>     <head>         <meta charset="UTF-8">   ...

  4. Java之24种设计模式-UML-模型图解读

    Design Patterns 策略模式: 观察者模式: 经典单例模式: private static class AuthenticationHolder { private static fina ...

  5. 了解一下,Java 虚拟机

    1.1 - 概述     Java 总述:Java 不仅是一门编程语言,还是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于 嵌入式 ...

  6. 微信小程序获取用户信息

    App({ appData: { userInfo:{ user_portraitUrl: "", user_nick: "", user_gender: 0, ...

  7. js中script的上下放置区别 , Dom的增删改创建

    回顾 javascript分为三部分: 1.ECMAScript5.0 es6(阮一峰) es7 es8 es6中有类的概念 声明变量 var let(es6中语法) 内置函数 Date Math.r ...

  8. swt text 回车 defaultSelected

    今天试了一下SWT控件 TEXT 中的回车事件,使用 defaultSelected 进行处理,结果怎么也不能触发事件. 经过仔细排查,发现是TEXT选中了 wrap 的原因,毕竟如果是多行的话,肯定 ...

  9. 关于thinkphp5被入侵后的一些思考

    最近一段时间thinkphp5爆出漏洞  request.php中的请求过滤不严 是得web端 可以直接写入一个文件到服务器上 进而可得webshell权限 我的一个客户 就是这样被入侵了   刚开始 ...

  10. 白鹭引擎 - 事件机制 ( Event, addEventListener, dispatchEvent )

    1, 自定义事件, MyEvent class MyEvent extends egret.Event { /** * 一般会定义一个 DATA 字段作为事件 * 绑定事件监听器时, 一般用 类.DA ...