AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

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

來(lái)源: 責(zé)編: 時(shí)間:2023-09-18 21:40:46 336觀看
導(dǎo)讀Python為開(kāi)發(fā)者提供了內(nèi)置的單元測(cè)試框架 unittest,它是一種強(qiáng)大的工具,能夠有效地編寫(xiě)和執(zhí)行單元測(cè)試。unittest 提供了完整的測(cè)試結(jié)構(gòu),支持自動(dòng)化測(cè)試的執(zhí)行,能夠?qū)y(cè)試用例進(jìn)行組織,并且提供了豐富的斷言方法。最終,unit

Python為開(kāi)發(fā)者提供了內(nèi)置的單元測(cè)試框架 unittest,它是一種強(qiáng)大的工具,能夠有效地編寫(xiě)和執(zhí)行單元測(cè)試。unittest 提供了完整的測(cè)試結(jié)構(gòu),支持自動(dòng)化測(cè)試的執(zhí)行,能夠?qū)y(cè)試用例進(jìn)行組織,并且提供了豐富的斷言方法。最終,unittest 會(huì)生成詳細(xì)的測(cè)試報(bào)告,這個(gè)框架非常簡(jiǎn)單且易于使用。DWP28資訊網(wǎng)——每日最新資訊28at.com

DWP28資訊網(wǎng)——每日最新資訊28at.com

unittest的工作流程

  • 編寫(xiě)繼承自 unittest.TestCase 的測(cè)試用例類(lèi),其中每個(gè)測(cè)試函數(shù)都是一個(gè)獨(dú)立的測(cè)試用例。
  • 使用 TestLoader 加載測(cè)試用例,并將它們組織成 TestSuite 對(duì)象。
  • 使用 TestRunner 運(yùn)行 TestSuite 中的測(cè)試用例,并輸出測(cè)試結(jié)果。

DWP28資訊網(wǎng)——每日最新資訊28at.com

使用unittest初級(jí)指南

  • 導(dǎo)入 unittest 模塊以及被測(cè)試的文件或類(lèi)。
  • 創(chuàng)建一個(gè)測(cè)試類(lèi),并繼承 unittest.TestCase,所有自定義的單元測(cè)試類(lèi)都要繼承它,作為基類(lèi)。
  • 重寫(xiě) setUp 和 tearDown 方法,用于初始化和清理測(cè)試環(huán)境(如果有必要)。
  • 定義測(cè)試函數(shù),函數(shù)名以 test_ 開(kāi)頭,這樣才能被識(shí)別并執(zhí)行。
  • 在測(cè)試函數(shù)中使用斷言來(lái)判斷測(cè)試結(jié)果是否符合預(yù)期。
  • 調(diào)用 unittest.main() 方法運(yùn)行測(cè)試用例,按照函數(shù)名的排序執(zhí)行測(cè)試。

以下是一個(gè)簡(jiǎn)單的例子:DWP28資訊網(wǎng)——每日最新資訊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):        """測(cè)試登錄成功"""        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):        """賬號(hào)正確,密碼錯(cuò)誤,登錄失敗"""        test_data = {"username": "kira", "password": "12345"}        expect_data = {"code": 400, "msg": "登錄失敗"}        res = login(**test_data)        self.assertEqual(res, expect_data)    # 更多測(cè)試函數(shù)類(lèi)似...if __name__ == '__main__':    unittest.main()

以上是一個(gè)簡(jiǎn)單的測(cè)試用例,包含了兩個(gè)測(cè)試函數(shù)。運(yùn)行腳本將輸出測(cè)試結(jié)果。DWP28資訊網(wǎng)——每日最新資訊28at.com

unittest核心概念

測(cè)試腳手架

測(cè)試腳手架 是測(cè)試用例的前置條件和后置條件,確保測(cè)試環(huán)境的初始化和清理,從而保證測(cè)試的準(zhǔn)確性和可靠性。DWP28資訊網(wǎng)——每日最新資訊28at.com

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

測(cè)試用例

測(cè)試用例 是最小的測(cè)試單元,用于檢測(cè)特定的輸入集合的特定的返回值。unittest 提供了 TestCase 基類(lèi),所有的測(cè)試類(lèi)都需要繼承該基類(lèi),而在該類(lèi)下的函數(shù)如果以 test_ 開(kāi)頭,則被標(biāo)識(shí)為測(cè)試函數(shù):DWP28資訊網(wǎng)——每日最新資訊28at.com

class MyTestCase(unittest.TestCase):    def test_addition(self):        result = 2 + 3        self.assertEqual(result, 5)  # 使用斷言方法驗(yàn)證結(jié)果是否相等    def test_subtraction(self):        result = 5 - 3        self.assertTrue(result == 2)  # 使用斷言方法驗(yàn)證結(jié)果是否為T(mén)rue    # 更多測(cè)試用例函數(shù)...

斷言方法

以下是常用的斷言方法:DWP28資訊網(wǎng)——每日最新資訊28at.com

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

可以使用這些方法進(jìn)行斷言,也可以直接使用原生的assert來(lái)斷言,如果斷言失敗,測(cè)試用例會(huì)被定義為執(zhí)行失敗。DWP28資訊網(wǎng)——每日最新資訊28at.com

忽略特定測(cè)試方法

unittest 提供了一些方法來(lái)跳過(guò)特定的測(cè)試用例:DWP28資訊網(wǎng)——每日最新資訊28at.com

  • @unittest.skip(reason):強(qiáng)制跳過(guò),reason 是跳過(guò)的原因。
  • @unittest.skipIf(condition, reason):當(dāng) condition 為 True 時(shí)跳過(guò)。
  • @unittest.skipUnless(condition, reason):當(dāng) condition 為 False 時(shí)跳過(guò)。
  • @unittest.expectedFailure:如果測(cè)試失敗,這個(gè)測(cè)試用例不會(huì)計(jì)入失敗的統(tǒng)計(jì)。

