介绍  

  pytest是一个成熟的全功能的Python测试工具,可以帮助你写出更好的程序。

适合从简单的单元到复杂的功能测试

  • l 模块化parametrizeable装置(在2.3,持续改进)
  • l 参数化测试函数(用例)
  • l 标记测试功能与属性
  • l Skip和xfail:处理不成功的测试用例(在2.4改进)
  • l 通过xdist插件分发测试到多个CPU
  • l 不断地重新运行失败的测试
  • l 灵活约定的Python测试发现

Home Page: http://pytest.org

安装

>pip install -U pytest   # 通过pip安装

>py.test --version        # 查看pytest版本

 This is pytest version 2.7.2, imported from C:\Python27\lib\site-packages\pytest.pyc

简单的测试  

  

  让我们创建第一个文件,对个简单的功能进行测试。

#coding=utf-8# 功能
def func(x):return x + 1# 测试用例
def test_answer():assert func(3) == 5

切换到测试文件所在的目录,通过“py.test”命令运行测试。

>py.test 

执行结果如下图:

===================================================================

在一个测试类中创建多个测试用例:

#coding=utf-8class TestClass:def test_one(self):x = "this"assert "h" in xdef test_two(self):x = "hello"assert x == "hi"

运行测试:

>py.test -q test_class.py

-q  为quiet。表示在安静的模式输出报告诉。加不加这个参有什么区别呢? 读者可以对比一下两次输出的日志。其实,就是少了一些pytest的版本信息。

===================================================================

从Python代码中调用pytest

pytest中同样提供了main() 来函数来执行测试用例。

pytest/

├── test_sample.py

├── test_class.py

└── test_main.py

此目录为我们练习的目录,打开test_mian.py

import pytestdef test_main():assert 5 != 5if __name__ == '__main__':pytest.main()

直接运行该程序,sublime 中按Ctrl+B 运行。结果如下:

============================= test session starts =============================
platform win32 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.7.2
rootdir: D:\pyse\pytest, inifile:
collected 4 itemstest_class.py .F
test_main.py F
test_sample.py F================================== FAILURES ===================================
_____________________________ TestClass.test_two ______________________________self = <test_class.TestClass instance at 0x000000000304F548>def test_two(self):x = "hello"
>           assert x == "hi"
E           assert 'hello' == 'hi'
E             - hello
E             + hitest_class.py:11: AssertionError
__________________________________ test_main __________________________________def test_main():
>       assert 5 != 5
E    assert 5 != 5test_main.py:4: AssertionError
_________________________________ test_answer _________________________________def test_answer():
>       assert func(3) == 5
E    assert 4 == 5
E     +  where 4 = func(3)test_sample.py:9: AssertionError
===================== 3 failed, 1 passed in 0.03 seconds ======================
[Finished in 0.3s]

  从执行结果看到,main() 默认执行了当前文件所在的目录下的所有测试文件。

  那么,如果我们只想运行某个测试文件呢?可以向main()中添加参数,就像在cmd命令提示符下面一样:

#coding=utf-8
import pytestdef test_main():assert 5 != 5if __name__ == '__main__':pytest.main("-q test_main.py")   # 指定测试文件

运行结果:

F
================================== FAILURES ===================================
__________________________________ test_main __________________________________def test_main():
>       assert 5 != 5
E    assert 5 != 5test_main.py:4: AssertionError
1 failed in 0.01 seconds

那如果我想运行某个目录下的测试用例呢?指定测试目录即可。

#coding=utf-8
import pytestdef test_main():assert 5 != 5if __name__ == '__main__':pytest.main("d:/pyse/pytest/")  # 指定测试目录

 创建运行测试脚本

  有时候我们的测试用例文件分散在不同的层级目录下,通过命令行的方式运行测试显示不太方便,如何编写一个运行所有测试用例的脚本呢? pytest可以自动帮我们生成这样的脚本。

>py.test --genscript=runtests.py

打开生成的测runtests.py文件:

sources = """
eNrsve2S3EiSIDa3+jhtnvZ293Ra6SSdCZMUF0AzK1nk9OzM1nV2L4dNznKnm6TxY6dX1XVJVAJV
halMIAkgWVU3O2d6Ar3CPYQeQn/1QjKTf8UnAplZ7O6ZPTNxpiszgQiPCA8PD3cPD/f/449+9/5H
yds/W99M58v6fDqfl1XZzefv/9nbvxuPxxE8Oy+r8+jRy2dREq+bOt8siqaNo6zKo3hRV+1mRb/h
a1UsuiKPPpRZdFncXNVN3qYRABmN3v/R23+OLbRd/v6/ePOf/tmPflSu1nXTRe1NOxotllnbRq+7
PKlPfwMw0qNR
……
"""import sys
import base64
import zlibclass DictImporter(object):def __init__(self, sources):self.sources = sourcesdef find_module(self, fullname, path=None):if fullname == "argparse" and sys.version_info >= (2,7):# we were generated with <python2.7 (which pulls in argparse)# but we are running now on a stdlib which has it, so use that.return Noneif fullname in self.sources:return selfif fullname + '.__init__' in self.sources:return selfreturn Nonedef load_module(self, fullname):# print "load_module:",  fullnamefrom types import ModuleTypetry:s = self.sources[fullname]is_pkg = Falseexcept KeyError:s = self.sources[fullname + '.__init__']is_pkg = Trueco = compile(s, fullname, 'exec')module = sys.modules.setdefault(fullname, ModuleType(fullname))module.__file__ = "%s/%s" % (__file__, fullname)module.__loader__ = selfif is_pkg:module.__path__ = [fullname]do_exec(co, module.__dict__) # noqareturn sys.modules[fullname]def get_source(self, name):res = self.sources.get(name)if res is None:res = self.sources.get(name + '.__init__')return resif __name__ == "__main__":if sys.version_info >= (3, 0):exec("def do_exec(co, loc): exec(co, loc)\n")import picklesources = sources.encode("ascii") # ensure bytessources = pickle.loads(zlib.decompress(base64.decodebytes(sources)))else:import cPickle as pickleexec("def do_exec(co, loc): exec co in loc\n")sources = pickle.loads(zlib.decompress(base64.decodestring(sources)))importer = DictImporter(sources)sys.meta_path.insert(0, importer)entry = "import pytest; raise SystemExit(pytest.cmdline.main())"do_exec(entry, locals()) # noqa

