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. 使用Nginx+Lua实现自定义WAF

    使用Nginx+Lua实现自定义WAF 版权声明:全部抄自赵班长的GitHub上waf项目 功能列表: 支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝. 支持URL白名单,将不需要过滤的URL ...

  2. 三、html样式、链接、表格

  3. solr使用cursorMark做深度分页

    深度分页 深度分页是指给搜索结果指定一个很大的起始位移. 普通分页在给定一个大的起始位移时效率十分低下,例如start=1000000,rows=10的查询,搜索引擎需要找到前1000010条记录然后 ...

  4. Django中的ORM介绍,字段以及字段的参数。

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

  5. oracle取出多个字段列中的最大值和最小值

    greatest 函数和least函数 select serverid, greatest(e.core0, e.core1, e.score2 ) from e

  6. MySQL ERROR 1300 (HY000): Invalid utf8 character string

    load data报错 原因:原始数据含有 中文\中文 这样的带斜线的字符串. 解决方案:导出的时候替换 replace(d.role_name,'\\','.' ),这样导入时候就不用处理了

  7. Java8 list根据对象某个属性去重

    1. 添加方法: import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import j ...

  8. swap空间不够导致安装失败解决方法

    在安装Oracle的时候,可能因为我们分配的swap空间不够导致安装失败.处理步骤如下: SWAP空间为2G [root@linux01 oracle]# free            total  ...

  9. for循环执行时在,每执行一次for循环中弹出提示框,延时问题

    在需求中,ajax的返回值,根据数组内容的长度去做循环,每循环一次弹出提示框,发现for循环的执行速度非常之快,想到了延时,但是在for循环中延时并不能解决这个问题. 查到setTimeout的递归处 ...

  10. JAVA面试精选【Java基础第二部分】

    上一篇,我们给出了大概35个题目,都是基础知识,有童鞋反映题目过时了,其实不然,这些是基础中的基础,但是也是必不可少的,面试题目中还是有一些基础题目的,我们本着先易后难的原则,逐渐给出不同级别的题目, ...