python中unittest的學習總結

一、unittest中的四大金剛

  • TestCase:測試用例,通過繼承unittest.TestCase,實現用例的繼承,在UnitTest中,一個testcase的實例就是一個測試用例。測試前準備環境的搭建(setUp),執行測試代碼(run),以及測試後環境的還原(tearDown),(注:測試用例都是通過開頭以tes來識別的)
  • TestSuite:測試套件,也就是上面的測試用例集
  • TestFixture:setUp(前置條件),tearDown(後置條件),用於初始化測試用例以及清除和釋放資源
  • TestRunner:運行器,一般通過runner來調用suite去執行測試

二、unittest的初級使用

1.代碼演示:

# 第一步:導入unittest模塊
import unittest


# 第二步: 創建一個測試類,被繼承unittest.TestCase
class unittest_demo(unittest.TestCase):

# 第三步:重寫setUp和tearDown方法(如果有初始化條件和結束條件)、

    # 這是TestCases執行前的初始化
    @classmethod
    def setUpClass(cls):
        print("TestCases Begin...")

    # 這是TestCases執行後的回收操作
    @classmethod
    def tearDownClass(cls):
        print("TestCases End...")

    # 這是每個test case執行前的初始化
    def setUp(self):
        print("Begin...")

    # 這是每個test case執行後的測試回收
    def tearDown(self):
        print("End...")

# 第四步:定義測試函數,函數名以test_開頭。測試用例
    def test_1(self):
        print("this it the first case")

    def test_2(self):
        print("this is the second case")

    def test_3(self):
        # 第四步:在函數體中使用斷言來判斷測試結果是否符合預期結果
        self.assertEqual(3, 3, msg="條件不成立")
        print("this is tne third case")


# 第五步:調用unittset.main()方法運行測試用例--------無此方法也是可以運行
if __name__ == 'main':
    unittest.main(verbosity=1)

2.執行結果:

說明:可以看出setUpClass(cls)在測試用例前執行一次,tearDownclass(cls)在測試用例執行後執行一次是以測試類爲單位。而setUp(self)跟tearDown(self)都是每個測試函數執行前、後各執行一次,是以測試函數爲單位。

疑問:1.爲什麼類前置條件括號中爲cls,而測試函數前置條件括號中爲self?

答:self表示一個具體的實例本身,cls表示這個類本身

           2.爲什麼setUpClass方法前面要用裝飾器@classmethod?

答:

三、unittest中數據驅動

在設計用例的時候,有些用例只是參數數據的輸入不一樣,比如登錄這個功能,操作過程但是一樣的。如果用例重複去寫操作過程會增加代碼量,對應這種多組數據的測試用例,可以用數據驅動設計模式,一組數據對應一個測試用例,用例自動加載生成。

第一種:直接以list方式傳遞

ddt中最基本的應用l:在class前定義@ddt,用於表示要使用ddt,再基於實際的應用,選擇對應的裝飾器。

如@ddt.data():用於設定參數,解析方式爲,解析一個,傳參一個

   @ddt.unpack():用於解析參數

1.實戰演習:

# 第一步:導入ddt模塊
import unittest
import ddt


# 測試類前加修飾@ddt.ddt
@ddt.ddt
class unittest_ddt_demo(unittest.TestCase):
    def setUp(self):
        print("Begin''''")

    def tearDown(self):
        print("End''''")

    # case前加修飾@ddt.data(),運行後會自動加載成兩個單獨的用例
    @ddt.data(["張三", "pw1"], ["李四", "pw2"])
    # @ddt.unpack
    def test_1(self, username, password):
        print("username:",username,"---","password:",password)

    def test_2(self):
        print("無數據驅動測試")


if __name__ == 'main':
    unittest.main(verbosity=1)

2.運行結果:

說明:發現報錯了,根據錯誤提示可以看出,少傳參數了,因爲數據解析時把["張三", "pw1", "OK"]單成一個整體,及認爲是第一個參數username的值,所以我們這裏要自己解析參數,故添加裝飾器@ddt.unpack,最終運行結果爲:

第二種:以函數方式傳輸

1.實戰演習:

# 第一步:導入ddt模塊
import unittest
import ddt


def readFile():
    params = []
    file = open('params.txt', 'r', encoding='utf-8')
    for line in file.readlines():
        params.append(line.strip('\n').split(','))
    return params


# 測試類前加修飾@ddt.ddt
@ddt.ddt
class unittest_ddt_demo(unittest.TestCase):
    def setUp(self):
        print("Begin''''")

    def tearDown(self):
        print("End''''")

    # case前加修飾@ddt.data(),運行後會自動加載成兩個單獨的用例
    @ddt.data(*readFile())
    @ddt.unpack
    def test_1(self, username, password):
        print("username:", username, "---", "password:", password)

    def test_2(self):
        print("無數據驅動測試")


if __name__ == 'main':
    unittest.main(verbosity=1)

