unittest自動化測試學習總結--01

unittest工作原理簡化一下就是:

先寫好TestCase然後由TestLoader加載TestCase到TestSuite,然後由TextTestRunner來運行TestSuite,運行的結果保存在TextTestResult中,整個過程集成在unittest.main模塊中,main會調用TextTestRunner中的run來執行,或者我們可以直接通過TextTestRunner來執行用例。在Runner運行的時候,我們的測試結果會被輸出到控制檯,可以清晰的看到,我們還可以輸出到文件,運用HTMLTestRunner生成一個漂亮的報告。

unittest中有4個重要的概念:test fixture, test case, test suite, test runner再外加一個測試報告Test Report

  • Test Fixture(測試夾具):通過使用測試夾具,可以定義在單個或者多個測試執行之前的準備工作和測試執行後的清理工作。

比如你要測試一個接口(但該接口依賴於用戶的登錄狀態),那麼你需要先進行登錄操作,這個登錄活動就相當於準備工作。

  • Test Case(測試用例):一個測試用例是在unittest中執行測試的最小單元。它通過unittest提供的assert方法來驗證一組特定的操作或輸入以後得到的具體響應。unittest提供了一個名爲TestCase的基礎類,可以用來創建測試用例。
  • Test Suite(測試套件):一個測試套件是多個測試用例的集合,是針對被測程序的對應功能和模塊創建的一組測試,一個測試套件內的測試將一起執行。
  • Test Runner(測試執行器):測試執行器負責測試執行調試並且生成測試結果給用戶。測試執行器可以使用圖形界面、文本界面或者特定的返回值來展示測試執行結果。
  • Test Report(測試報告):測試報告用來展示所有執行用例的成功或者失敗狀態的彙總,執行失敗的測試步驟的預期結果與實際結果,還有整體運行狀況及運行時間的彙總。注意,unittest本身是沒有相應的內置模塊來生成友好的報告,但我們可以借用unittest的擴展庫HTMLTestRunner來實現,需要單獨下載並放到python安裝目錄下lib/site-packages

unittest.TestCase:TestCase類,所有測試用例類繼承的基本類。

class BaiduTest(unittest.TestCase):

unittest.main():使用她可以方便的將一個單元測試模塊變爲可直接運行的測試腳本,main()方法使用TestLoader類來搜索所有包含在該模塊中以“test”命名開頭的測試方法,並自動執行他們。執行方法的默認順序是:根據ASCII碼的順序加載測試用例,數字與字母的順序爲:0-9,A-Z,a-z。所以以A開頭的測試用例方法會優先執行,以a開頭會後執行。

unittest.TestSuite():TestSuite類是用來創建測試套件的。因爲執行測試用例的是通過調用unittest.mian()函數,它會將模塊的測試用例收集起來並執行,然而當我們的測試用例增多了以後,這樣的執行非常不靈活而且沒有效率,此時unittest框架的TestSuite()類的優點就出現了。

TestLoader是用來加載TestCase到TestSuite,其中有幾個loadTestFrom__( )方法,就是從各個地方尋找TestCase,創建它們的實例,然後add到TestSuite中,在返回一個TestSuite實例

1.先創建測試套件:

suite=unittest.TestSuite()

2.加載測試用例TestLoader類:它用於加載測試用例,然後返回一個測試用例集和有4個運行方式比較好:

unittest.TestLoader().loadTestsFromTestCase(類名)
unittest.TestLoader().loadTestsFromMoudule(模塊名)但是我看源碼提示是說在3.5已經移除使用,那就不用這個了
unittest.TestLoader().loadTestsFromName(方法名)
unittest.TestLoader().loadTestsFromNames(方法名,複數形式)

2.1.1創建一個.py文件,使用unittest.TestLoader().discover(“路徑”,“匹配文件名”)也可以加載測試用例

3.再向測試套件裏面添加case:addTest()方法是將測試用例添加到測試套件中

suite.addTests(unittest.TestLoader().loadTestsFromTestCase("LoginEvent"))

4.運行:TextTestRunner是用來執行測試用例的,其中的run(test)會執行TestCase中的run(result)方法。

unittest.TextTestRunner().run(suite)

 如下代碼是run_main.py

def run_case():
    # 用例讀取路徑
    case_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "case")
    suite = unittest.TestLoader().discover(case_path)

    # 測試報告存放路徑
    report_path = os.path.join(os.path.dirname(os.path.realpath(__file__)) + "/report/result_report.html")
    with open(report_path, "wb") as f:
        runner = HTMLTestRunner_PY3.HTMLTestRunner(stream=f,
                                                   title="Test Report",
                                                   description="Test Result",
                                                   verbosity=2)
        runner.run(suite)


run_case()

setup就是前置條件,tearDown就是後置條件,在我們執行完case之後,tearDown最好要寫,做數據的還原,清理測試環境,比如退出瀏覽器、返回到手機的Home頁面,保證後面的case不會執行失敗。

這裏有個坑,就是比如我們做測試打開百度頁面的操作,每次執行用例就重新打開一次,這樣就非常的浪費時間,我的本意是打開了百度的頁面,我想做完所有的操作,然後再去關閉百度頁面,這個時候就用到了裝飾器(@classmethod)

  • 裝飾器

用setUp與setUpClass區別

setup():每個測試case運行前運行

teardown():每個測試case運行完後執行

setUpClass():必須使用@classmethod 裝飾器,所有case運行前只運行一次

tearDownClass():必須使用@classmethod裝飾器,所有case運行完後只運行一次

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章