日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

不拼花哨,只拼實用:Unittest指南,干貨為王!

來源: 責編: 時間:2023-09-18 21:40:46 393觀看
導讀Python為開發者提供了內置的單元測試框架 unittest,它是一種強大的工具,能夠有效地編寫和執行單元測試。unittest 提供了完整的測試結構,支持自動化測試的執行,能夠對測試用例進行組織,并且提供了豐富的斷言方法。最終,unit

Python為開發者提供了內置的單元測試框架 unittest,它是一種強大的工具,能夠有效地編寫和執行單元測試。unittest 提供了完整的測試結構,支持自動化測試的執行,能夠對測試用例進行組織,并且提供了豐富的斷言方法。最終,unittest 會生成詳細的測試報告,這個框架非常簡單且易于使用。uuH28資訊網——每日最新資訊28at.com

uuH28資訊網——每日最新資訊28at.com

unittest的工作流程

  • 編寫繼承自 unittest.TestCase 的測試用例類,其中每個測試函數都是一個獨立的測試用例。
  • 使用 TestLoader 加載測試用例,并將它們組織成 TestSuite 對象。
  • 使用 TestRunner 運行 TestSuite 中的測試用例,并輸出測試結果。

uuH28資訊網——每日最新資訊28at.com

使用unittest初級指南

  • 導入 unittest 模塊以及被測試的文件或類。
  • 創建一個測試類,并繼承 unittest.TestCase,所有自定義的單元測試類都要繼承它,作為基類。
  • 重寫 setUp 和 tearDown 方法,用于初始化和清理測試環境(如果有必要)。
  • 定義測試函數,函數名以 test_ 開頭,這樣才能被識別并執行。
  • 在測試函數中使用斷言來判斷測試結果是否符合預期。
  • 調用 unittest.main() 方法運行測試用例,按照函數名的排序執行測試。

以下是一個簡單的例子:uuH28資訊網——每日最新資訊28at.com

import unittestdef login(username, password):    if username == 'kira' and password == '123':        res = {"code": 200, "msg": "登錄成功"}        return res    return {"code": 400, "msg": "登錄失敗"}class TestLogin(unittest.TestCase):    def test_login_success(self):        """測試登錄成功"""        test_data = {"username": "kira", "password": "test"}        expect_data = {"code": 200, "msg": "登錄成功"}        res = login(**test_data)        self.assertEqual(res, expect_data)    def test_login_error_with_error_password(self):        """賬號正確,密碼錯誤,登錄失敗"""        test_data = {"username": "kira", "password": "12345"}        expect_data = {"code": 400, "msg": "登錄失敗"}        res = login(**test_data)        self.assertEqual(res, expect_data)    # 更多測試函數類似...if __name__ == '__main__':    unittest.main()

以上是一個簡單的測試用例,包含了兩個測試函數。運行腳本將輸出測試結果。uuH28資訊網——每日最新資訊28at.com

unittest核心概念

測試腳手架

測試腳手架 是測試用例的前置條件和后置條件,確保測試環境的初始化和清理,從而保證測試的準確性和可靠性。uuH28資訊網——每日最新資訊28at.com

import unittestclass MyTestCase(unittest.TestCase):    @classmethod    def setUpClass(cls):        # 類級別的前置條件設置,整個類運行最先只執行一次        print("setUpClass")    @classmethod    def tearDownClass(cls):        # 類級別的后置條件清理,整個類運行最后結束執行一次        print("tearDownClass")    def setUp(self):        # 測試方法級別的前置條件設置,所有測試方法運行前都執行一次        print("setUp")    def tearDown(self):        # 測試方法級別的后置條件清理,所有測試方法運行結束都執行一次        print("tearDown")    def test_example(self):        # 測試用例        print("test_example")if __name__ == "__main__":    unittest.main()
  • setUp():每個測試方法運行前執行,用于測試前置的初始化工作。
  • tearDown():每個測試方法結束后執行,用于測試后的清理工作。
  • setUpClass():所有的測試方法運行前執行,用于單元測試類運行前的準備工作。使用 @classmethod 裝飾器裝飾,整個測試類運行過程中只會執行一次。
  • tearDownClass():所有的測試方法結束后執行,用于單元測試類運行后的清理工作。使用 @classmethod 裝飾器裝飾,整個測試類運行過程中只會執行一次。

