使用UnitTest框架對項目進行測試_第1頁
使用UnitTest框架對項目進行測試_第2頁
使用UnitTest框架對項目進行測試_第3頁
使用UnitTest框架對項目進行測試_第4頁
使用UnitTest框架對項目進行測試_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

使?UnitTest框架對項?進?測試使?UnitTest框架對iweb_shop項?進?測試UnitTest中?些重要的概念:TestCase(測試?例):所有測試?例的基類,它是軟件測試中最基本的組成單元。?個testcase就是?個測試?例,是?個完整的測試流程,包括測試前環(huán)境的搭建(setUp),執(zhí)?測試代碼(run),以及測試后環(huán)境的還原(tearDown)。測試?例是?個完整的測試單元,可以對某?問題進?驗證。TestSuite(測試套件):,多個測試?例TestCase集合就是TestSuite,TestSuite可以嵌套TestSuiteTestLoder:是?來加載TestCase到TestSuite中,其中有?個loadTestsFrom_()?法,就是從各個地?尋找TestCase,創(chuàng)建他們的實例,然后add到TestSuite中,再返回?個TestSuite實例TextTestRunner:是來執(zhí)?測試?例的,其中的run(test)會執(zhí)?TestSuite/TestCase中的run(result)?法。TextTestResult:測試結(jié)果會保存到TextTestResult實例中,包括運?了多少?例,成功與失敗多少等信息TestFixture:?叫測試腳?,測試代碼的運?環(huán)境,指測試準備前和執(zhí)?后要做的?作,包括setUp和tearDown?法。總結(jié)就是:對?個測試?例環(huán)境的搭建和銷毀。如何銷毀呢?就是通過覆蓋TestCase的setUp()和tearDown()?法來實現(xiàn),tearDown()的過程很重要,為后?的case保證了?個?凈的測試環(huán)境。先寫好TestCase然后由TestLoader加載TestCase到TestSuite,然后由TextTestRunner來運?TestSuite,運?的結(jié)果保存在TextTestResult中,整個過程集成在unittest.main模塊中,main會調(diào)?TextTestRunner中的run來執(zhí)?,或者我們可以直接通過TextTestRunner來執(zhí)??例。在Runner運?的時候,我們的測試結(jié)果會被輸出到控制臺,可以清晰的看到,還可以輸出到?件,運?HTMLTestRunner?成?個報告。正向登錄測試導包importunittest新建測試類并繼承unittest.TestCase新建?個Fixture(setup,tearDown)新建登錄?法if_name_==’_main_’:Unittest.main()執(zhí)?程序思路1、(setUp)實例化瀏覽器要實例化瀏覽器,必須要導包打開項??站?driver接收瀏覽器最?化maximize_window設(shè)置隱式等待在實際使?selenium或者appium時,等待下個等待定位的元素出現(xiàn),特別是web端加載的過程,都需要?到等待,?等待?式的設(shè)置是保證腳本穩(wěn)定有效運?的?個?常重要的?段,在selenium中(appium通?)常?的等待分為顯?等待WebDriverWait()、隱式等待implicitly_wait()、強制等待sleep()三種,sleep():強制等待,設(shè)置固定休眠時間。后腳本的執(zhí)?過程中執(zhí)?sleep()后線程休眠,?另外兩種線程不休眠。implicitly_wait():隱式等待,是設(shè)置的全局等待。設(shè)置等待時間,是對頁?中的所有元素設(shè)置加載時間,如果超出了設(shè)置時間的則拋出異常。隱式等待可以理解成在規(guī)定的時間范圍內(nèi),瀏覽器在不停的刷新頁?,直到找到相關(guān)元素或者時間結(jié)束。WebDriverWait():顯?等待,是針對于某個特定的元素設(shè)置的等待時間,在設(shè)置時間內(nèi),默認每隔?段時間檢測?次當前頁?某個元素是否存在,如果在規(guī)定的時間內(nèi)找到了元素,則直接執(zhí)?,即找到元素就執(zhí)?相關(guān)操作,如果超過設(shè)置時間檢測不到則拋出異常。為什么要設(shè)置元素等待,由于?絡(luò)速度原因,客戶端向服務(wù)器發(fā)送請求,服務(wù)器接收到請求響應(yīng)給我們,瀏覽器接收到響應(yīng)的數(shù)據(jù)后會?動給我們解析這些數(shù)據(jù)代碼來展現(xiàn)給我們,有可能在接收到數(shù)據(jù)的同時,瀏覽器還沒有加載完成,元素定位已經(jīng)開始找他了,最后沒有找到直接拋出異常。但是代碼沒有任何問題。2、執(zhí)?測試代碼(run)點擊登錄按鈕跳轉(zhuǎn)到登錄界?driver.find_element_by_link_text("登錄").click()定位?戶名及操作driver.find_element_by_css_selector("[alt*='郵箱']").send_keys("chenglin")定位密碼及操作driver.find_element_by_css_selector('[name="password"]').send_keys("123456")點擊登錄按鈕driver.find_element_by_css_selector(".submit_login").click()等待后退出time.sleep(3)driver.find_element_by_link_text("安全退出").click()3、(tearDown)關(guān)閉瀏覽器driver.quit()有test01.py---test10.py使?suite.addtest(unittest.makeSuite(className))導?10條測試例.addtest()需要添加10次defaultTestLoader使?unittest.defaultTestLoader()類,通過該類下?的discover()?法?動搜索指定?錄下指定開頭的.py?件,并將查找到的測試?例組裝到測試套件;(查找測試?例)(運?測試套件)?法:test_dir=’./為當前?錄’disconver=unittest.defaultTestLoader.discover(test_dir為要指定的?錄,pattern為查找的.py?件的格式=’----*.py’)運?:runner=unittest.TextTestLoader()runner.run(disconver)defaultTestLoader屬于TestSuite另?種實現(xiàn)?式UnitTest斷?讓程序代替?為判斷測試程序執(zhí)?結(jié)果是否符合預(yù)期結(jié)果的過程怎樣給圖?加時間戳圖?名稱添加錯誤信息sys.exc_info()內(nèi)容為:(<class'AssertionError'>,AssertionError("'admin'notfoundin'chenglin您好,歡迎您來到電?商務(wù)平臺購物![安全退出]'"),<tracebackobjectat0x0000026C2A840248>)只有捕獲才會存儲斷?:如果?戶名和密碼不匹配,登陸失敗,就捕獲截圖。總結(jié):能組織?例和執(zhí)??例提供豐富的斷??法提供豐富的?志與測試結(jié)果測試結(jié)果——HTML測試報告(以?頁形式)HTMLTestRunner(第三?模板)#coding=utf-8'''Project:通過測試套件執(zhí)?多個測試?例,并?成報告'''importunittest,timefromCommon.HTMLTestRunnerimportHTMLTestRunner#添加測試套件discover=unittest.defaultTestLoader.discover("E:\\(AAA)Web?動化測試\\Daima",pattern="test*.py")if__name__=='__main__':#第?步定義報告的項??件位置dir_path="E:\\(AAA)Web?動化測試\\Report\\"nowtime=time.strftime("%Y_%m_%d_%H_%M_%S")file_name=dir_path+nowtime+"Report.html"#給指定報告寫?數(shù)據(jù)withopen(file_name,"wb")asf:#實例化HTMLTestRunnerrunner=HTMLTestRunner(stream=f,title="Web?動化測試",description="操作系統(tǒng):win10")runner.run(discover)f.close()HTMLTestRunner.py?件"""ATestRunnerforusewiththePythonunittestingframework.ItgeneratesaHTMLreporttoshowtheresultataglance.Thesimplestwaytousethisistoinvokeitsmainmethod.E.g.importunittestimportHTMLTestRunner...defineyourtests...if__name__=='__main__':HTMLTestRunner.main()Formorecustomizationoptions,instantiatesaHTMLTestRunnerobject.HTMLTestRunnerisacounterparttounittest'sTextTestRunner.E.g.#outputtoafilefp=file('my_report.html','wb')runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title='Myunittest',title='Myunittest',description='ThisdemonstratesthereportoutputbyHTMLTestRunner.')#Useanexternalstylesheet.#SeetheTemplate_mixinclassformorecustomizableoptionsrunner.STYLESHEET_TMPL='<linkrel="stylesheet"href="my_stylesheet.css"type="text/css">'#runthetestrunner.run(my_test_suite)------------------------------------------------------------------------Copyright(c)2004-2007,WaiYipTungAllrightsreserved.Redistributionanduseinsourceandbinaryforms,withorwithoutmodification,arepermittedprovidedthatthefollowingconditionsaremet:*Redistributionsofsourcecodemustretaintheabovecopyrightnotice,thislistofconditionsandthefollowingdisclaimer.*Redistributionsinbinaryformmustreproducetheabovecopyrightnotice,thislistofconditionsandthefollowingdisclaimerinthedocumentationand/orothermaterialsprovidedwiththedistribution.*NeitherthenameWaiYipTungnorthenamesofitscontributorsmaybeusedtoendorseorpromoteproductsderivedfromthissoftwarewithoutspecificpriorwrittenpermission.THISSOFTWAREISPROVIDEDBYTHECOPYRIGHTHOLDERSANDCONTRIBUTORS"ASIS"ANDANYEXPRESSORIMPLIEDWARRANTIES,INCLUDING,BUTNOTLIMITEDTO,THEIMPLIEDWARRANTIESOFMERCHANTABILITYANDFITNESSFORAPARTICULARPURPOSEAREDISCLAIMED.INNOEVENTSHALLTHECOPYRIGHTOWNERORCONTRIBUTORSBELIABLEFORANYDIRECT,INDIRECT,INCIDENTAL,SPECIAL,EXEMPLARY,ORCONSEQUENTIALDAMAGES(INCLUDING,BUTNOTLIMITEDTO,PROCUREMENTOFSUBSTITUTEGOODSORSERVICES;LOSSOFUSE,DATA,ORPROFITS;ORBUSINESSINTERRUPTION)HOWEVERCAUSEDANDONANYTHEORYOFLIABILITY,WHETHERINCONTRACT,STRICTLIABILITY,ORTORT(INCLUDINGNEGLIGENCEOROTHERWISE)ARISINGINANYWAYOUTOFTHEUSEOFTHISSOFTWARE,EVENIFADVISEDOFTHEPOSSIBILITYOFSUCHDAMAGE."""#URL:/software/HTMLTestRunner.html__author__="WaiYipTung"__version__="0.8.2""""ChangeHistoryVersion0.8.2*Showoutputinlineinsteadofpopupwindow(ViorelLupu).Versionin0.8.1*ValidatedXHTML(WolfgangBorgert).*Addeddescriptionoftestclassesandtestcases.Versionin0.8.0*DefineTemplate_mixinclassforcustomization.*WorkaroundaIE6bugthatitdoesnottreat<script>blockasCDATA.Versionin0.7.1*BackporttoPython2.3(FrankHorowitz).*Fixmissingscrollbarsindetaillog(Podi).""""""#TODO:colorstderr#TODO:simplifyjavascriptusing,orethan1classintheclassattribute?importdatetimeimportioimportsysimporttimeimportunittestfromxml.saximportsaxutils#------------------------------------------------------------------------#Theredirectorsbelowareusedtocaptureoutputduringtesting.Output#senttosys.stdoutandsys.stderrareautomaticallycaptured.However#insomecasessys.stdoutisalreadycachedbeforeHTMLTestRunneris#invoked(e.g.callinglogging.basicConfig).Inordertocapturethose#output,usetheredirectorsforthecachedstream.##e.g.#>>>logging.basicConfig(stream=HTMLTestRunner.stdout_redirector)#>>>classOutputRedirector(object):"""Wrappertoredirectstdoutorstderr"""def__init__(self,fp):self.fp=fpdefwrite(self,s):self.fp.write(s)defwritelines(self,lines):self.fp.writelines(lines)defflush(self):self.fp.flush()stdout_redirector=OutputRedirector(sys.stdout)stderr_redirector=OutputRedirector(sys.stderr)#----------------------------------------------------------------------#TemplateclassTemplate_mixin(object):"""DefineaHTMLtemplateforreportcustomerizationandgeneration.OverallstructureofanHTMLreportHTML+------------------------+|<html>||<head>||||STYLESHEET|+----------------+||||||+----------------+||||||</head>|||<body>||||||HEADING||+----------------+||||||+----------------+||||REPORT||+----------------+||||||+----------------+||||ENDING||+----------------+||||||+----------------+||||</body>|</html>||+------------------------+"""STATUS={0:'pass',1:'fail',2:'error',}DEFAULT_TITLE='UnitTestReport'DEFAULT_DESCRIPTION=''#------------------------------------------------------------------------#HTMLTemplateHTML_TMPL=r"""<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Strict//EN""/TR/xhtml1/DTD/xhtml1-strict.dtd"><htmlxmlns="/1999/xhtml"><head><title>%(title)s</title><metaname="generator"content="%(generator)s"/><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"/>%(stylesheet)s</head><body><scriptlanguage="javascript"type="text/javascript"><!--output_list=Array();/*level-0:Summary;1:Failed;2:All*/functionshowCase(level){trs=document.getElementsByTagName("tr");for(vari=0;i<trs.length;i++){tr=trs[i];id=tr.id;if(id.substr(0,2)=='ft'){if(level<1){tr.className='hiddenRow';}else{tr.className='';}}if(id.substr(0,2)=='pt'){if(level>1){tr.className='';}else{tr.className='hiddenRow';tr.className='hiddenRow';}}}}functionshowClassDetail(cid,count){varid_list=Array(count);vartoHide=1;for(vari=0;i<count;i++){tid0='t'+cid.substr(1)+'.'+(i+1);tid='f'+tid0;tr=document.getElementById(tid);if(!tr){tid='p'+tid0;tr=document.getElementById(tid);}id_list[i]=tid;if(tr.className){toHide=0;}}for(vari=0;i<count;i++){tid=id_list[i];if(toHide){document.getElementById('div_'+tid).style.display='none'document.getElementById(tid).className='hiddenRow';}else{document.getElementById(tid).className='';}}}functionshowTestDetail(div_id){vardetails_div=document.getElementById(div_id)vardisplayState=details_div.style.display//alert(displayState)if(displayState!='block'){displayState='block'details_div.style.display='block'}else{details_div.style.display='none'}}functionhtml_escape(s){s=s.replace(/&/g,'&');s=s.replace(/</g,'<');s=s.replace(/>/g,'>');returns;}/*obsoletedbydetailin<div>functionshowOutput(id,name){varw=window.open("",//urlname,"resizable,scrollbars,status,width=800,height=450");d=w.document;d.write("<pre>");d.write(html_escape(output_list[id]));d.write("\n");d.write("\n");d.write("<ahref='javascript:window.close()'>close</a>\n");d.write("</pre>\n");d.close();}*/--></script>%(heading)s%(report)s%(ending)s</body></html>"""#variables:(title,generator,stylesheet,heading,report,ending)#------------------------------------------------------------------------#Stylesheet##alternativelyusea<link>forexternalstylesheet,e.g.#<linkrel="stylesheet"href="$url"type="text/css">STYLESHEET_TMPL="""<styletype="text/css"media="screen">bodypre{font-family:verdana,arial,helvetica,sans-serif;font-size:80%;}table{}{font-size:100%;}/*--heading----------------------------------------------------------------------*/h1{font-size:16pt;color:gray;}.heading{margin-top:0ex;margin-bottom:1ex;}.heading.attribute{margin-top:1ex;margin-bottom:0;}.heading.description{margin-top:4ex;margin-bottom:6ex;}/*--cssdivpopup------------------------------------------------------------------------*/a.popup_link{}a.popup_link:hover{color:red;}.popup_window{display:none;position:relative;left:0px;top:0px;/*border:solid#6271731px;*/padding:10px;background-color:#E6E6D6;background-color:#E6E6D6;font-family:"LucidaConsole","CourierNew",Courier,monospace;text-align:left;font-size:8pt;width:500px;}}/*--report------------------------------------------------------------------------*/#show_detail_line{margin-top:3ex;margin-bottom:1ex;}#result_table{width:80%;border-collapse:collapse;border:1pxsolid#777;}#header_row{font-weight:bold;color:white;background-color:#777;}#result_tabletd{border:1pxsolid#777;padding:2px;}#total_row{font-weight:bold;}.passClass{background-color:#6c6;}.failClass{background-color:#c60;}.errorClass{background-color:#c00;}.passCase{color:#6c6;}.failCase{color:#c60;font-weight:bold;}.errorCase{color:#c00;font-weight:bold;}.hiddenRow{display:none;}.testcase{margin-left:2em;}/*--ending----------------------------------------------------------------------*/#ending{}</style>"""#------------------------------------------------------------------------#Heading#HEADING_TMPL="""<divclass='heading'><h1>%(title)s</h1>%(parameters)s<pclass='description'>%(description)s</p></div>"""#variables:(title,parameters,description)HEADING_ATTRIBUTE_TMPL="""<pclass='attribute'><strong>%(name)s:</strong>%(value)s</p>"""#variables:(name,value)#------------------------------------------------------------------------#REPORT_TMPL="""<pid='show_detail_line'>Show<ahref='javascript:showCase(0)'>Summary</a><ahref='javascript:showCase(1)'>Failed</a><ahref='javascript:showCase(2)'>All</a></p><tableid='result_table'><colgroup><colalign='left'/><colalign='right'/><colalign='right'/><colalign='right'/><colalign='right'/><colalign='right'/></colgroup><trid='header_row'><td>TestGroup/Testcase</td><td>Count</td><td>Pass</td><td>Fail</td><td>Error</td><td>View</td></tr>%(test_list)s<trid='total_row'><td>Total</td><td>%(count)s</td><td>%(Pass)s</td><td>%(fail)s</td><td>%(error)s</td><td></td></tr></table>"""#variables:(test_list,count,Pass,fail,error)REPORT_CLASS_TMPL=r"""<trclass='%(style)s'><td>%(desc)s</td><td>%(count)s</td><td>%(Pass)s</td><td>%(fail)s</td><td>%(error)s</td><td><ahref="javascript:showClassDetail('%(cid)s',%(count)s)">Detail</a></td></tr>"""#variables:(style,desc,count,Pass,fail,error,cid)REPORT_TEST_WITH_OUTPUT_TMPL=r"""<trid='%(tid)s'class='%(Class)s'><tdclass='%(style)s'><divclass='testcase'>%(desc)s</div></td><tdcolspan='5'align='center'><aclass="popup_link"onfocus='this.blur();'href="javascript:showTestDetail('div_%(tid)s')">%(status)s</a><divid='div_%(tid)s'class="popup_window"><divstyle='text-align:right;color:red;cursor:pointer'><aonfocus='this.blur();'onclick="document.getElementById('div_%(tid)s').style.display='none'"></a>[x]</div><pre></pre></div></td></tr>"""#variables:(tid,Class,style,desc,status)REPORT_TEST_NO_OUTPUT_TMPL=r"""<trid='%(tid)s'class='%(Class)s'><tdclass='%(style)s'><divclass='testcase'>%(desc)s</div></td><tdcolspan='5'align='center'>%(status)s</td></tr>"""#variables:(tid,Class,style,desc,status)REPORT_TEST_OUTPUT_TMPL=r"""%(id)s:%(output)s"""#variables:(id,output)#------------------------------------------------------------------------#ENDING#ENDING_TMPL="""<divid='ending'></div>"""#--------------------TheendoftheTemplateclass-------------------TestResult=unittest.TestResultclass_TestResult(TestResult):#note:_TestResultisapurerepresentationofresults.#Itlackstheoutputandreportingabilitycomparestounittest._TextTestResult.def__init__(self,verbosity=1):TestResult.__init__(self)self.stdout0=Noneself.stderr0=Noneself.success_count=0self.failure_count=0self.error_count=0self.verbosity=verbosity#resultisalistofresultin4tuple#(#resultcode(0:success;1:fail;2:error),#TestCaseobject,#Testoutput(bytestring),#stacktrace,#)self.result=[]defstartTest(self,test):TestResult.startTest(self,test)#justonebufferforbothstdoutandstderrself.outputBuffer=io.StringIO()stdout_redirector.fp=self.outputBufferstderr_redirector.fp=self.outputBufferself.stdout0=sys.stdoutself.stderr0=sys.stderrsys.stdout=stdout_redirectorsys.stderr=stderr_redirectordefcomplete_output(self):"""Disconnectoutputredirectionandreturnbuffer.Safetocallmultipletimes."""ifself.stdout0:sys.stdout=self.stdout0sys.stderr=self.stderr0self.stdout0=Noneself.stderr0=Nonereturnself.outputBuffer.getvalue()defstopTest(self,test):#UsuallyoneofaddSuccess,addErrororaddFailurewouldhavebeencalled.unittestthatwouldbypassthis.#Buttherearesomepathplete_output()#WemustdisconnectstdoutinstopTest(),whichisguaranteedtobecalled.defaddSuccess(self,test):self.success_count+=1TestResult.addSuccess(self,test)output=plete_output()self.result.append((0,test,output,''))ifself.verbosity>1:sys.stderr.write('ok')sys.stderr.write(str(test))sys.stderr.write('\n')else:sys.stderr.write('.')defaddError(self,test,err):self.error_count+=1TestResult.addError(self,test,err)_,_exc_str=self.errors[-1]output=plete_output()self.result.append((2,test,output,_exc_str))ifself.verbosity>1:sys.stderr.write('E')sys.stderr.write(str(test))sys.stderr.write('\n')else:sys.stderr.write('E')defaddFailure(self,test,err):self.failure_count+=1TestResult.addFailure(self,test,err)_,_exc_str=self.failures[-1]output=plete_output()self.result.append((1,test,output,_exc_str))ifself.verbosity>1:sys.stderr.write('F')sys.stderr.write(str(test))sys.stderr.write('\n')else:sys.stderr.write('F')classHTMLTestRunner(Template_mixin):""""""def__init__(self,stream=sys.stdout,verbosity=1,title=None,description=None):self.stream=streamself.verbosity=verbosityiftitleisNone:self.title=self.DEFAULT_TITLEelse:self.title=titleifdescriptionisNone:self.description=self.DEFAULT_DESCRIPTIONelse:self.description=descriptionself.startTime=datetime.datetime.now()defrun(self,test):"Runthegiventestcaseortestsuite."result=_TestResult(self.verbosity)test(result)self.stopTime=datetime.datetime.now()self.generateReport(test,result)#print>>sys.stderr,'\nTimeElapsed:%s'%(self.stopTime-self.startTime)%s'%(self.stopTime-self.startTime))print(sys.stderr,'\nTimeElapsed:returnresultdefsortResult(self,result_list):#unittestdoesnotseemstoruninanyparticularorder.#Hereatleastwewanttogroupthemtogetherbyclass.rmap={}classes=[]forn,t,o,einresult_list:cls=t.__class__ifnotclsinrmap:rmap[cls]=[]classes.append(cls)rmap[cls].append((n,t,o,e))r=[(cls,rmap[cls])forclsinclasses]returnrdefgetReportAttributes(self,result):"""Returnreportattributesasalistof(name,value).Overridethistoaddcustomattributes."""startTime=str(self.startTime)[:19]duration=str(self.stopTime-self.startTime)status=[]ifresult.success_count:status.append('Pass%s'%result.success_count)status.append('Failure%s'%result.failure_count)ifresult.failure_count:ifresult.error_count:status.append('Error%s'%result.error_count)ifstatus:status=''.join(status)else:status='none'return[('StartTime',startTime),('Duration',duration),('Status',status),]defgenerateReport(self,test,result):report_attrs=self.getReportAttributes(result)generator='HTMLTestRunner%s'%__version__stylesheet=self._generate_stylesheet()heading=self._generate_heading(report_attrs)report=self._generate_report(result)ending=self._generate_ending()output=self.HTML_TMPL%dict(title=saxutils.escape(self.title),generator=generator,stylesheet=stylesheet,heading=heading,report=report,ending=ending,)self.stream.write(output.encode('utf8'))def_generate_stylesheet(self):returnself.STYLESHEET_TMPLdef_generate_heading(self,report_attrs):a_lines=[]forname,valueinreport_attrs:line=self.HEADING_ATTRIBUTE_TMPL%dict(name=saxutils.escape(name),value=saxutils.escape(value),)a_lines.append(line)heading=self.HEADING_TMPL%dict(title=saxutils.escape(self.title),parameters=''.join(a_lines),description=saxutils.escape(self.description),)returnheadingdef_generate_report(self,result):rows=[]sortedResult=self.sortResult(result.result)forcid,(cls,cls_results)inenumerate(sortedResult):#subtotalforaclassnp=nf=ne=0forn,t,o,eincls_results:ifn==0:np+=1elifn==1:nf+=1else:ne+=1#formatclassdescriptionifcls.__module__=="__main__":name=cls.__name__else:name="%s.%s"%(cls.__module__,cls.__name__)doc=cls.__doc__andcls.__doc__.split("\n")[0]or""desc=docand'%s:%s'%(name,doc)ornamerow=self.REPORT_CLASS_TMPL%dict(style=ne>0and'errorClass'ornf>0and'failClass'or'passClass',desc=desc,count=np+nf+ne,Pass=np,fail=nf,error=ne,cid='c%s'%(cid+1),))rows.append(row)fortid,(n,t,o,e)inenumerate(cls_results):self._generate_report_test(rows,cid,tid,n,t,o,e)report=self.REPORT_TMPL%dict(test_list=''.join(rows),count=str(result.success_count+result.failure_count+result.error_count),Pass=str(result.success_count),fail=str(result.failure_count),error=str(result.error_count),)returnreportdef_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論