Python单元测试(doctest和unittest)

本文介绍了Python中的两种单元测试方法:doctest和unittest。通过示例详细展示了如何使用这两种方法来编写有效的测试用例,确保代码质量。

docstring

def collect_vowels(s):
    """ (str) -> str

    Return the vowels (a, e, i, o, and u) from s.

    >>> collect_vowels('Happy Anniversary!')
    'aAiea'
    >>> collect_vowels('xyz')
    ''
    """

    vowels = ''
    for char in s:
        if char in 'aeiouAEIOU':
            vowels = vowels + char
    return vowels
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

通常我们可以在Python函数的docstring总编写一些测试用例其格式如下:

>>>func(param1)
return_value1
>>>func(param2)
return_value2
  
  • 1
  • 2
  • 3
  • 4

doctest

使用Python的doctest库,可以一次性运行函数中所有的测试用例。
直接在交互式会话中

>>> import doctest
>>> doctest.testmod()
TestResults(failed=0, attempted=2)
  
  • 1
  • 2
  • 3

或在模块末尾中加入:

if __name__=='__main__':
    import doctest
    doctest.testmod()
  
  • 1
  • 2
  • 3

这样,每次在调用模块时都会先进行单元测试。

unittest

Python的unittest模块提供了类似doctest的测试框架。但是和doctest不同,unittest可以和待测试的函数分开编写。
如下的doctest可以被翻译成对应unittest

def get_divisors(num, possible_divisors):
    ''' (int, list of int) -> list of int

    Return a list of the values from possible_divisors
    that are divisors of num.

    >>> get_divisors(8, [1, 2, 3])
    [1, 2]
    >>> get_divisors(4, [-2, 0, 2])
    [-2, 2]
    '''

    divisors = []
    for item in possible_divisors:
        if item != 0 and num % item == 0:
            if num % item == 0:
                divisors.append(item)
    return divisors
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

对应的unittest如下

import unittest
import divisors

class TestDivisors(unittest.TestCase):
    """Example unittest test methods for get_divisors."""

    def test_divisors_example_1(self):
        """Test get_divisors with 8 and [1, 2, 3]."""

        actual = divisors.get_divisors(8, [1, 2, 3])
        expected = [1, 2]
        self.assertEqual(expected, actual)  

    def test_divisors_example_2(self):  
        """Test get_divisors with 4 and [-2, 0, 2]."""

        actual = divisors.get_divisors(4, [-2, 0, 2])
        expected = [-2, 2]
        self.assertEqual(expected, actual)
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

调用unittest.main(),会检查当前模块内所有TestCase的子类,然后带用以”test”开头的方法,报告不符合预期的结果。
当在IDLE中调用unittest时,形参exit应当被赋值为False:unittest.main(exit=False)
一般地,每一个待测试的函数有一个TestCase子类,每一次函数调用对应一个test方法。

选择测试用例

一般在选择测试用例时,考虑一下因素:

  • 大小
    对于集合(string,list,tuple,dict)
    • 空集合
    • 单元素集
    • 最少数量用例
    • 较多用例
  • 对分
    • 奇数/偶数
    • 正/负
    • 空/满
  • 边界
    函数在接近阈值的时候处理不同,测试阈值。
  • 顺序
    函数对不同顺序的输入值,测试不同的顺序。

通常不同的种类会有重叠,所以一个测试用例可能归属于不止一个类别。

转自:

http://blog.youkuaiyun.com/u012151283/article/details/77511806

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值