測試用例

測試用例 是最小的測試單元,用于檢測特定的輸入集合的特定的返回值。unittest 提供了 TestCase 基類,所有的測試類都需要繼承該基類,而在該類下的函數如果以 test_ 開頭,則被標識為測試函數:uuH28資訊網——每日最新資訊28at.com

class MyTestCase(unittest.TestCase):    def test_addition(self):        result = 2 + 3        self.assertEqual(result, 5)  # 使用斷言方法驗證結果是否相等    def test_subtraction(self):        result = 5 - 3        self.assertTrue(result == 2)  # 使用斷言方法驗證結果是否為True    # 更多測試用例函數...

斷言方法

以下是常用的斷言方法:uuH28資訊網——每日最新資訊28at.com

  • assertEqual(a, b, msg=None):驗證 a 等于 b。
  • assertNotEqual(a, b):驗證 a 不等于 b。
  • assertTrue(x):驗證 x 是否為 True。
  • assertFalse(x):驗證 x 是否為 False。
  • assertIs(a, b):驗證 a 是否是 b。
  • assertIsNot(a, b):驗證 a 是否不是 b。
  • assertIsNone(x):驗證 x 是否為 None。
  • assertIsNotNone(x):驗證 x 是否不為 None。
  • assertIn(a, b):驗證 a 是否在 b 中。
  • assertNotIn(a, b):驗證 a 是否不在 b 中。
  • assertIsInstance(a, b):驗證 a 是否是 b 類型的實例。
  • assertNotIsInstance(a, b):驗證 a 是否不是 b 類型的實例。

可以使用這些方法進行斷言,也可以直接使用原生的assert來斷言,如果斷言失敗,測試用例會被定義為執行失敗。uuH28資訊網——每日最新資訊28at.com

忽略特定測試方法

unittest 提供了一些方法來跳過特定的測試用例:uuH28資訊網——每日最新資訊28at.com

  • @unittest.skip(reason):強制跳過,reason 是跳過的原因。
  • @unittest.skipIf(condition, reason):當 condition 為 True 時跳過。
  • @unittest.skipUnless(condition, reason):當 condition 為 False 時跳過。
  • @unittest.expectedFailure:如果測試失敗,這個測試用例不會計入失敗的統計。

使用實例方法:self.skipTest() 使用和上述類似。uuH28資訊網——每日最新資訊28at.com

import sysimport unittestclass Test1(unittest.TestCase):    @unittest.expectedFailure  # 即使失敗也會被計為成功的用例    def test_1(self):        assert 1 + 1 == 3    @unittest.skip('無條件跳過')  # 不管什么情況都會進行跳過    def test_2(self):        print("2+2...", 4)    @unittest.skipIf(sys.platform == "win32", "跳過")  # 如果系統平臺為 Windows 則跳過    def test_3(self):        print("3+3...", 6)    @unittest.skipUnless(sys.platform == "win32", "跳過")  # 除非系統平臺為 Windows,否則跳過    def test_4(self):        print("4+4...", 8)    def test_5(self):        self.skipTest("跳過")        print("5+5...", 10)if __name__ == "__main__":    unittest.main(verbosity=2)

測試套件

測試套件用于收集和組織多個測試用例,便于集中執行。uuH28資訊網——每日最新資訊28at.com

  • 通過 unittest.main() 方法直接加載單元測試的測試模塊,這是一種簡單的加載方式。所有測試用例的執行順序按照方法名的字符串表示的 ASCII 碼升序排序,通過命名時使用 test_01_xxx 來指定執行順序。
  • 將所有的單元測試用例 TestCase 加載到測試套件 Test Suite 集合中,然后一次性加載所有測試對象。

通過 TestSuite 對象收集

此方式適用于需要自定義組合特定測試用例的情況。uuH28資訊網——每日最新資訊28at.com

