常見的python的unittest用法


  python的unittest好處是通過python腳本編寫用例,每個用例可以單獨調試初始化和清理動作,因為都是用例都是代碼所以調試起來也很方便;它的缺點是得先學會python,難易程度見仁見智吧,對於我來說那些用excel來寫測試用例的框架,我看到里面的用例頭都大,還不如看代碼來的簡單呢。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os,sys
import time
import datetime
import unittest

class NginxTest(unittest.TestCase):
    def setUp(self): #如果不需要每個case都預置和清理環境,而是每個class用一次,只需要用setUpClass、tearDownClass代替即可,如果是整個文件只需要用一次,則用要用 setUpModule() 和 tearDownModule() 這兩個函數了,注意是函數,與 TestCase 類同級
        #預置環境
        print '--------------NginxTestSetUp--------------\n'
    def tearDown(self):  
        #清理環境
        print '--------------NginxTestClear--------------\n'  
        
    def test_nginx(self):
        print 'test_nginx'        
   
    def test_nginxlog(self):               
        print 'test_nginxlog'
        
    @unittest.skip("must skipping") #必須跳過下面用例,相當少用
    def test_mustskip(self):
        print 'test_mustskip'
    
    # def test_1(self):
        # a=1
        # return 1
    @unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")#根據條件跳過下面這個用例
    def test_maybeskip(self):
        print 'test_maybeskip'
    
    def suite_1(self):#非test開頭的用例在NginxTest中不會被跑到
        print 'suite_1'
        
    def suite_2(self):
        print 'suite_2'         
    

class PhpTest(unittest.TestCase):#因為每個接口的預置環境可能不一樣,所以每個接口的用例應該都用單獨class來包含,不過每個class的用例都還是要用test開頭
    def setUp(self): 
        #預置環境
        print '--------------PhpTestSetUp--------------\n'
    def tearDown(self):  
        #清理環境
        print '--------------PhpTestClear--------------\n'  
        
    def test_php(self):
        print 'test_php'        
   
    def test_phplog(self):               
        print 'test_phplog'
    
    
def suite():#這個表示測試集,不要放在class內,否則會提示"沒有這樣的測試方法在<class'myapp.tests.SessionTestCase'>:的runTest ",我覺得它唯一的好處就是調試的時候可以單獨調試某個class而已,我一般不用它,調試時可以注釋不需要的class啊 ;-)。不同接口用不同的class也是一種用法,不過那樣用我下面說的import不同py的方法更好,因為所有用例寫在一起的話文件太大了 ;-)。
    suite = unittest.TestSuite()
    suite.addTest(NginxTest("suite_1"))
    suite.addTest(NginxTest("suite_2"))
    suite.addTest(PhpTest("test_php"))
    suite.addTest(PhpTest("test_phplog"))
    unittest.TextTestRunner().run(suite)
    
if __name__ == '__main__':
    # unittest.main(exit = False,verbosity=2)#它是全局方法,把它屏蔽后,不在suite的用例就不會跑,exit = False表示中間有用例失敗也繼續執行;還有比較常用的verbosity=2,表示顯示def名字
    suite()#執行suite

  如果接口相當多,為了方便維護,建議每個case用獨立的py來寫,然后用一個“總入口”去import所有py,然后再調用就行了,這是suite就派上用場了

  舉個例子,luatestcase.py如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import time
import datetime
import unittest

class LuaTest(unittest.TestCase):
    def runTest(self):
        print 'anything'
    def setUp(self): 
        #預置環境
        print '--------------LuaTestsetUp--------------\n'
    def tearDown(self):  
        #清理環境
        print '--------------LuaTestclear--------------\n'  
        
    def test_lua(self):
        print 'test_lua'        
   
    def test_lualog(self):               
        print 'test_lualog'
        
def casesuite():
    suite = unittest.TestSuite()
    suite.addTest(LuaTest("test_lua"))
    suite.addTest(LuaTest("test_lualog"))
    unittest.TextTestRunner().run(suite)

  調用luatestcase.py的“總入口py”就得這樣寫:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os,sys
import time
import datetime
import unittest

import luatestcase

if __name__ == '__main__':
    luatestcase.casesuite()

  如果luatestcase.py沒有用casesuite“收集”它的用例的話,總入口調不了里面的用例的,不知道是不是我的用法有問題,如果有朋友知道歡迎指點。有的文章說用discover可以實現同樣的需求,不過我不會。。。

  如果要保存unitest的測試輸出日志,則需要用到TextTestRunner,例子如下

log_file = "log_file.txt"
f = open(log_file, "w")
runner = unittest.TextTestRunner(stream=f,verbosity=2)
unittest.main(exit = False,testRunner=runner)
f.close()

  補充一個方法:每個接口的測試用例按照普通的unittest格式來寫,放到統一的目錄中,然后用一個總的py去遍歷這些unittest文件,然后用os.popen打開,把這些用例的測試結果read下來保存到一個總的log文件中就行了。  

  最后說一下,我最常用的方法是assertEqual、assertNotEqual、assertTrue。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM