单元测试unittest(基于数据驱动的框架:unittest+HTMLTestRunner/BeautifulReport+yaml+ddt)...
一、定義
unittest單元測(cè)試框架不僅可以適用于單元測(cè)試,還可以適用WEB自動(dòng)化測(cè)試用例的開(kāi)發(fā)與執(zhí)行,該測(cè)試框架可組織執(zhí)行測(cè)試用例,并且提供了豐富的斷言方法,判斷測(cè)試用例是否通過(guò),最終生成測(cè)試結(jié)果。
unittest通過(guò)建立類(lèi)并繼承父類(lèi)unittest.TestCase將用例組織起來(lái),統(tǒng)一執(zhí)行
示例:
import unittest class Testcase(unittest.TestCase):#類(lèi)繼承unittest.TestCasedef setUp(self):#每條用例運(yùn)行前,運(yùn)行。一般可用來(lái)做些準(zhǔn)備工作print('我是setup,什么時(shí)候運(yùn)行')def tearDown(self):#每條用例結(jié)束后,運(yùn)行,一般可用來(lái)做些收尾工作print('teardown什么時(shí)候運(yùn)行')def testa(self):print('測(cè)試用例a')self.assertEqual(1,2,'計(jì)算結(jié)果不正確')#assertEqual是父類(lèi)unittest.TestCase的函數(shù),用來(lái)驗(yàn)證實(shí)際結(jié)果是否與預(yù)期結(jié)果相等#第一個(gè)參數(shù)是預(yù)期結(jié)果,第二個(gè)參數(shù)是實(shí)際結(jié)果,第三個(gè)參數(shù)是當(dāng)前面兩個(gè)不相等時(shí),回顯示的提示信息。第三個(gè)參數(shù)是非必填的def testb(self):'''這里是測(cè)試用例的描述,會(huì)最終顯示在測(cè)試報(bào)告中的,必須用三個(gè)單引號(hào)括起來(lái)才可以,用#d不行'''print('測(cè)試用例b')self.assertEqual(1,1)def c(self):print('c函數(shù)不是以test開(kāi)頭的,所以不會(huì)當(dāng)做用例被執(zhí)行')# self.assertIn('a','abc') @classmethoddef setUpClass(cls):#所有的用例運(yùn)行前,運(yùn)行setupClassprint('什么時(shí)候運(yùn)行setupClass')def tearDownClass(cls):#所有用例運(yùn)行后,執(zhí)行tearDownClassprint('什么時(shí)候運(yùn)行tearDownClass')unittest.main()#執(zhí)行當(dāng)前python文件中的所有用例,會(huì)在控制臺(tái)顯示運(yùn)行結(jié)果,不會(huì)產(chǎn)生測(cè)試報(bào)告 #運(yùn)行的時(shí)候不要右鍵運(yùn)行run unittest for...,這個(gè)是pycharm自己給運(yùn)行的unittest,不會(huì)產(chǎn)生測(cè)試報(bào)告 # 應(yīng)點(diǎn)擊菜單欄中Run--run,彈出提示框后,選擇自己要運(yùn)行的文件進(jìn)行run #函數(shù)名用例必須以test開(kāi)頭,才會(huì)被執(zhí)行二、用例集suite+HTMLTestRunner/BeautifulReport
用例集即測(cè)試套件,可以吧所有的用例放入用例集當(dāng)中執(zhí)行,并結(jié)合HTMLTestRunner或者BeautifulReport產(chǎn)生出直觀(guān)的漂亮的測(cè)試報(bào)告
#-------------------------------------------------------------------HTMLTestRunner寫(xiě)報(bào)告(丑)
#將下載好的HTMLTestRunner.py 放到 pycharm的External Libraries目錄下的lib目錄下,然后導(dǎo)入:import HTMLTestRunner,緊接著上面的代碼:(把unittest.main注釋掉)
然后通過(guò)run-run選中要執(zhí)行的當(dāng)前文件,運(yùn)行后,就會(huì)產(chǎn)生一個(gè)html格式的報(bào)告,可用瀏覽器打開(kāi),如下:
#--------------------------------------------------------BeautifulReport 報(bào)告(美)
#下載BeautifulReport ,解壓后運(yùn)行setup.py。可以將解壓后的文件拷貝到pycharm中,然后運(yùn)行setup.py也可。然后要導(dǎo)入:
from BeautifulReport import BeautifulReport as bf #bf就是個(gè)別名,方便使用
suite=unittest.TestSuite()#定義用例集,是個(gè)list suite.addTest(unittest.makeSuite(Testcase))#將類(lèi)TestCase先變成一個(gè)用例集合,然后再加入到suite中 report=bf(suite)##先實(shí)例化這個(gè)類(lèi) report.report(description='用例描述',filename='用例文件名字') #description必填參數(shù),log_path是非必寫(xiě)的,默認(rèn)在當(dāng)前目錄下。也可以定義別的目錄 #filename可寫(xiě)可不寫(xiě),回自動(dòng)生成個(gè)名字。名字后綴默認(rèn)就是html。可寫(xiě)上也可不寫(xiě)執(zhí)行后,生成html格式報(bào)告:打開(kāi):
?
?三、用unittest測(cè)接口示例
1、接口數(shù)據(jù):yaml格式文件,存有3條用例數(shù)據(jù)
2、用ddt自動(dòng)讀取用例數(shù)據(jù)并傳遞給測(cè)試類(lèi)中的測(cè)試用例函數(shù)
3、執(zhí)行用例
4、寫(xiě)報(bào)告
用例數(shù)據(jù)
- #用減號(hào)-區(qū)分不同的用例。最終是個(gè)list,然后每個(gè)list是個(gè)字典: [{}{}]url: /api/user/logindetail: 正常登錄method: postdata:username: aaapasswd: aA123456check:- userId- error_code-url: /api/user/logindetail: 密碼錯(cuò)誤method: postdata:username: aaapasswd: aA1234check:- 密碼錯(cuò)誤-url: /api/user/logindetail: 必填參數(shù)未填,用戶(hù)名不傳method: postdata:passwd: aA1234check:- 必填參數(shù)未填接口測(cè)試代碼:獲取數(shù)據(jù),執(zhí)行測(cè)試用例并發(fā)送測(cè)試結(jié)果報(bào)告
import unittest import ddt#自動(dòng)讀取文件內(nèi)容,該模塊需要先安裝pip install ddt import requests from BeautifulReport import BeautifulReport as bf from urllib import parse@ddt.ddt #聲明這個(gè)類(lèi)要用ddt class Login(unittest.TestCase):base_url='http://100.20.20.40'@ddt.file_data('login1.yaml')#ddt自動(dòng)讀取文件,并獲取內(nèi)容傳給下面的函數(shù),循環(huán)調(diào)用.運(yùn)行如果出現(xiàn)字符編碼問(wèn)題,就直接打開(kāi)file_data源文件,搜索open,將打開(kāi)文件的代碼中,加上encoding=utf-8def test_request(self,**kwargs):#**kwargs可以傳入字典參數(shù),不限個(gè)數(shù).此處用來(lái)接收從login1.yaml中讀出來(lái)的用例,是字典detail=kwargs.get('detail','沒(méi)寫(xiě)用例描述')#如果沒(méi)有定義detail,默認(rèn)給個(gè)值’沒(méi)寫(xiě)用例描述‘self._testMethodDoc=detail#設(shè)置用例描述 url=kwargs.get('url')url=parse.urljoin(self.base_url,url)#自動(dòng)拼接url,method=kwargs.get('method','get')#method默認(rèn)給個(gè)get方法data=kwargs.get('data',{})#如果沒(méi)給data,默認(rèn)給個(gè)空字典header=kwargs.get('header',{})#如果沒(méi)有header參數(shù),默認(rèn)給個(gè)空字典cookie=kwargs.get('cookie',{})check=kwargs.get('check')#獲取login1.yaml中的預(yù)期結(jié)果check,是listmethod=method.lower()# try:if method=='get':res=requests.get(url,params=data,cookies=cookie,headers=header).text#因?yàn)閷?shí)際結(jié)果失敗的話(huà),不會(huì)返回json串,所以不能轉(zhuǎn)成字典else:res=requests.post(url,data,cookies=cookie,headers=header).textexcept Exception as e:print('接口請(qǐng)求出錯(cuò)')res=efor c in check:#循環(huán)遍歷check中的所有預(yù)期結(jié)果,判斷是否包含在實(shí)際結(jié)果中self.assertIn(c,res,msg='預(yù)期結(jié)果不符,預(yù)期結(jié)果%s,實(shí)際結(jié)果%s'%(c,res))#斷言,如果預(yù)期結(jié)果在實(shí)際結(jié)果中,pass.否則斷言失敗并給出錯(cuò)誤信息msg suite=unittest.TestSuite() suite.addTest(unittest.makeSuite(Login)) run=bf(suite) run.report('login_test','登錄測(cè)試用例')#第一個(gè)是描述,第二個(gè)是文件名 print(run.success_count)#通過(guò)的次數(shù) print(run.failure_count)#失敗次數(shù))?
轉(zhuǎn)載于:https://www.cnblogs.com/bendouyao/p/9153557.html
總結(jié)
以上是生活随笔為你收集整理的单元测试unittest(基于数据驱动的框架:unittest+HTMLTestRunner/BeautifulReport+yaml+ddt)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Mac Eclipse安装lombok
- 下一篇: 2017年html5行业报告,云适配发布