網(wǎng)站首頁 編程語言 正文
unittest是python單元測試框架,類似于JUnit框架
意義:
- 靈活的組織ui接口測試自動化用例
- 讓用例高效的執(zhí)行
- 方便驗證測試用例的結果
- 集成html形式測試報告
- 一個class繼承unittest.TestCase類,即是一個個具體的TestCase(類方法名稱必須以test開頭,否則不能被unittest識別)
- 每一個用例執(zhí)行的結果的標識,成功是. ,失敗為F,出錯是E
- 每一個測試以test01、test02…依次寫下去,unittest才可按照編號執(zhí)行
- versity參數(shù)控制輸出結果,0是簡單報告、1是一般報告、2是詳情報告。
- 用setUp()、terUpClass()以及tearDownClass()可以在用例執(zhí)行前布置環(huán)境,以及在用例執(zhí)行后清理環(huán)境。
- 參數(shù)中加stream,可以講報告輸出到文件:可以用HTMLTestRunner輸出html報告。
- 多個單元的測試用例集合在一起,就是TestSuite。
案例1
from selenium import webdriver
import requests
def test01():
'''
用例1
:return:
'''
url = "http://www.ynhousedata.cn/house/assessment/assess_public?token=9a5008072cfd7336350306fdd9ea9485×tamp=2022-04-22 09:20:33&layer=1&total_layer=8&total_area=120&pre_id=4450"
re = requests.get(url)
print(re.status_code, re.text, re.headers, re.encoding)
def test02():
'''
用例1
:return:
'''
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
search = input('輸入搜索內(nèi)容\n')
driver.find_element_by_xpath('//*[@id="kw"]').send_keys(search)
driver.find_element_by_xpath('//*[@id="su"]').click()
test01()
test02()
以上測試,一旦test01出錯,后邊的代碼無法執(zhí)行,而且測試報告,不便于查閱。
import unittest
class TestCases(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print('所有用例的前置')
@classmethod
def tearDownClass(cls) -> None:
print('所有用例的后置')
def setUp(self) -> None:
print('每個用例前置')
def tearDown(self) -> None:
print('每個用例的后置')
def test01(self):
print('執(zhí)行用例1')
def test02(self):
print('執(zhí)行用例2')
if __name__ == '__main__':
unittest.main()
運行結果
Ran 2 tests in 0.001s
OK
所有用例的前置
每個用例前置
執(zhí)行用例1
每個用例的后置
每個用例前置
執(zhí)行用例2
每個用例的后置
所有用例的后置Process finished with exit code 0
若某個類下用例非常多,但又只想執(zhí)行某一個,可以用以下方法
if __name__ == '__main__':
# 創(chuàng)建套件對象
suit = unittest.TestSuite()
# 添加指定用例
suit.addTest(TestCases("test02"))
run = unittest.TextTestRunner()
run.run(suit)
運行結果
所有用例的前置
每個用例前置
執(zhí)行用例2
每個用例的后置
.所有用例的后置----------------------------------------------------------------------
Ran 1 test in 0.000sOK
<unittest.runner.TextTestResult run=1 errors=0 failures=0>
若某個類下用例非常多,以下運行方式可以執(zhí)行多個用例
if __name__ == '__main__':
# 創(chuàng)建套件對象
suit = unittest.TestSuite()
# 添加指定用例,多條
suit.addTests([TestCases("test01"), TestCases("test02")])
run = unittest.TextTestRunner()
run.run(suit)
運行結果
所有用例的前置
每個用例前置
執(zhí)行用例1
每個用例的后置
.每個用例前置
執(zhí)行用例2
每個用例的后置
.所有用例的后置----------------------------------------------------------------------
Ran 2 tests in 0.000sOK
<unittest.runner.TextTestResult run=2 errors=0 failures=0>
當一個py文件下有多個類,需要執(zhí)行某個類的時候,可以用以下方法執(zhí)行
if __name__ == '__main__':
# 創(chuàng)建套件對象
suit = unittest.TestSuite()
# 加載類
load = unittest.TestLoader()
suit.addTest(load.loadTestsFromTestCase(TestCases)) #TestCases為
run = unittest.TextTestRunner()
run.run(suit)
運行結果
所有用例的前置
每個用例前置
執(zhí)行用例1
每個用例的后置
.每個用例前置
執(zhí)行用例2
每個用例的后置
.所有用例的后置----------------------------------------------------------------------
Ran 2 tests in 0.000sOK
<unittest.runner.TextTestResult run=2 errors=0 failures=0>
當有多個測試類的時候,可以用以下方法執(zhí)行
from selenium import webdriver
import requests
import unittest
class TestCases1(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print('所有用例的前置')
@classmethod
def tearDownClass(cls) -> None:
print('所有用例的后置')
def setUp(self) -> None:
print('每個用例前置')
def tearDown(self) -> None:
print('每個用例的后置')
def test01(self):
print('執(zhí)行用例1')
def test02(self):
print('執(zhí)行用例2')
class TestCases2(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print('所有用例的前置')
@classmethod
def tearDownClass(cls) -> None:
print('所有用例的后置')
def setUp(self) -> None:
print('每個用例前置')
def tearDown(self) -> None:
print('每個用例的后置')
def test04(self):
print('執(zhí)行用例4')
def test03(self):
print('執(zhí)行用例3')
if __name__ == '__main__':
# 創(chuàng)建類加載對象
load = unittest.TestLoader()
# 分別加載兩個類
suit1 = load.loadTestsFromTestCase(TestCases1)
suit2 = load.loadTestsFromTestCase(TestCases2)
# 放在套件里
suits = unittest.TestSuite([suit1, suit2])
run = unittest.TextTestRunner()
run.run(suits)
運行結果
所有用例的前置
每個用例前置
執(zhí)行用例1
每個用例的后置
.每個用例前置
執(zhí)行用例2
每個用例的后置
.所有用例的后置
所有用例的前置
每個用例前置
執(zhí)行用例3
每個用例的后置
.每個用例前置
執(zhí)行用例4
每個用例的后置
.所有用例的后置----------------------------------------------------------------------
Ran 4 tests in 0.000sOK
<unittest.runner.TextTestResult run=4 errors=0 failures=0>
當需要執(zhí)行多個py文件下的類的用例的時候可以用以下方法
文件結構
? ?unitTest pwd?
/Users/lidong/Desktop/zhouyu/BILIBILI/筆記/unitTest,假設main.py執(zhí)行testCase文件夾下的test*.py里的類
? ?unitTest tree
.
├── unitTest.md
├── __init__.py
├── main.py
└── testCase
? ? ├── test01.py
? ? └── test02.py1 directory, 5 files
test01.py
import unittest
class TestCases1(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print('所有用例的前置')
@classmethod
def tearDownClass(cls) -> None:
print('所有用例的后置')
def setUp(self) -> None:
print('每個用例前置')
def tearDown(self) -> None:
print('每個用例的后置')
def test01(self):
print('執(zhí)行用例1')
def test02(self):
print('執(zhí)行用例2')
test02.py
import unittest
class TestCases2(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print('所有用例的前置')
@classmethod
def tearDownClass(cls) -> None:
print('所有用例的后置')
def setUp(self) -> None:
print('每個用例前置')
def tearDown(self) -> None:
print('每個用例的后置')
def test04(self):
print('執(zhí)行用例4')
def test03(self):
print('執(zhí)行用例3')
main.py
# -*- coding: utf-8 -*-
# @File : main.py
# @Author : 李東
# @Time : 2022/04/25 10:42:20
import unittest
test_dir = "/Users/lidong/Desktop/zhouyu/BILIBILI/筆記/unitTest"
report_path =
dis = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")
# 創(chuàng)建套件
suit = unittest.TestSuite()
# 添加套件用例
suit.addTest(dis)
run = unittest.TextTestRunner()
run.run(suit)
運行如下:
所有用例的前置
每個用例前置
執(zhí)行用例1
每個用例的后置
.每個用例前置
執(zhí)行用例2
每個用例的后置
.所有用例的后置
所有用例的前置
每個用例前置
執(zhí)行用例3
每個用例的后置
.每個用例前置
執(zhí)行用例4
每個用例的后置
.所有用例的后置----------------------------------------------------------------------
Ran 4 tests in 0.000sOK
<unittest.runner.TextTestResult run=4 errors=0 failures=0>
2、生成測試報告
進入網(wǎng)站,下載HTMLTestRunner文件
下載HTMLTestRunner鏈接
下載后修改文件,建議全部修改,如果報錯,將不需要修改的地方還原即可。
94行,import StringI0 ||| import io
118行,self.fp.write(s) ||| self.fp.write(bytes(s,'UTF-8'))
539行,self.outputBuffer = StringI0.StringI0() ||| self.outputBuffer = io.BytesI0()
631行,print >>sys .stderr, '\nTime ELapsed: %s' % (self.stopTime-seLf.startTime) ||| print('\nTime Elapsed: %s' % (self.stopTime-self.startTime))
642行,if not rmap.has_key(cls): ||| if not cls in rmap:
766行,uo = o.decode('latin-1') ||| uo = o
768行,uo = o ||| Uo = o.decode('utf-8')
772行,ue = e.decode('latin-1') ||| ue=e
774行,ue = e ||| ue = e.decode('utf-8')
修改完成之后,將文件放入到python環(huán)境的lib目錄下(windows)。mac 用戶可以放在****/lib/python3.9/site-packages目錄下。
創(chuàng)建報告存放的文件夾report,報告目錄結構如下
main.py定義如下
import unittest
import HTMLTestRunner
test_dir = "/Users/lidong/Desktop/zhouyu/BILIBILI/筆記/unitTest/testCase"
# 報告存放的位置
report_path = "/Users/lidong/Desktop/zhouyu/BILIBILI/筆記/unitTest/report/"
# 打開目錄,生成html文件
file = open(report_path+'result.html', 'wb')
# 文件格式生成
run = HTMLTestRunner.HTMLTestRunner(stream=file, title='這是報告標題', description='這是報告描述')
# 加載用
dis = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")
# 運行用例
run.run(dis)
6、運行main.py之后,會在report目錄下生成html報告
7、 使用瀏覽器打開,可以看到如下報告
斷言基本操作
import unittest
import requests
class Tess(unittest.TestCase):
def setUp(self):
res = requests.get('http://www.baidi.com')
return res.status_code
def test1(self):
# 判斷獲取的狀態(tài)是否等于200
self.assertEqual(self.setUp(), 200)
if __name__ == '__main__':
unittest.main()
數(shù)據(jù)驅動 ddt data
import unittest
from ddt import ddt, data
@ddt
class TestCases2(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print('所有用例的前置')
@classmethod
def tearDownClass(cls) -> None:
print('所有用例的后置')
def setUp(self) -> None:
print('每個用例前置')
def tearDown(self) -> None:
print('每個用例的后置')
@data('username01', 'username02')
def test04(self, username):
"""冒煙用例"""
print('執(zhí)行用例4,',username,'登陸成功')
def test03(self):
"""爆炸用例"""
print('執(zhí)行用例3')
if __name__ == '__main__':
# 創(chuàng)建類加載對象
load = unittest.TestLoader()
# 分別加載兩個類
suit2 = load.loadTestsFromTestCase(TestCases2)
# 放在套件里
suits = unittest.TestSuite([suit2])
run = unittest.TextTestRunner()
run.run(suits)
運行結果
所有用例的前置
每個用例前置
執(zhí)行用例3
每個用例的后置
.每個用例前置
執(zhí)行用例4, username01 登陸成功
每個用例的后置
.每個用例前置
執(zhí)行用例4, username02 登陸成功
每個用例的后置
.所有用例的后置----------------------------------------------------------------------
Ran 3 tests in 0.000sOK
<unittest.runner.TextTestResult run=3 errors=0 failures=0>
鞏固
# -*- coding: utf-8 -*-,
# @File : test_module.py,
# @Author : lidong,
# @IDEA: PyCharm
# @Time : 2022/4/25 16:57
import unittest
class TestStringMethods(unittest.TestCase):
a = 67
# 跳過被此裝飾器裝飾的測試。 reason 為測試被跳過的原因。
@unittest.skip('取消測試')
def test_upper(self):
print('test_upper')
# 當condition為真時,跳過被裝飾的測試。
@unittest.skipIf(a>5, '取消測試')
def test_upper2(self):
print('test_upper2')
# 跳過被裝飾的測試,condition 為假
@unittest.skipUnless(a > 88, '跳過被裝飾的測試')
def test_upper3(self):
print('test_upper3')
def test_upper5(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
運行
===============================================================================
[SKIPPED]
取消測試
unitTest.testCase.test_module.TestStringMethods.test_upper
unitTest.testCase.test_module.TestStringMethods.test_upper2
===============================================================================
[SKIPPED]
跳過被裝飾的測試
unitTest.testCase.test_module.TestStringMethods.test_upper3
-------------------------------------------------------------------------------
Ran 6 tests in 0.093s
PASSED (skips=3, successes=3)
Process finished with exit code 0
Skipped: 取消測試
Skipped: 取消測試
Skipped: 跳過被裝飾的測試
總結
原文鏈接:https://blog.csdn.net/qq_43370607/article/details/124410107
相關推薦
- 2022-05-27 解析OpenSSL1.1.1?centos7安裝編譯aes的c++調(diào)用_C 語言
- 2022-09-26 快速搭建 ElasticSearch學習環(huán)境
- 2022-04-17 Android編程開發(fā)從零開始編寫一個輕量級瀏覽器_Android
- 2023-01-29 switch多選擇結構、循環(huán)結構示例詳解_Swift
- 2022-12-05 Go?reflect?反射原理示例詳解_Golang
- 2023-11-23 python的相對路徑表示方式
- 2022-01-21 Flink中實現(xiàn)自定義ProcessFunction實現(xiàn)定時器、側輸出
- 2022-06-12 Python?colorama?彩色打印實現(xiàn)代碼_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支