import unittestclass MyTestCase(unittest.TestCase):    def test_addition(self):        result = 2 + 3        self.assertEqual(result, 5)def suite():    suite = unittest.TestSuite()    suite.addTest(MyTestCase('test_addition'))    return suiteif __name__ == '__main__':    runner = unittest.TextTestRunner()    runner.run(suite())

通過 TestLoader 對象收集

TestLoader 是 unittest 框架提供的加載測試用例的類。uuH28資訊網——每日最新資訊28at.com

import unittestif __name__ == '__main__':    loader = unittest.defaultTestLoader        # 自動加載當前模塊中所有以 'test_' 開頭的測試用例函數    suite = loader.loadTestsFromModule(__name__)    runner = unittest.TextTestRunner()    runner.run(suite)
import unittestclass MyTestCase(unittest.TestCase):    def test_addition(self):        result = 2 + 3        self.assertEqual(result, 5)if __name__ == '__main__':    loader = unittest.defaultTestLoader        # 自動加載 MyTestCase 類中的所有測試用例    suite = loader.loadTestsFromTestCase(MyTestCase)    runner = unittest.TextTestRunner()    runner.run(suite)
import unittestif __name__ == '__main__':    loader = unittest.defaultTestLoader        # 自動加載指定名稱的測試用例    suite = loader.loadTestsFromName('module.MyTestCase.test_addition')    runner = unittest.TextTestRunner()    runner.run(suite)
import unittestif __name__ == '__main__':    loader = unittest.defaultTestLoader        # 自動發現并加載指定目錄中的測試用例模塊    suite = loader.discover(start_dir='test_directory', pattern='test_*.py', top_level_dir=None)    runner = unittest.TextTestRunner()    runner.run(suite)

測試運行器

測試運行器是用于執行和輸出測試結果的組件。常用的運行器有:uuH28資訊網——每日最新資訊28at.com

  • unittest.TextTestRunner:這是 unittest 框架中默認的測試運行器,會在命令行輸出測試結果。通過調用 run() 方法運行測試套件,并將測試結果打印到控制臺。
import unittestif __name__ == '__main__':    loader = unittest.defaultTestLoader    suite = loader.discover(start_dir='tests', pattern='test_*.py')        runner = unittest.TextTestRunner()    result = runner.run(suite)
  • HTMLTestRunner:這是一個第三方庫,能夠生成漂亮的 HTML 測試報告,需要進行安裝。你可以通過搜索獲取相關文件進行安裝。
import unittestfrom HTMLTestRunner import HTMLTestRunnerif __name__ == '__main__':    loader = unittest.defaultTestLoader    suite = loader.discover(start_dir='tests', pattern='test_*.py')        with open('test_report.html', 'wb') as report_file:        runner = HTMLTestRunner(stream=report_file, title='Test Report', description='Test Results')        result = runner.run(suite)
  • XMLTestRunner:這是另一個第三方庫,用于生成 XML 格式的測試報告。
import unittestfrom xmlrunner import XMLTestRunnerif __name__ == '__main__':    loader = unittest.defaultTestLoader    suite = loader.discover(start_dir='tests', pattern='test_*.py')        with open('test_report.xml', 'wb') as report_file:        runner = XMLTestRunner(output=report_file)        result = runner.run(suite)

你也可以自定義測試運行器。繼承 unittest.TestRunner 類并實現 run() 方法,以創建自己的測試運行器。uuH28資訊網——每日最新資訊28at.com

import unittestclass MyTestRunner(unittest.TextTestRunner):    def run(self, test):        print("Running tests with MyTestRunner")        result = super().run(test)        return resultif __name__ == '__main__':    loader = unittest.defaultTestLoader    suite = loader.discover(start_dir='tests', pattern='test_*.py')        runner = MyTestRunner()    result = runner.run(suite)

通常使用 HTMLTestRunner 即可滿足需求,它非常易用。uuH28資訊網——每日最新資訊28at.com

實戰一個測試案例

假設有一個測試函數 login:uuH28資訊網——每日最新資訊28at.com

# login.pydef login(username, password):    """模擬登錄校驗"""    if username == 'kira' and password == '123456':        return {"code": 0, "msg": "登錄成功"}    else:        return {"code": 1, "msg": "賬號或密碼不正確"}

設計用例

