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

简介:

介绍                                                                     

  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-8

class TestClass:

    def test_one(self):
        x = "this"
        assert "h" in x

    def 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 pytest

def test_main():
    assert 5 != 5

if __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 items

test_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             + hi

test_class.py:11: AssertionError
__________________________________ test_main __________________________________

    def test_main():
>       assert 5 != 5
E    assert 5 != 5

test_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 pytest

def test_main():
    assert 5 != 5

if __name__ == '__main__':
    pytest.main("-q test_main.py")   # 指定测试文件
复制代码

 运行结果:

复制代码
F
================================== FAILURES ===================================
__________________________________ test_main __________________________________

    def test_main():
>       assert 5 != 5
E    assert 5 != 5

test_main.py:4: AssertionError
1 failed in 0.01 seconds
复制代码

 

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

复制代码
#coding=utf-8
import pytest

def test_main():
    assert 5 != 5

if __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 zlib

class DictImporter(object):
    def __init__(self, sources):
        self.sources = sources

    def 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 None
        if fullname in self.sources:
            return self
        if fullname + '.__init__' in self.sources:
            return self
        return None

    def load_module(self, fullname):
        # print "load_module:",  fullname
        from types import ModuleType
        try:
            s = self.sources[fullname]
            is_pkg = False
        except KeyError:
            s = self.sources[fullname + '.__init__']
            is_pkg = True

        co = compile(s, fullname, 'exec')
        module = sys.modules.setdefault(fullname, ModuleType(fullname))
        module.__file__ = "%s/%s" % (__file__, fullname)
        module.__loader__ = self
        if is_pkg:
            module.__path__ = [fullname]

        do_exec(co, module.__dict__) # noqa
        return sys.modules[fullname]

    def get_source(self, name):
        res = self.sources.get(name)
        if res is None:
            res = self.sources.get(name + '.__init__')
        return res

if __name__ == "__main__":
    if sys.version_info >= (3, 0):
        exec("def do_exec(co, loc): exec(co, loc)\n")
        import pickle
        sources = sources.encode("ascii") # ensure bytes
        sources = pickle.loads(zlib.decompress(base64.decodebytes(sources)))
    else:
        import cPickle as pickle
        exec("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还有许多需要讨论的地方,做为这个系列的第一节,先介绍到这里。

目录
相关文章
|
11月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
644 1
|
12月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
703 18
|
IDE 测试技术 API
python调试与测试
python调试与测试
|
安全 测试技术 API
Python 单元测试详解
单元测试是Python开发中不可或缺的环节,能确保代码按预期运行、发现Bug、提升代码质量并支持安全重构。本文从基础概念讲起,逐步介绍Python单元测试的实践方法,涵盖unittest框架、pytest框架、断言使用、Mock技巧及测试覆盖率分析,助你全面掌握单元测试技能。
621 0
|
测试技术 Python
Python测试报告生成:整合错误截图,重复用例执行策略,调整测试顺序及多断言机制。
如何组织这一切呢?你可以写一本名为“Python测试之道”的动作指南手册,或者创建一个包含测试策略、测试顺序、多断言机制的脚本库。只要你的测试剧本编写得足够独到,你的框架就会像一位执行任务的超级英雄,将任何潜伏于代码深处的错误无情地揪出来展现在光天化日之下。这些整理好的测试结果,不仅有利于团队协作,更像冒险故事中的精彩篇章,带给读者无尽的探索乐趣和深刻的思考。
345 10
|
人工智能 Java 测试技术
Java or Python?测试开发工程师如何选择合适的编程语言?
测试工程师如何选择编程语言?Java 还是 Python?多位资深专家分享建议:Python 入门简单、开发效率高,适合新手及自动化测试;Java 生态成熟,适合大型项目和平台开发。建议结合公司技术栈、个人基础及发展方向选择。长远来看,两者兼通更佳,同时关注 Go 等新兴语言。快速学习与实践才是关键。
|
测试技术 Python
Python接口自动化测试中Mock服务的实施。
总结一下,Mock服务在接口自动化测试中的应用,可以让我们拥有更高的灵活度。而Python的 `unittest.mock`库为我们提供强大的支持。只要我们正确使用Mock服务,那么在任何情况下,无论是接口是否可用,都可以进行准确有效的测试。这样,就大大提高了自动化测试的稳定性和可靠性。
498 0
|
机器学习/深度学习 设计模式 测试技术
Python 高级编程与实战:构建自动化测试框架
本文深入探讨了Python中的自动化测试框架,包括unittest、pytest和nose2,并通过实战项目帮助读者掌握这些技术。文中详细介绍了各框架的基本用法和示例代码,助力开发者快速验证代码正确性,减少手动测试工作量。学习资源推荐包括Python官方文档及Real Python等网站。
|
存储 JSON API
Python测试淘宝店铺所有商品接口的详细指南
本文详细介绍如何使用Python测试淘宝店铺商品接口,涵盖环境搭建、API接入、签名生成、请求发送、数据解析与存储、异常处理等步骤。通过具体代码示例,帮助开发者轻松获取和分析淘宝店铺商品数据,适用于电商运营、市场分析等场景。遵守法规、注意调用频率限制及数据安全,确保应用的稳定性和合法性。
|
IDE 测试技术 开发工具
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
在Python开发中,调试是提升效率的关键技能。本文总结了10个实用的调试方法,涵盖内置调试器pdb、breakpoint()函数、断言机制、logging模块、列表推导式优化、IPython调试、警告机制、IDE调试工具、inspect模块和单元测试框架的应用。通过这些技巧,开发者可以更高效地定位和解决问题,提高代码质量。
1413 8
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南

热门文章

最新文章

推荐镜像

更多