unittest里discover用法_unittest框架核心要素及应用
生活随笔
收集整理的這篇文章主要介紹了
unittest里discover用法_unittest框架核心要素及应用
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. unittest核心要素
- unittest介紹
- 測試框架,不僅僅用于單元測試
- python自動的測試包
- 用法和django.test.TestCase類似
1.1【知道】unittest介紹和核心要素
1.2【掌握】unittest核心要素的使用
""" 1. 測試用例 2. 容器,容器添加測試用例 3. 運行容器中的測試用例 """ import unittest ? # 測試類,繼承于unittest.TestCase class MyTest(unittest.TestCase):def test_1(self):print('test_1') ?def test_2(self):print('test_2') ? if __name__ == '__main__':# 類的外面# 2. 容器,容器添加測試用例suite = unittest.TestSuite()# 測試用例的執(zhí)行順序,按添加的順序執(zhí)行suite.addTest(MyTest('test_1'))suite.addTest(MyTest('test_2')) ?# 3. 運行容器中的測試用例runner = unittest.TextTestRunner()runner.run(suite)注意:只能通過命令運行
python xxx.py1.3【知道】Fixture
- 測試類中:實現(xiàn)了前、后置方法,它就是一個fixture
1.4【掌握】defaultTestLoader
""" 1. 測試用例 2. 容器,容器添加測試用例 3. 運行容器中的測試用例 """ import unittest ? # 測試類,繼承于unittest.TestCase class MyTest(unittest.TestCase):def test_1(self):print('test_11111111111111') ?def test_2(self):print('test_22222222222222') ? if __name__ == '__main__':# 2. 容器,容器添加測試用例# 默認找指定路徑下,所有test開頭的文件# 參數(shù)1:路徑,參數(shù)2:指定的文件suite = unittest.defaultTestLoader.discover('./', 'test_2_demo.py') ?# 3. 運行容器中的測試用例runner = unittest.TextTestRunner()runner.run(suite)注意:只能通過命令運行
python xxx.py2.【掌握】unittest基本使用
""" 1. 導(dǎo)入unittest模塊 2. 新建類,繼承于unittest.TestCase 3. 類中方法1. 前、后置(不是必須的,有前置必須寫后置,匹配的)2. test開頭的測試用例(測試用例中有斷言) 4. unittest.main()運行測試 """ import unittest ? class MyTest(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:print('setUpClass') ?@classmethoddef tearDownClass(cls) -> None:print('tearDownClass') ?def setUp(self) -> None:print('setUp') ?def tearDown(self) -> None:print('tearDown') ?def test_1(self):print('test_1111111') ?def test_s(self):print('test_s')a = 1 + 1self.assertEqual(a, 2, '結(jié)果不為2') ?def test_f(self):print('test_f')a = 1 + 2self.assertEqual(a, 3, '結(jié)果不為3') ?def xxx_xxx(self): # 不會執(zhí)行非test開頭的方法print('xxxxx') ? if __name__ == '__main__':unittest.main()- 測試用例運行順序:0~9, A~Z, a~z
- python代碼運行,pycharm直接右擊運行,等價于:python xxx.py
3.【知道】斷言
# arg1和arg2相等,測試通過,標(biāo)志為 . # arg1和arg2不相等,測試不通過,標(biāo)志為 F,拋出異常,顯示msg的信息 unittest.assertEqual(arg1, arg2, msg=None)4.【掌握】參數(shù)化
import unittest from parameterized import parameterized # 需要先安裝模塊 ? class MyTest(unittest.TestCase):def setUp(self) -> None:print('setUp') ?def tearDown(self) -> None:print('tearDown')# 1. 參數(shù)化參數(shù):列表套元組# 2. 列表有幾個元素,測試用來執(zhí)行幾次# 3. 元組元素的位置匹配測試用例的形參@parameterized.expand([('mike', '123'), ('yoyo', 'abc')])def test_params(self, name, pwd):print('name = %s, pwd = %s'%(name, pwd)) ? ? if __name__ == '__main__':unittest.main()5. mock
5.1 mock介紹
5.2 Mock 類基本使用
5.2.1【掌握】return_value
import unittest import unittest.mock ? class MyTest(unittest.TestCase):def test_return(self):# 1. 創(chuàng)建Mock()對象,給return_value關(guān)鍵字傳參mock_obj = unittest.mock.Mock(return_value=250)# mock_obj是對象,可調(diào)用對象,用法和函數(shù)一樣ret = mock_obj()print(ret)5.2.2【知道】side_effect
import unittest import unittest.mock ? class MyTest(unittest.TestCase):def test_except(self):# 1. 創(chuàng)建Mock()對象,傳遞異常對象mock_obj = unittest.mock.Mock(side_effect=BaseException('自定義異常'))# mock_obj是對象,可調(diào)用對象,用法和函數(shù)一樣mock_obj() ?def test_list(self):# 1. 創(chuàng)建Mock()對象,傳遞listmock_obj = unittest.mock.Mock(side_effect=[1,2,3])# mock_obj是對象,可調(diào)用對象,用法和函數(shù)一樣print(mock_obj())print(mock_obj())print(mock_obj())print(mock_obj()) # err, StopIteration ?def test_func(self):def func(a, b):return a+b ?# 1. 創(chuàng)建Mock()對象,傳遞函數(shù)名mock_obj = unittest.mock.Mock(side_effect=func)# mock_obj是對象,可調(diào)用對象,用法和函數(shù)一樣print(mock_obj(1, 1))# TypeError: func() missing 2 required positional arguments: 'a' and 'b'mock_obj()5.2.3【掌握】mock案例
5.3 限制模擬的范圍
class MyTest(unittest.TestCase):def test_1(self):# unittest.mock.Mock# 通過這種方式Mock后,后面調(diào)用的測試用來也有效果(保證mock先執(zhí)行)pay.pay_way = unittest.mock.Mock(return_value={"result": "success", "reason":"null"}) ?ret = pay_status.pay_way_status()print("test_1 = ", ret)self.assertEqual(ret, '支付成功', '支付失敗') ?def test_2(self):ret = pay_status.pay_way_status()print("test_2 = ", ret)self.assertEqual(ret, '支付成功', '支付失敗')5.3.1【掌握】mock.path
5.3.2【掌握】patch 上下文管理器
- 通過mock.path或者patch 上下文管理器,限制mock范圍
- patch 上下文管理器注意作用域問題
5.4【掌握】類方法替換
from unittest import mock import unittest ? class Pay(object):def pay_way(self):"""假設(shè)這里是一個支付的功能,未開發(fā)完支付成功返回:{"result": "success", "reason":"null"}支付失敗返回:{"result": "fail", "reason":"余額不足"}reason返回失敗原因"""raise NotImplementedError('代碼還沒有實現(xiàn)') ?def pay_way_status(self):"""根據(jù)支付的結(jié)果success或fail,判斷跳轉(zhuǎn)到對應(yīng)頁面假設(shè)這里的功能已經(jīng)開發(fā)完成""" ?# todo 此時pay_way()函數(shù)并未完成!你先假定他完成了result = self.pay_way()print(result) ?if result["result"] == "success":return "支付成功"if result["result"] == "fail":return "支付失敗" ? class TestPayStatues(unittest.TestCase):'''單元測試用例'''def test_1(self):p = Pay()p.pay_way = unittest.mock.Mock(return_value={"result": "success", "reason":"null"}) ?ret = p.pay_way_status()self.assertEqual(ret, '支付成功', '測試失敗') ?@unittest.mock.patch.object(Pay, 'pay_way')def test_2(self, mock_obj):mock_obj.return_value={"result": "success", "reason":"null"} ?p = Pay()ret = p.pay_way_status()self.assertEqual(ret, '支付成功', '測試失敗') ?def test_3(self):with unittest.mock.patch.object(Pay, 'pay_way') as mock_obj:mock_obj.return_value={"result": "success", "reason":"null"}p = Pay()ret = p.pay_way_status()self.assertEqual(ret, '支付成功', '測試失敗')5.5 常用的方法和屬性
import unittest import unittest.mock ? ? class MockTest(unittest.TestCase):def test_return_value(self):mock_obj = unittest.mock.Mock(return_value=1999)result = mock_obj()print(result) # 打印 1999 ?mock_obj()print(mock_obj.called) # 是否被調(diào)用過, 返回布爾值print(mock_obj.call_count) # 獲取調(diào)用測試, 返回調(diào)用測試6. 測試報告
6.1【知道】HTMLTestRunner
""" 0. 導(dǎo)包, import unittest 1. 定義類,繼承unittest.TestCase 2. 是一個fixture, 有前置后置方法 3. 有test開頭的測試用例,結(jié)果用斷言判斷 4. 運行測試 """ import unittest from HTMLTestRunner.HTMLTestRunner import HTMLTestRunner # 需要安裝插件 ? ? class MyTest(unittest.TestCase):def setUp(self) -> None:print('setUp') ?def tearDown(self) -> None:print("tearDown") ?@classmethoddef setUpClass(cls) -> None:print('setUpClass') ?@classmethoddef tearDownClass(cls) -> None:print('tearDownClass') ?def test_1_add(self):num = 1 + 2print('test_add')self.assertEqual(num, 3, msg='加法錯誤') ?def test_2_sub(self):num = 1 - 1print('test_sub')self.assertEqual(num, 3, msg='減法錯誤') ? ? if __name__ == '__main__':# 1. 把測試用例添加到suite容器中suite = unittest.defaultTestLoader.discover('./', 'test_1.py') ?# 2. 打開文件,是一個文件對象with open('./HTMLTestRunner.html', 'w', encoding='utf-8') as f:# 3. HTMLTestRunner()創(chuàng)建一個runner對象runner = HTMLTestRunner(stream=f, # 測試報告需要寫入到的文件verbosity=2, # 控制臺輸出信息的詳細程度, 默認為1title='這是報告標(biāo)題', # 測試報告的標(biāo)題description='這是一個測試報告內(nèi)容' # 測試報告的描述)# 4. runner把容器中測試用例運行runner.run(suite)6.2【知道】BeautifulReport
import unittest from BeautifulReport import BeautifulReport ? ? class MyTest(unittest.TestCase):def setUp(self) -> None:print('setUp') ?def tearDown(self) -> None:print("tearDown") ?@classmethoddef setUpClass(cls) -> None:print('setUpClass') ?@classmethoddef tearDownClass(cls) -> None:print('tearDownClass') ?def test_1_add(self):"""add"""num = 1 + 2print('test_add')self.assertEqual(num, 3, msg='加法錯誤') ?def test_2_sub(self):"""sub"""num = 1 - 1print('test_sub')self.assertEqual(num, 3, msg='減法錯誤') ? ? if __name__ == '__main__':# 1. 把測試用例添加到suite容器中# suite = unittest.defaultTestLoader.discover('./', 'test_2.py')suite = unittest.defaultTestLoader.discover('./') ?# 2. 創(chuàng)建runner對象,同時把suite傳參進入runner = BeautifulReport(suite) ?# 3. 運行,同時生成測試報告# 參數(shù)1:生成文件的注釋, 參數(shù)2:生成文件的filename, 參數(shù)3:生成report的文件存儲路徑runner.report('報告描述必須有,在報告中顯示為用例名稱', '測試報告文件名2', './')7. 綜合案例
7.1【知道】測試流程和目錄結(jié)構(gòu)
7.2【掌握】基礎(chǔ)工具方法類:讀取json數(shù)據(jù)
# 讀取json文件 # 1. 傳入文件,讀取內(nèi)容,返回文件中數(shù)據(jù) # 路徑的處理 import os import json ? ? class Data(object):# 類屬性# 獲取工程所在的絕對路徑BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) ?# 設(shè)置為類方法,是為了方便調(diào)用@classmethoddef read_info(cls, file_name='server.json'):""":param file_name: 文件名:return: 文件中的json數(shù)據(jù)"""file_path = os.path.join(cls.BASE_DIR, 'data', file_name)# print(file_path) ?# 只讀方式打開文件with open(file_path, 'r', encoding='utf-8') as f:ret = json.load(f) # load, 加載,加載是讀# print(ret) ?return ret ? # 測試一下 # print(Data.BASE_DIR) # ret = Data.read_info('server.json') # ret = Data.read_info('users/login_users.json') # print('ret = ', ret)7.3【掌握】基礎(chǔ)工具方法類:請求封裝
""" 1. 發(fā)送請求,只需要指定路徑‘/login/’,無需指定url, 其他參數(shù)和原來的一樣 import requests ? def xxx(path = '/info/', params=None, **kwargs):url = 'http://127.0.0.1:8000'requests.get(url + path, params, **kwargs) """ from utils.data import Data import requests ? ? def read_url():ret = Data.read_info('server.json')# {'schema': 'http', 'host': '127.0.0.1', 'port': 8000}# print(ret)url = f'{ret["schema"]}://{ret["host"]}:{ret["port"]}' ?return url ? ? # print(read_url()) class Ask(object):# 類熟悉URL = read_url() ?@classmethoddef get(cls, path, params=None, **kwargs):""":param path: 路徑, '/info/':param params: url參數(shù):param kwargs: 其他參數(shù):return: requests.Response 響應(yīng)對象"""resp = requests.get(cls.URL + path, params, **kwargs)return resp ?@classmethoddef post(cls, path, data=None, json=None, **kwargs):""":param path: 路徑, 如'/login/':param data: 表單格式數(shù)據(jù):param json: json格式數(shù)據(jù):param kwargs: 其他參數(shù):return: requests.Response 響應(yīng)對象"""resp = requests.post(cls.URL + path, data, json, **kwargs)return resp ? ? # 創(chuàng)建對象,調(diào)用方法 # obj = Ask() # ret = obj.get('/info/') # print(ret.json()) ? # info = { # "username": "admin111", # "password": "chuanzhi12345", # "remembered": True # } # ret = Ask.post('/login/', json=info) # print(ret.json())7.4【掌握】測試用例編寫
import unittest from utils.ask import Ask ? ? class MyTest(unittest.TestCase):def test_login(self):print('test_login')info = {"username": "admin","password": "chuanzhi12345","remembered": True}r = Ask.post('/login/', json=info)ret = r.json()print(ret) ?self.assertEqual(ret['code'], 0, msg=ret['errmsg']) ? ?7.5【掌握】執(zhí)行測試用例
import unittest from BeautifulReport import BeautifulReport ? if __name__ == '__main__':# 1. 把測試用例添加到suite容器中suite = unittest.defaultTestLoader.discover('./tests') ?# 2. 創(chuàng)建runner對象,同時把suite傳參進入runner = BeautifulReport(suite) ?# 3. 運行,同時生成測試報告# 參數(shù)1:生成文件的注釋, 參數(shù)2:生成文件的filename, 參數(shù)3:生成report的文件存儲路徑runner.report('登陸', '美多登陸測試報告', './report')推薦學(xué)習(xí):
Python入門教程完整版(懂中文就能學(xué)會)
完整視頻:Python入門教程完整版(懂中文就能學(xué)會)
配套資料:https://pan.baidu.com/s/15BmUdw9AgOD2tI9xG6p1WA 提取碼:w61i
總結(jié)
以上是生活随笔為你收集整理的unittest里discover用法_unittest框架核心要素及应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初学者选黑卡还是微单_零基础,一篇读懂单
- 下一篇: python复制sheet_python