Python中的unittest

unittest是Python中自带的一个用于单元测试的库,可以满足我们大部分的测试需求。

以前撸个代码一般只是侧重功能实现,往往对于测试不屑一顾,但是在最近一个小工程上,我初步尝试了一下测试驱动开发的开发流程,发现测试对于开发效率是有提升的,虽然要编写很多测试相关的代码,但是一旦测试完善起来,对于后期我们的代码重构或者代码调试是有很大帮助的。

对于比较小的工程,直接使用unittest基本可以满足我们所有的测试需求。

一个工程样例

这里我贴一下我目前用的工程目录结构:

.
├── demo
│   ├── __init__.py
│   ├── foo.py
│   └── test
│       ├── __init__.py
│       ├── run.py
│       └── test_foo.py
└── runtests.sh

demo是我们示例的工程模块,__init__.py是Python模块必须的一个文件,foo.py是我们的一个工程代码,test下面是所有和测试相关的代码,runtests.sh是运行测试的一个脚本。

foo.py定义了一个待测试的函数:

#!/usr/bin/python3
#-*- coding:utf-8 -*-

def foo(a:int, b:int)->int:
    return a + b

test_foo.py是这个函数的测试代码:

#!/usr/bin/python3
#-*- coding:utf-8 -*-

from unittest import TestCase
from demo.foo import foo

class FooTest(TestCase):

    def test_foo(self):
        self.assertEqual(foo(1, 2), 3)

run.py是提取测试用例的一个小脚本,可以直接运行所有的测试:

#!/usr/bin/python3
#-*- coding:utf-8 -*-

import unittest

def main():
    suites=unittest.TestLoader().discover('./demo/test', pattern='test_*.py')
    runner = unittest.TextTestRunner()
    result = runner.run(suites)
    if(len(result.errors) > 0 or len(result.failures) > 0):
        print("Test failed: ", result)
        exit(1)

if __name__ == "__main__":
    main()

这个脚本会从test目录中提取所有以test_结尾的py文件,并逐一进行测试。

runtest.sh是调用run.py的一个脚本

#!/bin/sh

cd $(dirname $0)
python3 -m demo.test.run "$@"

搞定这些直接每次提交代码之前运行一下测试:

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

OK, 完事提交。


本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

相关文章

发表新评论