文档章节

[有码有真相]python unittest2 源码解读及各类运行测试方法示例

laugh2last
 laugh2last
发布于 2015/09/12 21:30
字数 1282
阅读 1544
收藏 6

一、注意环境:

二、代码自说话:

# coding:utf-8
'''

Created on 2015年9月10日

@author: laughlast
'''
import os
import sys
import copy
import unittest2
import HTMLTestRunner


def is_prime(number):
    '''return true if *number* is prime.
    '''
    if number <= 1:
        return False
    for element in range(2, number):
        if number % element == 0:
            return False
    return True


def get_next_prime(number):
    '''get the closest prime larger then *number*.
    '''
    index = number
    while True:
        index = index + 1
        if is_prime(index):
            return index
    return None


class PrimesTestsBase(unittest2.TestCase):

    u'''测试一个整数是否为素数以及求一个整数后面的下一个素数(全ok)
    '''

    _NopeMsg = '{} should be not a prime!'
    _OkMsg = '{} should be a prime!'

    @classmethod
    def setUpClass(cls):
        '''demo setUpClass: begin
        '''
        print 'begin'

    @classmethod
    def tearDownClass(cls):
        '''demo tearDownClass()
        '''
        print 'end'

    def test_is_1_prime(self):
        '''1 should not be prime!
        '''
        self.assertFalse(is_prime(1), self._NopeMsg.format(1))

    def test_is_2_prime(self):
        '''2 should be prime!
        '''
        self.assertTrue(is_prime(2), self._OkMsg.format(2))

    def test_is_3_prime(self):
        '''3 should not be prime!
        '''
        self.assertTrue(is_prime(3), self._OkMsg.format(3))

    def test_is_4_prime(self):
        '''4 should not be prime!
        '''
        self.assertFalse(is_prime(4), self._NopeMsg.format(4))

    def test_is_5_prime(self):
        '''5 should be prime!
        '''
        self.assertTrue(is_prime(5), self._OkMsg.format(5))

    def test_is_negtive_prime(self):
        '''negtive should be not prime
        '''
        for k in range(-1, -10, -1):
            self.assertFalse(is_prime(k), self._NopeMsg.format(k))


class PrimesTestsWithRunTestOverrided(PrimesTestsBase):

    u'''复写TestCase的"runTest" 方法
    '''

    def runTest(self):
        '''pass'''
        assert True


class PrimesTestsWithRunOverrided(PrimesTestsBase):

    u'''复写TestCase的"run"方法
    '''

    def run(self, result=None):
        '''overriding the "run" to set result.failfast etc'''
        if result is None:
            result = unittest2.TestResult(verbosity=2)
        result.failfast = True
        super(PrimesTestsBase, self).run(result)

    def test_is_4_prime(self):
        '''4 should not be prime!'''
        self.fail(self._NopeMsg.format(4))


class PrimesTestsWith4thFailedAsExpected(PrimesTestsBase):

    u'''复写第4个测试方法使其失败并以 "expectedFailure" 装饰包装
    '''

    # take the test failed as 'expected failures' instead of 'failed'
    @unittest2.expectedFailure
    def test_is_4_prime(self):
        '''4 should not be prime!'''
        self.fail(self._NopeMsg.format(4))


class PrimesTestsWith4thFailed(PrimesTestsBase):

    u'''复写第4个测试方法使其失败
    '''

    def test_is_4_prime(self):
        '''4 should not be prime!'''
        self.fail(self._NopeMsg.format(4))