根據函數的參數和邏輯,設計如下用例:uuH28資訊網——每日最新資訊28at.com

uuH28資訊網——每日最新資訊28at.com

編寫測試用例并運行

import unittestfrom login import loginclass TestLogin(unittest.TestCase):    def test_login_correct(self):        """測試賬號密碼正確"""        test_data = {"username": "kira", "password": "123456"}        expect_data = {"code": 0, "msg": "登錄成功"}        res = login(**test_data)        self.assertEqual(res, expect_data)    def test_login_wrong_password(self):        """測試賬號正確密碼不正確"""        test_data = {"username": "kira", "password": "123"}        expect_data = {"code": 1, "msg": "賬號或密碼不正確"}        res = login(**test_data)        self.assertEqual(res, expect_data)    def test_login_wrong_username(self):        """測試賬號錯誤密碼正確"""        test_data = {"username": "kir", "password": "123456"}        expect_data = {"code": 1, "msg": "賬號或密碼不正確"}        res = login(**test_data)        self.assertEqual(res, expect_data)if __name__ == '__main__':    unittest.main()

這是一個簡單的測試用例,包含了三個測試函數。運行測試用例后,會輸出測試結果,看完是否覺得unittest非常簡單易用。ner.run(suite)uuH28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-10432-0.html不拼花哨,只拼實用:Unittest指南,干貨為王!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 基于范圍的 for 循環:現代 C++ 循環控制的新思維

