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点点博客园博客,原文链接:http://www.cnblogs.com/coder2012/p/5092190.html,如需转载请自行联系原作者
相关文章
|
2天前
|
监控 测试技术 持续交付
Python自动化测试代理程序可用性
总之,通过编写测试用例、自动化测试和设置监控系统,您可以确保Python自动化测试代理程序的可用性,并及时发现和解决问题。这有助于提供更可靠和高性能的代理服务。
11 4
|
4天前
|
机器学习/深度学习 算法 UED
【Python 机器学习专栏】A/B 测试在机器学习项目中的应用
【4月更文挑战第30天】A/B测试在数据驱动的机器学习项目中扮演关键角色,用于评估模型性能、算法改进和特征选择。通过定义目标、划分群组、实施处理、收集数据和分析结果,A/B测试能帮助优化模型和用户体验。Python提供工具如pandas和scipy.stats支持实验实施与分析。注意样本量、随机性、时间因素和多变量分析,确保测试有效性。A/B测试助力于持续改进机器学习项目,实现更好的成果。
|
6天前
|
测试技术 Python
python运行集成测试
【4月更文挑战第22天】
7 1
|
6天前
|
测试技术 Python
python编写集成测试
【4月更文挑战第22天】
4 1
|
6天前
|
数据可视化 测试技术 持续交付
python分析测试结果
【4月更文挑战第21天】
16 3
|
6天前
|
XML 测试技术 持续交付
python运行集成测试
【4月更文挑战第21天】
16 2
|
6天前
|
测试技术 Python
python编写集成测试用例
【4月更文挑战第21天】
14 1
|
7天前
|
IDE 测试技术 持续交付
【专栏】Python自动化测试与单元测试框架:提升代码质量与效率
【4月更文挑战第27天】本文探讨了Python自动化测试与单元测试框架在提升代码质量与效率中的作用。Selenium、Appium用于Web和移动应用自动化测试,pytest提供强大、易扩展的测试支持。unittest是Python标准的单元测试框架,支持结构化测试用例和丰富的断言。实践中,应制定测试计划,编写高质量测试用例,实行持续集成与测试,并充分利用测试报告。这些工具和策略能有效保障代码质量和提升开发效率。
|
7天前
|
测试技术 API 持续交付
【专栏】Python自动化测试与单元测试框架
【4月更文挑战第27天】本文探讨了Python在自动化测试与单元测试中的应用,强调其简洁语法和丰富库的优势。文章分为三部分:首先,阐述自动化测试的重要性及Python的易学性、库支持、跨平台和社区支持;其次,介绍了Python的Unittest标准测试框架和Pytest第三方框架的特点与用法;最后,讨论了Web UI和API自动化测试实践,并提出持续集成、测试金字塔等最佳实践。Python为软件开发的测试环节提供了强大支持,帮助构建更稳定的系统。
|
9天前
|
Web App开发 人工智能 Java
Python Selenium实现自动化测试及Chrome驱动使用
Python Selenium实现自动化测试及Chrome驱动使用
10 2