class RunUnittestDemo(unittest2.TestCase):

    u'''测试 unittest 不同的运行测试方法
    '''

    def setUp(self):
        self.tloader = unittest2.defaultTestLoader
        self.trunner = unittest2.TextTestRunner(verbosity=2, failfast=True)

    def test_run_With4thFailed(self):
        u'''运行包含一个失败的测试方法
        '''
        tsuite = self.tloader.loadTestsFromTestCase(PrimesTestsWith4thFailed)
        tresult = self.trunner.run(tsuite)
        # unittest2.TestCase的longMessage缺省为True,在trace信息后添加用户信息
        assert self.longMessage
        assert tresult.failures[0][1].index(PrimesTestsBase._NopeMsg.format(4))
        assert not tresult.wasSuccessful()
        if self.trunner.failfast:
            assert tresult.testsRun is 4
        else:
            assert tresult.testsRun is tsuite.countTestCases()

    def test_run_With4thFailedAsExpected(self):
        u'''运行包含一个失败的并以期望失败包装装饰的测试方法
        '''
        tsuite = self.tloader.loadTestsFromTestCase(PrimesTestsWith4thFailedAsExpected)
        self.trunner.failfast = True
        tresult = self.trunner.run(tsuite)
        assert tresult.wasSuccessful()
        assert tresult.testsRun is tsuite.countTestCases()

    def test_run_WithRunTestOverrided(self):
        u'''运行包含一个runTest实现的测试方法
        '''
        # 测试案例TestCaseClass无参数实例化缺省执行其 runTest 方法
        tresult = PrimesTestsWithRunTestOverrided().run()
        assert tresult.testsRun is 1 and tresult.wasSuccessful()
        # TestLoader缺省加载 test 开头的测试方法(不包括 runTest)
        tsuite = self.tloader.loadTestsFromTestCase(PrimesTestsWithRunTestOverrided)
        tresult = self.trunner.run(tsuite)
        assert tresult.testsRun is tsuite.countTestCases() \
            and tsuite.countTestCases() is 6

    def test_run_WithRunOverrided(self):
        u'''复写TestCase类中的run(result),通过设置result参数控制执行流程等
        '''
        tsuite = self.tloader.loadTestsFromTestCase(PrimesTestsWithRunOverrided)
        tresult = self.trunner.run(tsuite)
        assert not tresult.wasSuccessful()
        # 对应run()中result.failfast为True,跳过执行失败案例后面的两个案例执行
        assert tresult.testsRun is tsuite.countTestCases() - 2

    def test_run_verify_testsuite_runned(self):
        u'''检查测试执行后的 TestSuite 实例本身变化
        '''
        tresult = unittest2.TestResult()
        tsuite = unittest2.TestSuite([PrimesTestsBase('test_is_1_prime')])
        tsuitedcp = copy.deepcopy(tsuite)
        tsuitescp = copy.copy(tsuite)
        tsuite.run(tresult)
        assert tresult.wasSuccessful() \
            and tresult.testsRun is 1
        # 测试案例执行后,所在测试集中不再保留其实例引用(被设为None)
        assert tsuite._tests == [None] \
            and tsuite.countTestCases() is 1\
            and tsuite._removed_tests is 1
        # copy引用的非深度copy有问题
        assert tsuite == tsuitescp and tsuite is not tsuitescp
        tsuite.addTest(PrimesTestsBase('test_is_2_prime'))
        # TestSuite 以addTest添加测试案例时是在持有的测试序列后append
        with self.assertRaises(TypeError):
            # 新测试案例追加到测试序列列表中原来执行过的案例后
            assert tsuite._tests[0] is None \
                and isinstance(tsuite._tests[1], PrimesTestsBase)
            # 沿用的tsuite中原已执行案例的引用被替换为None,当然 TypeError
            tsuite(tresult)
        # deepcopy没有问题
        assert tsuitedcp.run(tresult).wasSuccessful()

    def test_run_verify_testloader(self):
        u'''验证TestLoader加载测试案例的其它方法
        '''
        import test_unittest_demo
        fullname_tm = 'test_unittest_demo.PrimesTestsBase.test_is_1_prime'
        relativename_tm = 'PrimesTestsBase.test_is_1_prime'
        tsuite1 = self.tloader.loadTestsFromName(fullname_tm)
        tsuite2 = self.tloader.loadTestsFromName(relativename_tm,
                                                 test_unittest_demo)
        tsuite3 = self.tloader.loadTestsFromNames([fullname_tm])
        tsuite4 = self.tloader.loadTestsFromNames([relativename_tm],
                                                  test_unittest_demo)
        assert tsuite1.countTestCases() == tsuite2.countTestCases()\
            == tsuite3.countTestCases() == tsuite4.countTestCases() == 1
        fullname_tc = 'test_unittest_demo.PrimesTestsBase'
        relativename_tc = 'PrimesTestsBase'
        tsuite1 = self.tloader.loadTestsFromName(fullname_tc)
        tsuite2 = self.tloader.loadTestsFromName(relativename_tc,
                                                 test_unittest_demo)
        assert tsuite1.countTestCases() == tsuite2.countTestCases() == 6

        tpath = os.path.split(os.path.realpath(__file__))[0]
        # 最简单
        tsuite1 = self.tloader.loadTestsFromName('test_unittest_demo')
        # 常用也实用
        tsuite2 = self.tloader.discover(tpath, 'test*unittest*.py')
        # 最快(不用额外导入解析)
        tsuite3 = self.tloader.loadTestsFromModule(test_unittest_demo, False)
        assert tsuite1.countTestCases() == tsuite2.countTestCases()\
            == tsuite3.countTestCases()

    def test_run_single_testmethod(self):
        u'''运行本例中其它地方没有出现的单个测试方法案例
        '''
        # tresult可为以下测试执行方法共享,注意测试结果
        tresult = unittest2.TestResult()
        assert PrimesTestsBase('test_is_1_prime').run(tresult).wasSuccessful()\
            and tresult.wasSuccessful() and tresult.testsRun is 1
        # 测试案例TestCaseClass无参数实例化缺省执行其 runTest 方法
        assert PrimesTestsWithRunTestOverrided().run(tresult).wasSuccessful()\
            and tresult.wasSuccessful() and tresult.testsRun is 2
        tsuite = unittest2.TestSuite()
        tsuite.addTest(PrimesTestsBase('test_is_1_prime'))
        # 避免直接在连续独立测试中使用上一执行过的 TestSuite 实例,参见例中另外demo方法
        tsuitecopy = copy.deepcopy(tsuite)
        tsuite.run(tresult)
        assert tresult.wasSuccessful() and tresult.testsRun is 3
        # TestSuite自调用是实现 '__call__'来内部引用run(*a,**k)
        tsuitecopy(tresult)
        assert tresult.wasSuccessful() and tresult.testsRun is 4

