The Hacker's Guide To Python 单元测试
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)
此外,自定义setUp
和tearDown
函数可以单元测试开始和结束时自动调用。
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 单元测试的更多相关文章
- 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 ...
- [译]PyUnit—Python单元测试框架(1)
1. 原文及参考资料 原文链接:http://docs.python.org/2/library/unittest.html# 参考文档: http://pyunit.sourceforge.net/ ...
- 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 ...
- Python单元测试PyUnit框架轻度整改
原理 参考:单元测试原理 背景 年后有段时间没写代码了,所以趁着周末找了个python单元测试玩下,测试自己的Android应用.发现PyUnit虽然在单个脚本文件中添加多个测试用例,比如官网提供的方 ...
- Python单元测试框架
目录 概况 系统要求 使用PyUnit构建自己的测试 安装 测试用例介绍 创建一个简单测试用例 复用设置代码:创建固件 包含多个测试方法的测试用例类 将测试用例聚合成测试套件 嵌套测试用例 测试代码的 ...
- 一种数据与逻辑分离的Python单元测试工具
一种数据与逻辑分离的Python单元测试工具 几个概念 TestCase TestCase是一个完整的测试单元,最小的测试执行实体,就是我们常说的测试用例. TestSuite 以某种特性将测试用例组 ...
- Python单元测试框架之pytest 4 -- 断言
From: https://www.cnblogs.com/fnng/p/4774676.html Python单元测试框架之pytest -- 断言 2015-08-31 23:57 by 虫师, ...
- Python单元测试框架之pytest 3 -- fixtures
From: https://www.cnblogs.com/fnng/p/4769020.html Python单元测试框架之pytest -- fixtures 2015-08-29 13:05 b ...
- Python单元测试框架之pytest 2 -- 生成测试报告
From: https://www.cnblogs.com/fnng/p/4768239.html Python单元测试框架之pytest -- 生成测试报告 2015-08-29 00:40 by ...
随机推荐
- Knockout.js随手记(6)
实时反映对象属性的变化 在前一篇博客中我们使用了如下代码去新增user对象,即push方法: $("#btnAddUser").click(function () { vm.use ...
- Matlab 读取文件夹中所有的bmp文件
将srcimg文件下的bmp文件转为jpg图像,存放在dstimg文件夹下 str = 'srcimg'; dst = 'dstimg'; file=dir([str,'\*.bmp']); :len ...
- Flex Layout Attribute
GitHub: https://github.com/StefanKovac/flex-layout-attribute 引入基本的样式,可以更好的布局,可以在线制作: http://progress ...
- Axure 自适应视图
假设B为A的子视图 继承: A更新 文字内容.交互事件.禁用: 位置.尺寸.样式.交互样式 时, B都会继承响应更新变化 B更新 文字内容.交互事件.禁用时,A也会更新 B更新 位置.尺寸.样式.交互 ...
- 视图views粗略理解
>>>>>> >>>> 创建视图: create view goodsavgview as select cat_id,avg(shop_ ...
- selenium使用笔记(三)——元素定位
selenium进行自动化测试的一个很重要的东西那就是元素定位,如果元素都没法定位就无法操作它,也就无法进行自动化测试了.网上对于元素定位有很多的介绍,很详细很详细的,但是依然有很多新手总是会遇到无法 ...
- VS2012调试时很慢的解决方案
1.转自http://guooge.com/archives/408.html VS2010调试极慢获取出现死机,因为启动了IntelliTrace Visual Studio 2010 Ulti ...
- Git 基本概念及常用命令
一.基本概念 文件的三种状态:(任何一个文件在git中都有以下三种状态) 1) 已提交(committed):表示该文件已经被安全地保存在本地数据库中了. 2) 已修改(modified):表示修改了 ...
- volatile不能保证原子性
1.看图自己体会 2.体会不了就给你个小程序 package cs.util; public class VolatileDemo { private volatile int count =0; p ...
- 使用TextUtils.isEmpty简单化代码
如果让你判断一个文本框是否为空(null)或者没有任何值(length=0),你会怎么怎样去写代码,很多初学者可能会这样写: if(text==null || text.length==0) {... ...