The Hacker's Guide To Python 单元测试

基本方式

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

安装nose

sudo pip install nose

编辑测试文件

# test_true.py
def test_true():
assert True def test_false():
assert False

执行测试

# 命令, nosetests命令会加载所有以test_开头的文件,并执行所有以test_开头的函数
nosetests -v
# 输出
test_true.test_true ... ok
test_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 False
AssertionError ----------------------------------------------------------------------
Ran 2 tests in 0.007s FAILED (failures=1

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

# 为了兼容python 2.6和2.7
try:
import unittest2 as unittest
except ImportError:
import unittest class 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.006s FAILED (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 fixtures
import os class 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.py
import requests
import unittest
import mock class WhereIsPythonError(Exception):
pass def 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_get def 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) ... ok
test_python_is_not (test_mock.TestPython) ... ok ----------------------------------------------------------------------
Ran 2 tests in 0.001s OK

The Hacker's Guide To Python 单元测试的更多相关文章

  1. Hacker's guide to Neural Networks

    Hacker's guide to Neural Networks Hi there, I'm a CS PhD student at Stanford. I've worked on Deep Le ...

  2. [译]PyUnit—Python单元测试框架(1)

    1. 原文及参考资料 原文链接:http://docs.python.org/2/library/unittest.html# 参考文档: http://pyunit.sourceforge.net/ ...

  3. The Hitchhiker’s Guide to Python! — The Hitchhiker's Guide to Python

    The Hitchhiker's Guide to Python! - The Hitchhiker's Guide to Python The Hitchhiker's Guide to Pytho ...

  4. Python单元测试PyUnit框架轻度整改

    原理 参考:单元测试原理 背景 年后有段时间没写代码了,所以趁着周末找了个python单元测试玩下,测试自己的Android应用.发现PyUnit虽然在单个脚本文件中添加多个测试用例,比如官网提供的方 ...

  5. Python单元测试框架

    目录 概况 系统要求 使用PyUnit构建自己的测试 安装 测试用例介绍 创建一个简单测试用例 复用设置代码:创建固件 包含多个测试方法的测试用例类 将测试用例聚合成测试套件 嵌套测试用例 测试代码的 ...

  6. 一种数据与逻辑分离的Python单元测试工具

    一种数据与逻辑分离的Python单元测试工具 几个概念 TestCase TestCase是一个完整的测试单元,最小的测试执行实体,就是我们常说的测试用例. TestSuite 以某种特性将测试用例组 ...

  7. Python单元测试框架之pytest 4 -- 断言

    From: https://www.cnblogs.com/fnng/p/4774676.html Python单元测试框架之pytest -- 断言 2015-08-31 23:57 by 虫师, ...

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

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

  9. Python单元测试框架之pytest 2 -- 生成测试报告

    From: https://www.cnblogs.com/fnng/p/4768239.html Python单元测试框架之pytest -- 生成测试报告 2015-08-29 00:40 by ...

随机推荐

  1. dir命令只显示文件名

    dir /b 就是ls -f的效果 1057 -- FILE MAPPING_web_archive.7z 2007 多校模拟 - Google Search_web_archive.7z 2083 ...

  2. gcc -Wall -pedantic -ansi(转载)

    转载自R-G-Y-CQ的新浪博客 -Wall显示所有的警告信息 -Wall选项可以打开所有类型的语法警告,以便于确定程序源代码是否是正确的,并且尽可能实现可移植性. 对Linux开发人员来讲,GCC给 ...

  3. 学习微信小程序之css9内边距

    padding内边距 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  4. 对html与body的一些研究与理解

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=259 一.写在前面的最 ...

  5. Windows Commands and API

    Shortcuts ... Symbolic Links https://en.wikipedia.org/wiki/NTFS_symbolic_link Hard Links https://en. ...

  6. CI框架使用PHPmail插件发送QQ邮件:

    有助请顶,不好请评.0:33 2016/3/12CI框架使用PHPmail插件发送QQ邮件:发送成功,不过修改了主机参数,还包含了一个phpmail中的一个另外的文件,详见下方:参见:http://c ...

  7. linux 目录权限的特殊之处

    目录的读权限,不能进入目录.仅允许我们读目录,获得在该目录中所有文件名的列表,但无法查看目录中文件的内容. 目录的执行权限,可以进入目录,但不允许我们读取目录的文件列表,但可以查看目录中文件的内容.当 ...

  8. overflow:hidden清除浮动原理

    overflow:hidden的意思是超出部分去掉,如果父元素height为auto,内部元素浮动,势必会将内部元素全部隐藏,故计算出内部浮动高度顺便清除浮动.

  9. MongoDB aggregate 运用篇

    基础知识 操作符介绍: $project:包含.排除.重命名和显示字段 $match:查询,需要同find()一样的参数 $limit:限制结果数量 $skip:忽略结果的数量 $sort:按照给定的 ...

  10. AngularJS:自定义过滤器

    表达式:         {{ expression | filter1 | filter2 | ... }}         {{ expression | filterName : paramet ...