使用實(shí)例方法:self.skipTest() 使用和上述類(lèi)似。DWP28資訊網(wǎng)——每日最新資訊28at.com

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

測(cè)試套件

測(cè)試套件用于收集和組織多個(gè)測(cè)試用例,便于集中執(zhí)行。DWP28資訊網(wǎng)——每日最新資訊28at.com

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

通過(guò) TestSuite 對(duì)象收集

此方式適用于需要自定義組合特定測(cè)試用例的情況。DWP28資訊網(wǎng)——每日最新資訊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())

通過(guò) TestLoader 對(duì)象收集

TestLoader 是 unittest 框架提供的加載測(cè)試用例的類(lèi)。DWP28資訊網(wǎng)——每日最新資訊28at.com

import unittestif __name__ == '__main__':    loader = unittest.defaultTestLoader        # 自動(dòng)加載當(dāng)前模塊中所有以 'test_' 開(kāi)頭的測(cè)試用例函數(shù)    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        # 自動(dòng)加載 MyTestCase 類(lèi)中的所有測(cè)試用例    suite = loader.loadTestsFromTestCase(MyTestCase)    runner = unittest.TextTestRunner()    runner.run(suite)
import unittestif __name__ == '__main__':    loader = unittest.defaultTestLoader        # 自動(dòng)加載指定名稱(chēng)的測(cè)試用例    suite = loader.loadTestsFromName('module.MyTestCase.test_addition')    runner = unittest.TextTestRunner()    runner.run(suite)
import unittestif __name__ == '__main__':    loader = unittest.defaultTestLoader        # 自動(dòng)發(fā)現(xiàn)并加載指定目錄中的測(cè)試用例模塊    suite = loader.discover(start_dir='test_directory', pattern='test_*.py', top_level_dir=None)    runner = unittest.TextTestRunner()    runner.run(suite)

測(cè)試運(yùn)行器

測(cè)試運(yùn)行器是用于執(zhí)行和輸出測(cè)試結(jié)果的組件。常用的運(yùn)行器有:DWP28資訊網(wǎng)——每日最新資訊28at.com

  • unittest.TextTestRunner:這是 unittest 框架中默認(rèn)的測(cè)試運(yùn)行器,會(huì)在命令行輸出測(cè)試結(jié)果。通過(guò)調(diào)用 run() 方法運(yùn)行測(cè)試套件,并將測(cè)試結(jié)果打印到控制臺(tái)。
import unittestif __name__ == '__main__':    loader = unittest.defaultTestLoader    suite = loader.discover(start_dir='tests', pattern='test_*.py')        runner = unittest.TextTestRunner()    result = runner.run(suite)
  • HTMLTestRunner:這是一個(gè)第三方庫(kù),能夠生成漂亮的 HTML 測(cè)試報(bào)告,需要進(jìn)行安裝。你可以通過(guò)搜索獲取相關(guān)文件進(jìn)行安裝。
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:這是另一個(gè)第三方庫(kù),用于生成 XML 格式的測(cè)試報(bào)告。
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)

你也可以自定義測(cè)試運(yùn)行器。繼承 unittest.TestRunner 類(lèi)并實(shí)現(xiàn) run() 方法,以創(chuàng)建自己的測(cè)試運(yùn)行器。DWP28資訊網(wǎng)——每日最新資訊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 即可滿(mǎn)足需求,它非常易用。DWP28資訊網(wǎng)——每日最新資訊28at.com

實(shí)戰(zhàn)一個(gè)測(cè)試案例

假設(shè)有一個(gè)測(cè)試函數(shù) login:DWP28資訊網(wǎng)——每日最新資訊28at.com

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

設(shè)計(jì)用例

根據(jù)函數(shù)的參數(shù)和邏輯,設(shè)計(jì)如下用例:DWP28資訊網(wǎng)——每日最新資訊28at.com

DWP28資訊網(wǎng)——每日最新資訊28at.com

編寫(xiě)測(cè)試用例并運(yùn)行

import unittestfrom login import loginclass TestLogin(unittest.TestCase):    def test_login_correct(self):        """測(cè)試賬號(hào)密碼正確"""        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):        """測(cè)試賬號(hào)正確密碼不正確"""        test_data = {"username": "kira", "password": "123"}        expect_data = {"code": 1, "msg": "賬號(hào)或密碼不正確"}        res = login(**test_data)        self.assertEqual(res, expect_data)    def test_login_wrong_username(self):        """測(cè)試賬號(hào)錯(cuò)誤密碼正確"""        test_data = {"username": "kir", "password": "123456"}        expect_data = {"code": 1, "msg": "賬號(hào)或密碼不正確"}        res = login(**test_data)        self.assertEqual(res, expect_data)if __name__ == '__main__':    unittest.main()

這是一個(gè)簡(jiǎn)單的測(cè)試用例,包含了三個(gè)測(cè)試函數(shù)。運(yùn)行測(cè)試用例后,會(huì)輸出測(cè)試結(jié)果,看完是否覺(jué)得unittest非常簡(jiǎn)單易用。ner.run(suite)DWP28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-10432-0.html不拼花哨,只拼實(shí)用:Unittest指南,干貨為王!

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 基于范圍的 for 循環(huán):現(xiàn)代 C++ 循環(huán)控制的新思維

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

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
Top