博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
The Hacker's Guide To Python 单元测试
阅读量:6832 次
发布时间:2019-06-26

本文共 3725 字,大约阅读时间需要 12 分钟。

基本方式

python中提供了非常简单的单元测试方式,利用nose包中的nosetests命令可以实现简单的批量测试。

安装nose

sudo pip install nose

编辑测试文件

# test_true.pydef test_true():    assert Truedef test_false():    assert False

执行测试

# 命令, nosetests命令会加载所有以test_开头的文件,并执行所有以test_开头的函数nosetests -v# 输出test_true.test_true ... oktest_true.test_false ... FAIL======================================================================FAIL: test_true.test_false----------------------------------------------------------------------Traceback (most recent call last):  File "/usr/local/lib/python2.7/site-packages/nose/case.py", line 197, in runTest    self.test(*self.arg)  File "/xxxx/workspace/py/test/test_true.py", line 5, in test_false    assert FalseAssertionError----------------------------------------------------------------------Ran 2 tests in 0.007sFAILED (failures=1

unittest是python提供了单元测试的标准库。

# 为了兼容python 2.6和2.7try:    import unittest2 as unittestexcept ImportError:    import unittestclass TestKey(unittest.TestCase):    def test_keyh(self):        a = ['a']        b = ['a', 'b']        self.assertEqual(a, b)

输出如下,

test_keyh (test_true.TestKey) ... FAIL======================================================================FAIL: test_keyh (test_true.TestKey)----------------------------------------------------------------------Traceback (most recent call last):  File "/home/y/workspace/py/test/test_true.py", line 8, in test_keyh    self.assertEqual(a, b)AssertionError: Lists differ: ['a'] != ['a', 'b']Second list contains 1 additional elements.First extra element 1:b- ['a']+ ['a', 'b']----------------------------------------------------------------------Ran 1 test in 0.006sFAILED (failures=1)

此外,unittest.skipIf可以通过判断条件来选择是否进行测试,

class TestSkipped(unittest.TestCase):    @unitttest.skip("Do not run this")    def test_failt(self):        self.fail("This should not be run")    @unittest.skipIf(mylib is None, "mylib is not available")    def test_mylib(self):        self.assertEqual(1, 1)

此外,自定义setUptearDown函数可以单元测试开始和结束时自动调用。

fixtures

fixtures模块可以用来临时改变当前的测试环境。

import fixturesimport osclass TestEnviron(fixtures.TestWithFixtures):    def test_environ(self):        fixture = self.useFixture(                fixtures.EnvironmentVariable("FOOBAR", "42")) # 临时增加一个环境变量FOOBAR        self.assertEqual(os.environ.get("FOOBAR"), "42")    def test_environ_no_fixture(self):        self.assertEqual(os.environ.get("FOOBAR"), None) # 上面增加的环境变量的操作对于其他函数无效

mock

mock模块可以用来进行模拟测试,其主要功能就是模拟一个函数,类或实例的行为。

由于网络测试环境的特殊性,最常用的使用就是模拟网络请求,具体例子如下,

# test_mock.pyimport requestsimport unittestimport mockclass WhereIsPythonError(Exception):    passdef is_python():    try:        r = requests.get("http://python.org")    except IOError:        pass    else:        if r.status_code == 200:            return 'is python' in r.content    raise WhereIsPythonError('something happened')def get_fake_get(status_code, content):    m = mock.Mock()    m.status_code = status_code    m.content = content    def fake_get(url):        return m    return fake_getdef raise_get(url):    raise IOError("unable to fetch url %s" % url)class TestPython(unittest.TestCase):    @mock.patch('requests.get', get_fake_get(        200, 'is python, hello'        ))    def test_python_is(self):        self.assertTrue(is_python())    @mock.patch('requests.get', get_fake_get(        200, 'is not python, hello'        ))    def test_python_is_not(self):        self.assertFalse(is_python())

输出如下,

# 命令nosetests --tests=test_mock -v# 结果test_python_is (test_mock.TestPython) ... oktest_python_is_not (test_mock.TestPython) ... ok----------------------------------------------------------------------Ran 2 tests in 0.001sOK本文转自cococo点点博客园博客,原文链接:http://www.cnblogs.com/coder2012/p/5092190.html,如需转载请自行联系原作者
你可能感兴趣的文章
forward与sendRedirect
查看>>
spring管理serlvet
查看>>
SDL_AudioSpec结构体分析
查看>>
Maven工程发布tomcat无lib包问题
查看>>
使用Scrapy来爬取自己的CSDN文章 (2)
查看>>
同时查看集群中多台机器日志的简单的shell脚本
查看>>
GemFire核心功能介绍
查看>>
ZUUL源码分析 <一
查看>>
Spring 启动记录(11)
查看>>
SphereView for tag cloud
查看>>
Autoconf和Automake,自动生成Makefile
查看>>
开源 免费 java CMS - FreeCMS1.2-功能说明-系统配置
查看>>
利用Javascript通过WMI取得Windows系统信息
查看>>
上传OpenCart代码到服务器的FTP工具FileZilla使用教程
查看>>
观影《寒战》
查看>>
应用与数据库的 timezone
查看>>
用微博作为商务平台
查看>>
ubuntu16.04 添加以前版本的软件源。
查看>>
hibernate Executing an update/delete query
查看>>
[Zend Studio]报错问题,项目无法启动解决办法
查看>>