好吧!其实, 我也不理解这段代码的含义,但是执行它的可运行测试用例了。

pytest/

├── test_case/

│   ├── test_sample.py

│   ├── test_class.py

│   ├── __init__.py

│   └── test_case2/

│          ├── test_main.py

│          ├── test_time.py

│          └── __init__.py

└── runtests.py

执行runtest.py文件。

>python runtest.py

当然,你也可以打开runtests.py 文件运行它。

===================================================================

* 最后,pytest是如果识别测试用例的呢?它默认使用检查以test_ *.py 或*_test.py命名的文件名,在文件内部查找以test_打头的方法或函数,并执行它们。

pytest还有许多需要讨论的地方,做为这个系列的第一节,先介绍到这里。

转载于:https://www.cnblogs.com/fnng/p/4765112.html

Python单元测试框架之pytest---如何执行测试用例相关推荐

  1. Python单元测试框架之pytest 3 -- fixtures

    From: https://www.cnblogs.com/fnng/p/4769020.html Python单元测试框架之pytest -- fixtures 2015-08-29 13:05 b ...

  2. python单元测试框架之unittest和pytest的区别

    前言 今天呢笔者想和大家来聊聊Python单元测试框架,我们都知道python单元测试框架有很多,大家平时经常使用的是unittest,因为它比较基础,并且可以进行二次开发,如果你的开发水平很高,集成 ...

  3. python装饰器执行顺序_python unittest单元测试框架-3用例执行顺序、多级目录、装饰器、fixtures...

    1.用例执行顺序 unittest默认会按照ascii码的顺序,依次执行.类名--方法名排序,使用discover也是默认排序.如果不想使用默认排序,就使用testsuite测试集的方式. impor ...

  4. 【整理】Python 单元测试框架 - PyUnit

    1 概况 Python单元测试框架(The Python unit testing framework),简称为PyUnit, 是Kent Beck和Erich Gamma这两位聪明的家伙所设计JUn ...

  5. Python单元测试框架介绍

    背景 为啥把单元测试框架介绍放到这里讲,其实主要是想讲pytest框架的应用.这也是应网友的心声.其实pytest框架我以前是用在实际项目中的,只是一直没有将实践过程和经验教训沉淀下来.如今,我想还是 ...

  6. Python单元测试框架Pyunit 的使用

    Python单元测试框架Pyunit 使用示例: 1 import unittest 2 3 class Person: 4 def age(self): 5 return 34 6 def name ...

  7. python单元测试断言_Python单元测试框架之pytest -- 断言-阿里云开发者社区

    对于测试来讲,不管是功能测试,自动化测试,还是单元测试.一般都会预设一个正确的预期结果,而在测试执行的过程中会得到一个实际的结果.测试的成功与否就是拿实际的结果与预期的结果进行比较.这个比的过程实际就 ...

  8. Python单元测试框架《python 自动化框架 pytest》

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

  9. python测试框架untest怎么循环执行_Python自动化测试-Unittest单元测试框架详解

    python中unittest模块是用来做单元测试的. unittest是一个python版本的junit,junit是java中的单元测试框架,对java的单元测试,有一句话很贴切:Keep the ...

最新文章

  1. 关于java中的字符流的一个使用例子
  2. 迷茫的未来,我们需要做些什么呢?
  3. 为 Jupyter Notebook指定虚拟环境的 Python 解释器
  4. mysql中先随机提取再排序d_mysql性能优化
  5. spoj Test(hash)
  6. 张涵20160401作业
  7. python算法与数据结构-选择排序算法(33)
  8. java 程序分析题_java程序入门50题分析:002
  9. java连接设备连接给参数_如何通过蓝牙连接两个设备按参数发送配对代码? JAVA,Android的...
  10. 缓存java框架技术预研4:LazyUnsafeAllocator.java算法分析
  11. 2016蓝桥杯C++A:网友年龄
  12. oracle和timesten整合,Oracle TimesTen 关系型内存数据库18.1新版本详解
  13. el-table样式美化
  14. 苹果硬改手机底层udid无限新机技术
  15. Python带你面向对象爬取网易云音乐
  16. java实现组织架构
  17. ps 证件照(1,2寸)
  18. 基于java的水费管理系统
  19. python微信语音转发_python实现微信小程序自动回复
  20. 记录一次 用服务器下载文件,并上传到百度网盘的实践

热门文章

  1. 揭秘:机器究竟是怎么学习的?
  2. 儿子转眼就长大:Hinton、LeCun、Bengio 口述神经网络简史
  3. 预测|十张图带你了解2018年机器人行业趋势与前景
  4. 腾讯AI Lab解析2017 NIPS三大研究方向,启动教授及学生合作项目
  5. 学界 | OpenAI 发布稀疏计算内核,更宽更深的网络,一样的计算开销
  6. 一文看懂机器视觉芯片 ​
  7. 腾讯微博即将关停,十年了,你用过吗?
  8. jquery等待特定元素加载再执行相关函数
  9. 2016012017+小学四则运算练习软件项目报告
  10. 初探团队基于session的探索性测试