PYTHON unitest模块

原创
2013/04/24 11:58
阅读数 4.3K

一、

Python 的单元测试中,一般一个测试程序文件负责测试 Python 的一个模块,或者一个模块中的一个代码文件。它们经常以 test_somemodule.py 或 testSomeModule.py 的名字命名;一般保存在被测试模块的一个子目录 tests 中,也有就保存在该模块的根目录的。

如果要编写一个测试程序,需要以 unittest.TestCase 为基类派生,这样 unittest 就可以自动找到这些测试类了。这样的一个测试类中,凡是以“test”开头的方法,都是一个测试用例。

unittest 会自动统计测试用例的个数,并在最后的测试报告中指出测试成功了几个,有那些失败。TestCase 还有两个很有用的方法:在每个测试用例执行之前,写在 setUp 中的代码都会被执行,用来初始化测试环境;而 tearDown 中的代码则负责清除每个测试用例遗留的垃圾,恢复现场。

import unittest
import commands


class TSCache(object):

    def __init__(self):
        # suit initial
        print "case %s"%self

    def doRequest(self):
        comm = "curl -I -s -x  localhost:8080 http://111111.cn/index.html"
        output = commands.getoutput(comm)
        rt = output.split("\r\n")[0]
        return rt

class TestTSCache(unittest.TestCase):

    #run before every test method
    def setUp(self):
        print 'test before'

    def test_200Code(self):
        active = TSCache().doRequest()
        expect = 'HTTP/1.1 200 OK'
        self.assertEquals(expect,active)


    def test_not404(self):
        active = TSCache().doRequest()
        expect = 'HTTP/1.1 404 OK'
        self.assertNotEquals(expect,active)

    #run after every test mehtod
    def tearDown(self):
        print 'test after'

if __name__ == '__main__':
    #print  dir(TestTSCache)
    unittest.main()


二、运行

python xxxx.py

python xxxx.py -v

三、结果

OK  

Fail

Error

四、assert

类型 功能
assertEqual
assertEquals
assertNotEqual
assertNotEquals
assertAlmostEqual
assertAlmostEquals
assertNotAlmostEqual
assertNotAlmostEquals
assertTrue
assertFalse
assertRaises

说明: #当assertEquals失败时,会把第一个和第二个参数的值打印出来;#assertFalse和assertTrue不会打印值

三、testsuit

程序的开头把当前目录、上一级目录和子目录 tests 都放入系统搜寻路径中。这是为了 Python 程序 import 模块代码和测试代码时更容易找到它们。紧接着,在当前目录和子目录 tests 中搜寻所有测试程序,把它们的列表加入到 modules_to_test 中。suite 方法根据前面定义的列表把所有测试用例都找出来。最后通过调用 unittest 的 testrunner 就可以启动我们的所有测试了,我们只要稍等一会儿,它就会把最终的测试报告放到我们面前 

import unittest
import sys
import os
import getopt


"""
path = "/home/wb-yinlu/Beryl/study/Module/Cache/123457_cachexample.py"
path = "/home/wb-yinlu/Beryl/study/Module/Cache/*.py"
path = "/home/wb-yinlu/Beryl/study/Module/Cache/"
"""
         
def getcase(path):
    testfiles = []
    if os.path.isdir(path):
        # curdir and subdir insert to suite
        for root, dirs, files in os.walk(path):
            files = [f[:-3] for f in files if f.startswith('1') and f.endswith('.py')]
            if len(files):
                sys.path.append(root)
                testfiles = testfiles + files
    elif os.path.splitext(path)[1]==".py":
        root = os.path.dirname(path) 
        sys.path.append(root)
        if path[-4:] == "*.py":
            # curdir and subdir insert to suite,not inculde subdir
            testfiles = testfiles + [f[:-3] for f in os.listdir(root) if f.startswith('1') and f.endswith('.py')]
        else:
            if os.path.isfile(path):
                # single py file insert to suite
                testfiles = testfiles+[os.path.basename(path)[:-3]]
            else:
                print "the python file is not exist"
                sys.exit(1)
    else:
         print "it is not a dir or a effective python file path"
         sys.exit(1)
    return testfiles
        
def suite(path):
    print "path = %s"%path
    alltests = unittest.TestSuite()
    for module in map(__import__, getcase(path)):
        alltests.addTest(unittest.findTestCases(module))
    return alltests


def usage():
    print "help help help"


if __name__ == '__main__':


    path = os.curdir
    ver= 1


    opts, args = getopt.getopt(sys.argv[1:], "p:hv",["path=","help"])
    for op, value in opts:
        if op == '-p':
            path = value
        elif op == '-v':
            ver=value
        elif op == '-h':
            usage()
            sys.exit(1)
        else:
            pass
     
    #unittest.main(defaultTest='suite')
    runner = unittest.TextTestRunner(verbosity=ver)
    runner.run(suite(path))

四、

运行测试套

1、命令模式 


python -m unittest test_module1 test_module2
python -m unittest test_module.TestClass
python -m unittest test_module.TestClass.test_method
2、main设置
# unittest.main() # 用这个是最简单的,下面的用法可以同时测试多个类
# unittest.TextTestRunner(verbosity=2).run(suite1) # 这个等价于上述但可设置verbosity=2,省去了运行时加-v
suite1 = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)
suite2 = unittest.TestLoader().loadTestsFromTestCase(TestDictValueFormatFunctions)
suite1 = module1.TheTestSuite()
suite2 = module2.TheTestSuite()
alltests = unittest.TestSuite([suite1, suite2])
unittest.TextTestRunner(verbosity=2).run(suite)


展开阅读全文
打赏
0
3 收藏
分享
加载中
更多评论
打赏
0 评论
3 收藏
0
分享
返回顶部
顶部