單元測試剖析

通常狀況下須要注意以下python

1 代碼要作到功能邏輯正確,必須作到分類正確而且完備無遺漏,同時每一個分類的處理邏輯必須正確;web

2 單元測試是對軟件中的最小可測試單元在與軟件其餘部分相隔離的狀況下進行的代碼級測試;瀏覽器

3 樁代碼起到了隔離和補齊的做用,使被測代碼可以獨立編譯、連接,並運行。架構

默認遵循以下幾個原則框架

1 並非全部的代碼都要進行單元測試,一般只有底層模塊或者核心模塊的測試中才會採用單元測試。ide

2 你須要肯定單元測試框架的選型,這和開發語言直接相關。好比,Java 最經常使用的單元測試框架是 Junit 和 TestNG;C/C++ 最經常使用的單元測試框架是 CppTest 和 Parasoft C/C++test;框架選型完成後,你還須要對樁代碼框架和 Mock 代碼框架選型,選型的主要依據是開發所採用的具體技術棧。函數

一般,單元測試框架、樁代碼 /Mock 代碼的選型工做由開發架構師和測試架構師共同決定。工具

3 爲了可以衡量單元測試的代碼覆蓋率,一般你還須要引入計算代碼覆蓋率的工具。不一樣的語言會有不一樣的代碼覆蓋率統計工具,好比 Java 的 JaCoCo,JavaScript 的 Istanbul。在後續的文章中,我還會詳細爲你介紹代碼覆蓋率的內容。單元測試

4 最後你須要把單元測試執行、代碼覆蓋率統計和持續集成流水線作集成,以確保每次代碼遞交,都會自動觸發單元測試,並在單元測試執行過程當中自動統計代碼覆蓋率,最後以「單元測試經過率」和「代碼覆蓋率」爲標準來決定本次代碼遞交是否可以被接受。測試

5 若是你有開發背景,那麼入門單元測試是比較容易的。但真正在項目中全面推行單元測試時,你會發現還有一些困難須要克服:

6 緊密耦合的代碼難以隔離;

7 隔離後編譯連接運行困難;

8 代碼自己的可測試性較差,一般代碼的可測試性和代碼規模成正比;

沒法經過樁代碼直接模擬系統底層函數的調用;

9 代碼覆蓋率越日後越難提升。

附錄python簡單單元測試範例

#_author: mingo #date: 2019/10/16# encoding=utf-8#!/usr/bin/env python# -*- coding: utf-8 -*-
import sysimport unittest

class TestMountain(unittest.TestCase):
   def setUp(self):        pass
   def test_it_is_true(self):        self.assertTrue(1 == 0)        #self.assertTrue(1 != 0)
   def test_it_is_false(self):        self.assertFalse(1 == 0)

def suite():    loader = unittest.TestLoader()    suite = unittest.TestSuite()    suite.addTests(loader.loadTestsFromTestCase(TestMountain))    return suite
if __name__ == '__main__':    res = unittest.TextTestRunner(verbosity=2).run(suite())    sys.exit(0)

附錄excel驅動測試

#_author: mingo #date: 2019/10/16# encoding=utf-8from selenium import webdriverimport unittest, timeimport logging, tracebackimport ddtfrom xm.ExcelUtil import ParseExcelfrom selenium.common.exceptions import NoSuchElementException
"""ddt單元測試,不用for循環,以元組方式獲取數據"""

# 初始化日誌對象logging.basicConfig(    # 日誌級別    level = logging.INFO,    # 日誌格式    # 時間、代碼所在文件名、代碼行號、日誌級別名字、日誌信息    format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',    # 打印日誌的時間    datefmt = '%a, %Y-%m-%d %H:%M:%S',    # 日誌文件存放的目錄(目錄必須存在)及日誌文件名    filename = 'e:/dataDriveRreport.log',    # 打開日誌文件的方式    filemode = 'w')
excelPath = 'data.xlsx'sheetName = "搜索數據表"# 建立ParseExcel類的實例對象excel = ParseExcel(excelPath, sheetName)
@ddt.ddtclass TestDemo(unittest.TestCase):
   def setUp(self):        self.driver = webdriver.Chrome()
   @ddt.data(*excel.getDatasFromSheet())    def test_dataDrivenByFile(self, data):        testData, expectData = tuple(data)        url = "http://www.baidu.com"        # 訪問百度首頁        self.driver.get(url)        # 將瀏覽器窗口最大化        self.driver.maximize_window()        print (testData, expectData)        # 設置隱式等待時間爲10秒        self.driver.implicitly_wait(10)
       try:            # 獲取當前的時間戳,用於後面計算查詢耗時用            start = time.time()            # 獲取當前時間的字符串,表示測試開始時間            startTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())            # 找到搜索輸入框,並輸入測試數據            self.driver.find_element_by_id("kw").send_keys(testData)            # 找到搜索按鈕,並點擊            self.driver.find_element_by_id("su").click()            time.sleep(3)            # 斷言指望結果是否出如今頁面源代碼中            self.assertTrue(expectData in self.driver.page_source)            print ("搜索%s,指望%s" %(testData, expectData))        except NoSuchElementException as e:            logging.error("查找的頁面元素不存在,異常堆棧信息:"\                          + str(traceback.format_exc()))        except AssertionError as e:            print("斷言失敗了")            logging.info("搜索「%s」,指望「%s」,失敗" %(testData, expectData))        except Exception as e:            logging.error("未知錯誤,錯誤信息:" + str(traceback.format_exc()))        else:            logging.info("搜索「%s」,指望「%s」經過" %(testData, expectData))
   def tearDown(self):        self.driver.quit()
if __name__ == '__main__':    unittest.main()
相關文章
相關標籤/搜索