"""
params.txt文件內容爲:
username=張三,password=pw1
username=李四,password=pw2
"""

2.運行結果:

第三種:以文件方式傳輸

1.文件格式:

2.實戰演習:

# 第一步:導入ddt模塊
import unittest
import ddt
import yaml

# file = open('test.yml', encoding="utf-8")
# res = yaml.load(file)
# print(res)


# 測試類前加修飾@ddt.ddt
@ddt.ddt
class unittest_ddt_demo(unittest.TestCase):
    def setUp(self):
        print("Begin''''")

    def tearDown(self):
        print("End''''")

    # case前加修飾@ddt.data(),運行後會自動加載成兩個單獨的用例
    @ddt.file_data('test.yml')
    # @ddt.unpack
    def test_1(self, **kwargs):
        print('傳入的參數值爲:', kwargs)
        print("最終的測試結果是:username:", kwargs.get('username'), "---", "password:", kwargs.get('password'))

    def test_2(self):
        print("無數據驅動測試")


if __name__ == 'main':
    unittest.main(verbosity=1)

"""
運行結果:
Begin''''
傳入的參數值爲: {'username': '張三', 'password': 'pass1'}
最終的測試結果是:username: 張三 --- password: pass1
End''''
Begin''''
傳入的參數值爲: {'username': '李四', 'password': 'pass2'}
最終的測試結果是:username: 李四 --- password: pass2
End''''


Ran 3 tests in 0.014s

OK
Begin''''
無數據驅動測試
End''''
"""

備註:基於複雜的情況,可能要對讀取的文件進行拆包讀取等

四:unittest中斷言

斷言是一個自動化的靈魂,斷言做的好不好,能不能一陣見血,實在太重要了,是整個測試流程的核心部分。這裏找到一篇很好的斷言總結

鏈接:https://www.cnblogs.com/ruichow/p/12083833.html

五:unittest中運行測試用例集

四種運行方式均可以:

import unittest
from test_unittest.fortest import *
import HTMLTestRunner

#方法一:
# 創建一個測試套件  list
# suite = unittest.TestSuite()

# 添加測試用例(子元素)到測試套件(集合)
# suite.addTest(unittest_demo('test_case1'))
# suite.addTest(unittest_demo('test_case2'))

# 套件通過TextTestResult對象進行運行~unittest.main()
# runner = unittest.TextTestRunner()
# runner.run(suite)

#方法二:
# case = [unittest_demo('test_case1'),unittest_demo('test_case2')]
# suite = unittest.TestSuite()
# suite.addTests(case)
# runner = unittest.TextTestRunner()
# runner.run(suite)

#方法三:
# test_dir = './'
# discover = unittest.defaultTestLoader.discover(start_dir=test_dir, pattern='for*.py')
# runner = unittest.TextTestRunner()
# runner.run(discover)

#方法四:
# suite = unittest.TestSuite()
# suite.addTests(unittest.TestLoader().loadTestsFromName('fortest.unittest_demo'))
# runner = HtmlTestRunner.HTMLTestRunner(output='MyUnitTest')
# runner.run(suite)

六:生成HTML和XML格式的測試報告

第一步:下載HTMLTestRunner.py文件,修改後放在python安裝目錄的Lib目錄下

第二步:修改HTMLTestRunner.py文件,因爲該文件是基於Python2語法寫的,不適於Python3

第三步:修改點:參照鏈接:https://blog.csdn.net/SCF_1104/article/details/86033979

  備註:美化後的報告:https://github.com/findyou/HTMLTestRunnerCN

1.簡單執行:

from test_unittest.fortest import *
import HtmlTestRunner
import os

report_path = './report/'
report_file = report_path + 'report.html'
if not os.path.exists(report_path):
    os.mkdir(report_path)
else:
    pass
with open(report_file, 'wb') as report:
    suite = unittest.TestSuite()
    suite.addTests(unittest.TestLoader().loadTestsFromName('fortest.unittest_demo'))
    runner = HtmlTestRunner.HTMLTestRunner(verbosity=2, output="./reports/", report_title='Test Report',
                                           descriptions=True, report_name='unittest study')
    runner.run(suite)
report.close()
"""
HTMLTestRunner可用參數:
    def __init__(self, output="./reports/", verbosity=2, stream=sys.stderr,
                 descriptions=True, failfast=False, buffer=False,
                 report_title=None, report_name=None, template=None, resultclass=None,
                 add_timestamp=True, open_in_browser=False,
                 combine_reports=False, template_args=None):
"""

2.測試報告:

七:可能會遇到的問題:

1.導入模塊之後,還是提示HtmlTestRunner模塊不存在:

第一:將HTMLTestRunner.py拷貝到python安裝目錄的Lib\site-packages,注意不要搞錯位置了

第二:如果第一操作過還不行,那麼:如果在PyCharm中使用import HTMLTestRunner報錯,需要設置項目的python解釋器爲自己安裝的python
2.繼續跟蹤學習中~~~~

 

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