if __name__ == '__main__':
    tloader = unittest2.defaultTestLoader
    tpath = os.path.split(os.path.realpath(__file__))[0]
    tsuite = tloader.discover(tpath, 'test*unittest*.py')
#     trunner = unittest2.TextTestRunner(verbosity=2, failfast=True)
#     tresult = trunner.run(tsuite)
#     assert not tresult.wasSuccessful()
#     print tresult
    treport = file(tpath + '\\test_primes.html', 'wb')
    htrunner = HTMLTestRunner.HTMLTestRunner(stream=treport, verbosity=2,
                                             title='test primes and unittest',
                                             description='test primes and unittest demos report')

    htresult = htrunner.run(tsuite)
    treport.close()
    print htresult

三、测试结果

© 著作权归作者所有

共有 人打赏支持
laugh2last
粉丝 0
博文 18
码字总数 5620
作品 0
深圳
部门经理
私信 提问
python nose(一)

Note to Users Nose has been in maintenance mode for the past several years and will likelycease without a new person/team to take over maintainership. New projectsshould conside......

人生如梦19
2016/04/06
26
0
Python模块详解

Python为开发人员提供了丰富的模块,通过这些模块,我们就可快速开发出功能强大的程序。本笔记记录我所接触或学习过的Python模块,为想学习Python的朋友提供一个参考。 Table of Contents 1....

长平狐
2012/09/20
2.9K
0
python MySQLdb安装和使用

MySQLdb是Python连接MySQL的模块,下面介绍一下源码方式安装MySQLdb: 首先要下载下载:请到官方网站http://sourceforge.net/projects/mysql-python/或者点击链接下载http://downloads.sour...

我的去哈哈
2014/03/28
0
2
微服务跨语言 gRPC 之 Java & Python

本文旨在说明 spring-boot-starter-grpc 框架与 Python 之间跨语言 RPC 调用的友好实现。阅读本文前,请详细阅读 wiki文档,以便了解 的工作原理。 Java Server & Client 模块说明: sample...

Anoyi
2018/09/29
0
0
Django 1.3 首个Alpha版发布

Django 1.3首个Alpha版发布!Django 是一个开放源代码的Web应用框架,由Python写成。 1.3新改进: 基于Class的视图:新增了一个框架,可以使用一个类作为视图; 日志:支持Python的 logging模...

小编辑
2010/11/14
614
1

没有更多内容

加载失败,请刷新页面

加载更多

day11

architect刘源源
今天
6
0
论学好Linux系统的超级重要性

不知道各位在日常的工作生活中有没有接触过“rm -rf /*”这个命令,因为这个命令搞出来的事情可还不少呢!前段时间就在一个群里看到了有个小伙子,老板让他去维护一下服务器,这小伙也不太懂...

Linux就该这么学
昨天
6
0
git 使用

1,首先在github配置好信息和仓库,然后在本地进行操作 git init git config user.name 'zhangwuer' git config user.email '56789053@qq.com' 2,与远程分支建立连接 git checkout -b test......

天王盖地虎626
昨天
3
0
git checkout 命令详解

在日常的git操作中,git checkout——检出,是我们的常用命令。最为常用的两种情形是创建分支和切换分支。 在下面的命令中,使用了一些简写,在这里说明一下: git st # git statusgit ci ...

shzwork
昨天
10
0
【Nginx】Nginx多级代理,获取客户端真实请求IP以及每级代理IP

Nginx多级代理,获取客户端真实请求IP以及每级代理IP 如图所示,每一级nginx里的location配置里需要加上对应的配置,最后一级nginx是直接到应用,测试时为了方便,直接用echo模块去测试,打印...

薛定谔的旺
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部