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

知识共享许可协议
本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012


相关文章
|
2月前
|
测试技术 Python
【Python30天速成计划】12:单元测试
【Python30天速成计划】12:单元测试
|
2月前
|
测试技术 Python
Python中的单元测试与测试驱动开发(TDD)实践
Python中的单元测试与测试驱动开发(TDD)实践
|
7月前
|
测试技术 数据库连接 持续交付
Python单元测试之道:从入门到精通的全面指南
Python单元测试之道:从入门到精通的全面指南
45 0
|
3月前
|
测试技术 Python
Python自动化测试与单元测试框架
现在越来越多的软件开发人员开始采用Python进行自动化测试和单元测试。Python具有简单易学、灵活性高等特点,加上其丰富的测试框架,使得Python自动化测试和单元测试成为了开发人员不可或缺的一部分。本文将介绍Python自动化测试和单元测试框架的基础知识和使用方法。
|
3月前
|
测试技术 开发者 Python
Python自动化测试与单元测试框架:提升代码质量与效率
在软件开发过程中,测试是不可或缺的环节。Python作为一门广泛应用的编程语言,拥有丰富的自动化测试和单元测试框架,例如unittest和pytest。本文将介绍Python自动化测试的重要性,并深入探讨这两个主流的单元测试框架的特点、使用方法以及优势。通过学习和应用这些框架,开发者可以提高代码质量、提升开发效率,并确保软件在不断迭代中保持稳定。
|
3月前
|
测试技术 Python
Python自动化测试与单元测试框架
自动化测试在软件开发中扮演着重要的角色,可以减少人工测试的时间和成本,提高软件质量。而Python作为一种流行的编程语言,其丰富的库和框架可以让测试变得更加容易和高效。本文将介绍Python自动化测试和单元测试框架,包括unittest和pytest的使用方法、优点和缺点,以及如何根据项目需求选择合适的框架。
|
3月前
|
IDE 测试技术 开发工具
Python 的安全性和测试:在 Python 中如何进行单元测试?
Python 的安全性和测试:在 Python 中如何进行单元测试?
|
3月前
|
测试技术 Python
Python小姿势 - 如何使用Python的unittest模块进行单元测试
Python小姿势 - 如何使用Python的unittest模块进行单元测试
|
8月前
|
存储 测试技术 API
使用Mock思想进行单元测试Python篇
从功能开发完成的定义来看,至少包括:代码本身、文档及单元测试。而往往在实际开发中,由于需求的不停的变化,导致文档及单元测试是开发过程中直接被忽略的内容。反观优秀的开源项目,在全球几千人合作开发的大项目中,仍然能保持代码的高质量,这其中文档和单元测试是必不可少的环节之一。 不同于完整性测试或者冒烟测试,单元测试是为了证明你代码逻辑的正确性,所以必须由开发人员亲自完成,类似在证明“你爸是你爸”。单元测试能够屏蔽80%以上的低级错误,以及在协作开发过程中出现修改公共逻辑造成的潜在风险。一个伴随着单元测试出现的指标叫做覆盖率,即单元测试覆盖的代码行数,简单来说单元测试有没有覆盖代码执行过程中的每一行
142 0

热门文章

最新文章