下一篇: 2023年需求最大的八種編程語言

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产欧美日韩中文字幕在线| 欧美一区二区三区喷汁尤物| 好男人免费精品视频| 国产精品三级久久久久久电影| 欧美电影在线观看| 欧美大香线蕉线伊人久久国产精品| 快播亚洲色图| 欧美va天堂va视频va在线| 欧美成人国产一区二区| 欧美人体xx| 欧美日韩国产欧| 国产精品黄色在线观看| 国产欧美在线播放| 国产区在线观看成人精品| 国产亚洲一级高清| 在线观看91精品国产麻豆| 亚洲人成在线观看一区二区| 91久久精品www人人做人人爽 | 国产精品三级视频| 国产视频精品xxxx| 亚洲国产欧美日韩精品| 一区二区免费在线播放| 一区二区三区不卡视频在线观看 | 久久亚洲精品一区| 亚洲在线视频免费观看| 久久国内精品视频| 欧美精品久久久久a| 国产欧美一区二区色老头| 91久久久一线二线三线品牌| 亚洲欧美激情四射在线日 | 国产一区二区三区电影在线观看 | 免费在线视频一区| 国产精品亚洲欧美| 亚洲精选久久| 久久婷婷国产综合精品青草| 国产精品久久久久久久久久久久久久 | 亚洲作爱视频| 蜜臀99久久精品久久久久久软件| 国产精品久久久久久模特| 亚洲国产精品一区在线观看不卡| 欧美一区国产二区| 欧美日韩免费一区| 亚洲福利在线看| 欧美在线日韩| 国产精品久久婷婷六月丁香| 亚洲久久在线| 欧美成人在线免费视频| 国内精品久久久久久久果冻传媒 | 一区二区不卡在线视频 午夜欧美不卡在 | 国产精品久久久久久妇女6080| 91久久极品少妇xxxxⅹ软件| 久久久久一区二区三区四区| 国产乱码精品一区二区三区不卡| 99视频精品在线| 欧美高清视频在线| 亚洲福利视频一区二区| 久久久久久亚洲综合影院红桃| 国产精品一区一区| 亚洲性xxxx| 欧美日韩一区二区在线播放| 亚洲精品国产精品久久清纯直播| 久久先锋影音av| 黑丝一区二区三区| 久久精品免费电影| 国产午夜精品视频| 久久av一区二区三区漫画| 国产精品网站在线播放| 亚洲综合日本| 国产精品久久久久久久午夜片| 在线视频你懂得一区| 欧美日韩精品一区二区天天拍小说 | 国产日韩欧美在线视频观看| 亚洲永久免费视频| 国产精品毛片a∨一区二区三区| 在线一区亚洲| 欧美色偷偷大香| 亚洲视频在线免费观看| 欧美日韩在线播放三区| 一区二区三区欧美日韩| 欧美日韩视频在线观看一区二区三区 | 亚洲韩国精品一区| 欧美成人精品一区二区| 亚洲国产精品第一区二区三区| 巨胸喷奶水www久久久免费动漫| 国语精品一区| 久久婷婷av| 在线观看国产欧美| 欧美超级免费视 在线| 亚洲人成在线播放网站岛国| 欧美精品啪啪| 在线亚洲欧美视频| 国产精品手机在线| 久久国产精品久久久久久电车 | 在线一区二区视频| 欧美性天天影院| 性欧美videos另类喷潮| 精久久久久久| 欧美成人免费播放| 亚洲伦理在线| 国产精品理论片在线观看| 性久久久久久| 伊甸园精品99久久久久久| 欧美777四色影视在线| 一区二区冒白浆视频| 国产精品一级二级三级| 欧美在线亚洲一区| 在线观看亚洲| 欧美日韩国产小视频| 亚洲欧美国产三级| 国模叶桐国产精品一区| 欧美护士18xxxxhd| 亚洲一区二区三区在线| 国产在线成人| 欧美激情国产日韩| 亚洲在线一区| 加勒比av一区二区| 欧美日韩中文字幕在线| 亚洲欧美制服中文字幕| 影视先锋久久| 欧美视频在线观看一区二区| 欧美一区二区三区在线视频| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美精品 日韩| 亚洲主播在线观看| 黄页网站一区| 欧美日韩在线精品| 久久精品夜色噜噜亚洲a∨| 亚洲精品国产精品国自产观看| 国产精品卡一卡二卡三| 裸体丰满少妇做受久久99精品| 宅男噜噜噜66一区二区| 国内揄拍国内精品少妇国语| 欧美日韩国产91| 欧美综合国产精品久久丁香| 日韩写真视频在线观看| 国产亚洲一二三区| 欧美日韩一区国产| 久久噜噜噜精品国产亚洲综合| 一区二区免费在线播放| 狠狠色狠狠色综合日日91app| 欧美日韩精品免费看| 久久久久久一区二区| 亚洲小说欧美另类社区| 亚洲福利视频在线| 国产日韩精品视频一区二区三区| 欧美好吊妞视频| 久久成人人人人精品欧| 亚洲精品美女久久7777777| 国产一区av在线| 欧美特黄视频| 乱人伦精品视频在线观看| 亚洲欧美日韩第一区| 亚洲精品之草原avav久久| 国模 一区 二区 三区| 欧美午夜性色大片在线观看| 久久综合婷婷| 欧美一区二区精品久久911| 日韩一二在线观看| 亚洲大胆在线| 国产人妖伪娘一区91| 欧美日韩日本网| 欧美凹凸一区二区三区视频| 久久av红桃一区二区小说| 中日韩视频在线观看| 亚洲国产裸拍裸体视频在线观看乱了中文| 国产麻豆精品视频| 欧美视频中文字幕在线| 欧美国产日韩一区二区三区| 久久国产精品一区二区三区四区| 中文在线不卡视频| 亚洲精品日韩精品| 伊人久久婷婷色综合98网| 国产欧美三级| 国产精品久久久久久久久果冻传媒| 欧美激情第五页| 毛片精品免费在线观看| 久久久www免费人成黑人精品 | 在线看不卡av| 国产综合欧美在线看| 国产精品视频久久| 欧美性感一类影片在线播放| 欧美剧在线免费观看网站| 欧美a级一区二区| 可以免费看不卡的av网站| 久久久久九九视频| 欧美一区影院| 性做久久久久久久久| 亚洲欧美综合| 亚洲欧美日韩第一区| 亚洲视频专区在线| 亚洲视频欧美视频| 亚洲天堂免费观看| 亚洲视频二区| 亚洲视频一区在线| 亚洲午夜日本在线观看| 夜夜爽av福利精品导航 | 亚洲视频播放| 亚洲一区二区三区中文字幕在线 | 亚洲欧洲视频在线| 亚洲精品视频二区| 日韩亚洲在线观看| 99视频在线观看一区三区| av成人激情| 亚洲伊人观看|