Python中的测试工具

??当我们在写程序的时候,我们需要通过测试来验证程序是否出错或者存在问题,但是,编写大量的测试来确保程序的每个细节都没问题会显得很繁琐。在Python中,我们可以借助一些标准模块来帮助我们自动完成测试过程,比如:

  • unittest: 一个通用的测试框架;
  • doctest: 一个更简单的模块,是为检查文档而设计的,但也非常适合用来编写单元测试。

??下面,笔者将会简单介绍这两个模块在测试中的应用。

doctest

??doctest模块会搜索那些看起来像是python交互式会话中的代码片段,然后尝试执行并验证结果。下面我们以doctest.testmod为例,函数doctest.testmod会读取模块中的所有文档字符串,查找看起来像是从交互式解释器中摘取的示例,再检查这些示例是否反映了实际情况。
??我们先创建示例代码文件test_string_lower.py,完整代码如下:

# -*- coding: utf-8 -*-

def string_lower(string):
    '''
    返回一个字符串的小写
    :param string: type: str
    :return: the lower of input string
    >>> string_lower('AbC')
    'abc'
    >>> string_lower('ABC')
    'abc'
    >>> string_lower('abc')
    'abc'
    '''
    return string.lower()

if __name__ == '__main__':
    import doctest, test_string_lower
    doctest.testmod(test_string_lower)

首先先对程序进行说明,函数string_lower用于返回输入字符串的小写,函数中的注释中,一共包含了3个测试实例,期望尽可能地包含各种测试情况,接着在主函数中导入doctest, test_string_lower,再运行doctest中的testmod函数即可进行测试。
??接着,我们开始测试。首先,在命令行中输入python test_string_lower.py,运行后会发现什么都没有输出,但这其实是件好事,它表明程序中的所有测试都通过了!那么,如果我们想要获得更多的输出呢?可在运行脚本的时候增加参数-v,这时候命令变成python test_string_lower.py -v,输出的结果如下:

Trying:
    string_lower('AbC')
Expecting:
    'abc'
ok
Trying:
    string_lower('ABC')
Expecting:
    'abc'
ok
Trying:
    string_lower('abc')
Expecting:
    'abc'
ok
1 items had no tests:
    test_string_lower
1 items passed all tests:
   3 tests in test_string_lower.string_lower
3 tests in 2 items.
3 passed and 0 failed.
Test passed.

可以看到,程序测试的背后还是发生了很多事。接着,我们尝试着程序出错的情况,比如我们不小心把函数的返回写成了:

return string.upper()

这其实是返回输入字符串的大写了,而我们测试的实例却返回了输入字符串的小写,再运行该脚本(加上参数-v),输出的结果如下:

Failed example:
    string_lower('abc')
Expected:
    'abc'
Got:
    'ABC'
1 items had no tests:
    test_string_lower
**********************************************************************
1 items had failures:
   3 of   3 in test_string_lower.string_lower
3 tests in 2 items.
0 passed and 3 failed.
***Test Failed*** 3 failures.

这时候,程序测试失败,它不仅捕捉到了bug,还清楚地指出错误出在什么地方。我们不难把这个程序修改过来。
??关于doctest模块的更详细的使用说明,可以参考网址:https://docs.python.org/2/library/doctest.html

unittest

?? unittest类似于流行的Java测试框架JUnit,它比doctest更灵活,更强大,能够帮助你以结构化的方式来编写庞大而详尽的测试集。
??我们以一个简单的示例入手,首先我们编写my_math.py脚本,代码如下:

# -*- coding: utf-8 -*-
def product(x, y):
    '''
    :param x: int, float
    :param y: int, float
    :return:  x * y
    '''
    return x * y

该函数实现的功能为:输入两个数x, y, 返回这两个数的乘积。接着是test_my_math.py脚本,完整的代码如下:

import unittest, my_math

class ProductTestcase(unittest.TestCase):

    def setUp(self):
        print('begin test')

    def test_integers(self):
        for x in range(-10, 10):
            for y in range(-10, 10):
                p = my_math.product(x, y)
                self.assertEqual(p, x*y, 'integer multiplication failed')

    def test_floats(self):
        for x in range(-10, 10):
            for y in range(-10, 10):
                x = x/10
                y = y/10
                p = my_math.product(x, y)
                self.assertEqual(p, x * y, 'integer multiplication failed')

if __name__ == '__main__':
    unittest.main()

函数unittest.main负责替你运行测试:在测试方法前执行setUp方法,示例化所有的TestCase子类,并运行所有名称以test打头的方法。assertEqual方法检车指定的条件(这里是相等),以判断指定的测试是成功了还是失败了。
??接着,我们运行前面的测试,输出的结果如下:

begin test
.begin test
.
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

可以看到,该程序运行了两个测试,每个测试前都会输出‘begin test‘,.表示测试成功,若测试失败,则返回的是F
??接着模拟测试出错的情形,将my_math函数中的product方法改成返回:

return x + y

再运行测试脚本,输出的结果如下:

begin test
Fbegin test
F
======================================================================
FAIL: test_floats (__main__.ProductTestcase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_my_math.py", line 20, in test_floats
    self.assertEqual(p, x * y, 'integer multiplication failed')
AssertionError: -2.0 != 1.0 : integer multiplication failed

======================================================================
FAIL: test_integers (__main__.ProductTestcase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_my_math.py", line 12, in test_integers
    self.assertEqual(p, x*y, 'integer multiplication failed')
AssertionError: -20 != 100 : integer multiplication failed

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=2)

两条测试都未通过,返回的是F,并帮助你指出了错误的地方,接下来,你应该能快速地修复这个bug。
??关于unittest模块的更加详细的说明,可以参考网址: https://docs.python.org/3/library/unittest.html

总结

??本文介绍了两个Python中的测试工具: doctest和unittest,并配以简单的例子来说明这两个测试模块的使用方法,希望能对读者有所帮助~

注意:不妨了解下笔者的微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注~

原文地址:https://www.cnblogs.com/jclian91/p/10993010.html

时间: 2024-10-03 19:08:55

Python中的测试工具的相关文章

backtrack中web测试工具

Backtrack 5中Web应用程序风险评估工具使用(Joomscan BlindElephant CMS-Explorer whatweb Plecost WPScan) 2013-03-02 04:03:51|  分类: 工具收集 |  标签:joomscan  blindelephant  whatweb  plecost  wpscan  |举报|字号 订阅 本文将介绍Backtrack 5中web应用程序风险评估模块下的部分工具的详细介绍和使用,包括工具的功能特点,使用方法等.希望对

Python网络质量测试工具增加乱序统计

半月月前,我用Python写了一个工具,可以测试网络的纯丢包率以及探测网络路径中的队列情况,经过一些使用者的反馈,还算比较好用,关于这个工具,请参见<动手写一个探测网络质量(丢包率/RTT/队形等)的工具>.        但是我觉得这个少了关于乱序度的测试功能,于是补充之.其实,在Linux的TC工具上,除了队列,丢包率,延迟之外,乱序度也是一个非常重要的配置参数,不过请记住,Linux不是全部,对于程序员而言,除了抓包之外,了解一点Linux之外的东西,比如Cisco,运营商之类的,还是必

Apache中压力测试工具ab的操作说明

1.压力测试工具ab(ApacheBench)的简单说明 1)     网站性能压力测试是性能调优过程中必不可少的一环.只有让服务器处在高压情况下才能真正体现出各种设置所暴露的问题.Apache中有个自带的,名为ab的程序,可以对Apache或其它类型的服务器进行网站访问压力测试. 2)     ApacheBench命令原理: ab命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问.它的测试目标是基于URL的,因此,既可以用来测试Apache的负载压力,也可以测试ngin

Python中unittest测试根据不同参数组合产生单独的test case的解决方法

在某种情况下,需要用不同的参数组合测试同样的行为,你希望从test case的执行结果上知道在测试什么,而不是单单得到一个大的 test case:此时如果仅仅写一个test case并用内嵌循环来进行,那么其中一个除了错误,很难从测试结果里边看出来. 问题的关键在于是否有办法根据输入参数的不同组合产生出对应的test case:譬如你有10组数据,那么得到10个test case,当然不适用纯手工的方式写那么多个test_成员函数. 一种可能的思路是不利用unittest.TestCase这个

python中使用pycharm2018工具安装Autopep8

PEP 8,Style Guide for Python Code,是Python官方推出编码约定,主要是为了保证 Python 编码的风格一致,提高代码的可读性. 这样的资料网上很多,但是大多都是老版本的,2018版本之前.我使用的是最新版,有很多改动:详细配置参见:有两篇文章写得比较符合我的版本:1.确保两个问题,你的机器已经安装python2.7和pycharm20182.同时要安装autopep8.exe在windown的cmd命令行中运行:pip install autopep8即可下

第一次编写简单的中间件测试工具(1) - 记一次新员工训练营

去年11月,我加入了N记,紧接着进入新员工训练营. 开始一次简单的中间件测试工具编写任务. 这次训练营体验给我的感觉就是:大公司不愧是大公司,这回我终于可以安心学点核心技术了. 任务: 这个训练营有两个任务,一是熟悉这边的敏捷开发流程:二是在训练营里做一定的编码,用python编写一个测试工具(桩,stub). 我们要做的这个工具,是用来测试我们一种通信设备(B)上运行的程序(某种中间件),这个工具模拟另一种通信设备(A),发送一些按特定协议编码的消息给另一种通信设备B,并能反编码设备B返回的消

有了测试工具,傻瓜仍是傻瓜

Kaspar van Dam自2005年以来一直在测试领域活跃着,且自2009年起就专攻测试自动化和性能测试.他在许多公司当过测试工具工程师和测试顾问.他的经验覆盖了测试自动化和性能测试的技术实施以及该工作领域的不同管理与协作任务.在他的公司(荷兰Ordina公司)里,Kaspar是测试自动化的思想领袖之一,负责一部分公司愿景发展和建议.他还负责一些关于测试自动化和性能测试的业务课程. ? 测试工具:人们总是认为测试工具是每个测试难题的解决方案.有了工具实施,测试就会进行地很快,质量更高,自然也

UnityTestTools测试工具

因为工作关系,要了解Unity上的测试工具,该工具基于Nunit框架,通过查阅资料了解到在Unity5.3中做出了一些改变,自带的只剩下单元测试工具,如果想用其他的工具比如断言.集成测试,就需要前往Unity的应用商店搜索UnityTestTools进行进行下载,期待之后的版本整合更多更强大的功能. 测试工具包含: 集成测试框架Integration Test Framework 集成测试允许您在一个场景自动验证过程.在现有内容里直接在编辑器中构建测试验证报告. 断言组件Assertion co

Python渗透测试工具合集

Python渗透测试工具合集 如果你热爱漏洞研究.逆向工程或者渗透测试,我强烈推荐你使用 Python 作为编程语言.它包含大量实用的库和工具, 本文会列举其中部分精华. 网络 Scapy, Scapy3k: 发送,嗅探,分析和伪造网络数据包.可用作交互式包处理程序或单独作为一个库. pypcap, Pcapy, pylibpcap: 几个不同 libpcap 捆绑的python库 libdnet: 低级网络路由,包括端口查看和以太网帧的转发 dpkt: 快速,轻量数据包创建和分析,面向基本的