unittest框架的注意点

这篇并不是讲unittest如何使用,而是记录下在和htmltestrunner集成使用过程中遇到的一些坑,主要是报告展示部分。

我们都知道python有一个单元测试框架pyunit,也叫unittest,类似于java的junit。功能也比较丰富,他也有初始函数setUp(self), 清理函数tearDown(self)。

它有两只执行方式:

一、使用时首先我们的测试类要继承于unittest.TestCase.  然后把我们的测试都放到unittest.TestSuite()容器中,最后使用 unittest.TextTestRunner().run(suite)方法自动测试。

二、编写的测试用例类继承unittest.TestCase类,所有测试函数以test开头,执行时,执行unittest.main(),所有测试类中以test开头的函数自动执行。

下面是我的一个实验代码,在加上了断言后遇到一些坑,或者说是因为自己对unitest不熟悉而带来的误解吧。

testsuite.addTest(testClass("testsearch2")),有这一行可知我只加入了testsearch2用例到testsuite,那么按道理来讲,不论运行结果是pass还是fail还是异常,setup和teardown都应该只被执行一次。

但实际情况是,在运行完后看report时,report的结果会带来一些误解:

1、如果pass,report结果显示很准确,aaarticlea/png;base64,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" alt="" />

2、但如果运行中出现异常,report会显示成这样,单看这个report,会有一种错觉就是setup被执行了2次,第一次是在testsearch2运行时,第二次是teardown运行时,但是从逻辑来讲,setup和teardown只应该被执行一次,所以我定义了一个变量,并且在setup里自增,就是setup每调用一次就自增一并且打印出来,从下面的log可以看出,虽然报告里是显示了2个testsearch2的运行错误,但是自增变量的值都是1,由此可以推测setup其实还是只被运行了一次,应该是HTMLTestRunner报告的展示问题而引起的误解。所以这个也是后期在进行设计时要注意的,需要对报告进行封装以避免  误解。

aaarticlea/png;base64,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STKVRfEABCL0kJzwLEWSTGVRPACBCD0kJzxLkSRTWRQPQCBCD8kJz1IkyVQWxQMQiNBDcsKzFEkylUXxAAQi9JCc8CxFkkxlUTwAgQg9JCc8S5EkU1kUD0AgQg/JCc9SJMlxXnz3TWU2K7NZmd109dGB1R6977vX1pl9992fa2m2KB6AQIQekhOe/EiS47z47pu+88AKKysegAkg9JCc8ORHkhyn4gE4ggg9JCc8+ZEkx7lYPDxwV5nNri159L7vHnwvk+IBmAZCD8kJT34kyXH2PHl44K4yu+nqo5+7+srFT0EoHoBpIPSQnPDkR5IcZ+/blvY+Rd2tExQPwDQQekhOePIjSY6zUjyUt+10lysegAkg9JCc8ORHkhxn/9uWXnnfxdM739n/8MPcyooHYAIIPSQnPPmRJMfZ94Hpu6688PpA/aB4AKaB0ENywpMfSXKcvqoVOIIIPSQnPPmRJMfpL0wDRxChh+SEJz+SZCqL4gEIROghOeFZiiSZyqJ4AAIRekhOeJYiSaayKB6AQIQekhOepUiSqSyKByAQoYfkhGcpkmQqi+IBCEToITnhWYokmcqieAACEXpITniWIkmmsigegECEHpITnqVIkqksigcgEKGH5IRnKZJkKoviAQhE6CE54VmKJJnKongAAhF6SE54liJJprIoHoBAhB6SE56lSJKpLIoHIBChh+SEZymSZCqL4gEIROghOeFZiiSZyqJ4AAIRekhOeJYiSaayKB6AQIQekhOepUiSqSyKByAQoYfkhGcpkmQqi+IBCEToITnhWYokmcqieAACEXpITniWIkmmsigegECEHpITnqVIkqksigcgEKGH5IRnKZJkKoviAQhE6CE54VmKJJnKongAAhF6SE54liJJprIoHoBAhB6SE56ljpKPf+vPn/jSZ889+LELv/neC+9954XffO+5Bz/2xJc++/i3/jy8byTZaFE8AIEIPSQnPEtN3XN/cP/Ff/F/Xrnt+NWbb3r+e77nuVfcfOWNt1765z954T3vuPTPf/LKG2997hU3P/8933P15puu3Hb84r0/e/Yz94f3mSQrFsUDEIjQQ3LCs9R0vbDz/t3/9djubcfP//a/PffQx5947OHKyk889vC5hz5+/qO/sXvr63aP33Lhw+8P7z9J9loUD0AgQg/JCc9Sk/Nb/+nPnn7XL139n/7HS//7W89+7pMjWjj72U9e+skfu/qy//npf/XL3/qLPwsfEUnOWxQPQCBCD8kJz1LT8okvffbyHbdf/OW3n/n//njNps587eTFX3r75Tturz+yIMlDtigegECEHpITnqUm5NkvPvjcK27eeLNXb77p7J88FD46ktyzKB6AQIQekhOepabi2T98YPeHXrWlxndf9QNnH/7d8DGS5GnFAxCL0ENyGnPJ7DqVFdZsIbNnT/7+7vHXjh57i1duec3ZP/1M+EhJsigegECEHpLTkki6k+OFJUurgvn/3Ub9sNWa5InHHr78xlsru97U3i+/8dYzX/789gZCki0WxQMQiNBDcloSydLioXfJ0P9uo5DYavHw9Lt+6eIvv/0Q9n7xxM89/a//5fYGQpItFsUDEIjQQ3KWZpHZHAtLFlZryUmrzrO7ez/dudnf273ui9GPCHZvfV39L7ttqng495n7r9x6fIMzAJIcYVE8AIEIPSSnJZGs/+ShfZ32HVWeYHTX6d2qyf/0p9/+H/7Rxsc15Lf/4X9/+i9Obao1khxhUTwAgQg9JKclkWykeBg9wx56znA4xcOFnV+79FM/vqWhdb30Uz9+YefXNtUaSY6wKB6AQIQektOSSDb7mYdx1mf/igeS3JRF8QAEIvSQnKVZZOgDA/VPQfSuvHS1xr0v7U93w5Zd9y/5+p99+x/9w5YebiRne9sSyXCL4gEIROghOeFZ6nBcZ3K/e9vxc39Q+8D0pjz30Mev3OYD0ySDLYoHIBChh+SEZ6lDcM2HA0//q1+++Eu1r2rdlM/84s89/W/uCz9cJG9wi+IBCEToITnhWSq/Z778+cs/fNsh7OjyG28985UvhI+X5A1uUTwAgQg9JCc8S03Cs3/y0JVbXrPVXewe+1+e+LN/Hz5SkiyKByAQoYfkhGepqXj24d/dfdUPbKnx537gn5z9/O+Fj5EkTysegFiEHpITnqUm5Nk/eejqzTdtvNmrL3/ZE6f+MHx0JLlnUTwAgQg9JOdwUtEGv8x0s71adZMnHnv4yh23PfOLP3fmz7+45rjOfPnzz5y458qhf85hs98tS/LoWRQPQCBCD8nZVLJp+YsNselwUx341l+cevrf3Hf1H7/s2Z+48+y//8SIZs9+5v5n77rz6k3/+Kl/fd+3vvGlSR8NkkfPongAAhF6SM6mks2NUzzs++RvfWD3n97yhb/7d89/5APnHvzYE498rrLyE4987tyDHzv/Wx/YPX7L7q2ve/Ijv37EjgbJI2NRPACBCD0kpyWRDP2N58oK3YWN75bpbtKyu94dtW/S3k7X/+6v/tVf+Nt/+zMvetFzr7j5O9/7vc99//ddecPr3/93/s6df/NvXvo/fuLKG17/n//e3/vO937vc6+4+TMvetEv/K2/dfazn6x0oPFcDB3n+hFb2Kq3EUUFyaJ4AAIRekjO0iwyP5keenG6bzLaslXjvnp3tNKL3v1uo89PPPrwS//6X7/wwfddeM87Xv83/sa53/+dJx59uDJ3X2myPm7sK50vkiyKByAQoYfkLM0ivdPK3hv59a0aJ+LjWl7YKrB4qPenPtKWc7F0pENjrx/V/XXaO0PyqFoUD0AgQg/JWZpFGsuATRUPvUtWqgEae1jp8/rFQ3sPV7JlpOOePKzZMZJHyaJ4AAIRekhOSyLpvW89tLB3q+7rln0NbVLpz9AK3R72rjO0wlCfh9YZGnv9qK55LipnZzZM5YSSvDEtigcgEKGH5IRnqW14A86Ab8Ahk9ySRfEABCL0kJzwLLVxb8A76DfgkEluz6J4AAIRekhOeJYiSaayKB6AQIQekhOepUiSqSyKByAQoYfkhGcpkmQqi+IBCEToITnhWWrb+iSA409yJYviAQhE6CE59RTS+7WeG3Fcg6tuZeba8tWuLVut2Yfw40Cy3aJ4AAIRekhOPYXM5v5G28angOMabN9qIx2Onfhub/re0vIGT5D6gZyQRfEABCL0kJyWRLKlmZ/i4dD2nq14UEuQmS2KByAQoYfktCSS7pte5l8sLF9YUlmn970xS9uZ3/vS994stFDfV3e1pXvZ1NHo7WHLGFuO8+nNFQ+jj1jL7kgmsSgegECEHpLTkkha5veH/GKlue/8Ji27qIy9d4UtHY3GvY9rZ0TxsM4RUzyQE7IoHoBAhB6S05JIlt7GPj3wfKB3haXT3MZ22rvdWDzsN750sPUVKiMdcTRW3XvvIdpI8TDUcuPlsXR3JJNYFA+rcPKrs9mp2eyrJ6M7gqOC0ENyWhLJ0tlhyz3plbZqaWfVu/ItxUN3ybjiYZ0lm9r7xouHdY6Y4oGckGXbxcM3T8xOzWanTqw13d5II5ugWjyc2XlkNju1b3xvMQEUD0jO0izSvUHee+O/91Z6713qelP1drqvl3a+99/5liu77l2tcnAqy+tLKuNaOsxKy126/1tvs36IGo9Y7/FpnMSQPHyL4mEVasXDhZ1jp47tXCillDNfP5akw8iO4gHJCc9S29Y81fEnuZJlq8XDtUn/vtfm1uXCzrG55Se++cIW12bn1z329TNDjfSsWWqNX5/Qd//r2hODY18/ufPIYCf3KoH94uGFve8XEhd2dvYHcm3b600BQygekJzwLEWSTGU59CcP1ybxj+ycKaWUkydemMdff9tP977+YiODaw43fpADk/uFtxsd27nQ3ePJE/PFw16blQrh2uaKByxD8YDkhGcpkmQqy2EXD/u3+a89KJh7I9C1uX7PnLtnKt+7ZqXx+XYWHj4sbtW3pPQ1OFSc7Fcj3raEZSgekJzwLEWSTGU57OJhf95/0K+eLJV3Fg09vlhcs9b49YcGe430PPGYKxUGH1m0FA8Hnk4AdRQPSE54liJJprJEP3mobnX9DUiVD0wfWLPS+MJEv148jH/yoHLAaigekJzwLLXUWedbklbdlts+Pts7zjfCGVznCie3YYn6zMPBJUum6dVvW5pfc7jxg/XA9Q9DDxQP3XYOfuZhoHi4Xjn4qAOaUTwgOeunmcrXenbXGdH4UFNLW9tfoX2T7rg2e3zGbb5+HzbVcu8mqXq4qXMxNNJtdGnVkQ4NYf2+9cbymsF7+K4ZcTx9KH8kbu5rkYa+yGhv4t5509Hc56EPNlJbc6Dxg8sfOVYvHvraWVI8dN9J1f/hb2AexQOSs6lsvfCivtqqLfe2v9L8r7GH63d4neOzKRv3smpnhmZjCws3WCNto+U1z0WG4mFLPeltc6WI21If1mlE/TDO4i9MA4EIPSRnI5mmcQK0kTuj7csVDxsfneIhz2RU8dDSSJ7zNS2L4gEIROghORvJNN03CTS+rWLVtxa0r9ydMg69E6PyDo3eNz90V+i+6D0ala2Gjkb7kkqfh7pUWaFyfFY6zr19ru9u2y23t9MdafeY9K656lEd56qHojK0ep+H9ri0ey39qRzkSp+7R7W7sLf/C8sX/m3p4Q1iUTwAgQg9JGcjmWY+By8srCzpTfAtOxqxZqUz67/oTrAWDkjv3huPRu/sbekkaelBa+9zffo44iwv7c9WW17zGDbudJ2tGl3n+LTsfeEKHzGrHhfvI0bREk31smHjZ2fqFsUDEIjQQ3I2kmnGTQdHTEoa12yfiTbOjBdWm+9z76ylpXho2dfQrkdMxJfOjHv7XOlM4957z3JltndoLVfOactWLRPN+sx1TVviq/uiPeJaLtqVWmg5Yiud5Zb4qr8YOukbOUGTtigegECEHpKzkUzTPoVdulX7jlombUt7WG+wcQrS3aR3It7Yw8pRah9X/bC09Ll7fBrPYPtZbpmsb6/l+qncUvHQe1THOa54aG9zxOar9melrVbqWHvkKh56LYoHIBChh+Ssn2a6N/C6C2cHqW87bnf1H3v30rtkf83u696xdEfU/bdx1C2dbGxtqMOVwzUbnktVdl05Ry0XQ6XP22i5vkJ3tco6vVuNuFZ7x7h0hUpnuj9WVqs0PuK8V9oZ6s+Is9w9ApX/rTc7P5aVenjkLYoHIBChh+SEZ6mN2571JzE/2HgnN3V8tnf0JnFeRg9k6ejyDz9/D7mmRfEABCL0kJzwLBVi/juLS+8Q3+DHJ79Dd8SXbhXe86n3kOtbFA9AIEIPyQnPUiTJVBbFAxCI0ENywrMUSTKVRfEABCL0kJzwLEWSTGVRPACBCD0kJzxLsevC98CQ5GFaFA9AIEIPyQnPUvtWPiLc8unhlhViRzdiTfUDycO3KB6AQIQekhOepRbsTpeP2Fev1nu7zvBJciMWxQMQiNBDcsKz1IKKh0kPiuQRsCgegECEHpJzaNmo8rdgF1ZbulWl8fk257fq3W99td4VNrL3hU0qw+9dQpJbtSgegECEHpJzaNmoMi2uv8t/6ey5207LvLx3q5Z2WvY+elyKB5LhFsUDEIjQQ3IOMyEN3f7fRvFQWW3+x3p/WibuigeSR8yieAACEXpIzuGnpZWm+EOr1Rtsb3nNuqW+d8UDySlaFA9AIEIPyTm0bDT0nGHhQwLde/8tTwNmffSusLBwqJ32TXrXXOhGb1OnO9VLdxcqB5KHb1E8AIEIPSQnPEsdGTc40d8vOcIHRfIGtCgegECEHpITnqWOhkPPFkhychbFAxCI0ENywrMUSTKVRfEABCL0kJzwLEWSTGVRPACBCD0kJzxLkSRTWRQPQCBCD8kJz1JTd4qfc5hin1k39py6oo6YRfEABCL0kJyWRLKpmUH3y0w30ubQ17MejtvbaeP3vR5Onyu73vgROEofPd/GNb/SWVi606gripktigcgEKGH5LQkkvrfIhhaMqLZcavtr3D4M5jNzqeH/sLDZv/yw+gWNv5dtIezr+31OfCaX2n9bR/MhCeLa1oUD0AgQg/JaUkk3ZuXqSZSW/2rCOuXAeO2OrTb/Nse1LimEs5HU13z29gpuW9RPACBCD0kZ2kW6U7Nu++fWViy8E6bhYUjturdsL2d3paHutfd3aqu1OehkbYXD+0trzqu+nGun9alJ7remXHHcKiRpT0cMfbeQZ0euKhGbDWiz/XD2NLD3vWHXo/rEidhUTwAgQg9JGdpFtmfKHQXVpb0TiyGGqm8aN+qOweq96e3nU1NhtpHOrTVUE9GtDxuUI1nZ6jbK53TcXtvGde4zRv7HHjNjz6DG+mhsuHIWxQPQCBCD8lZmkVmc8wv7K5W+bG+zqoTqYX+tEyXK0vGzcyWHrSWY9gyC28ZSEvLq45udPGw9Oy0HOqhK2HpSEePouWoLj3LS0e6qWt+zTO4tIcjzimPkkXxAAQi9JCcpVmkZXLTXbLVidTSHi7tXuNWo205GvWRtrwePeSVhrBq8dCy0xHFw0ojHddO/aimuubXPIP1xletmnj0LIoHIBChh+TUU8jC7cb6Td/9Jb13SbsL66tV9jW/wuwg7TvqHd0G50n1PvQOs96l7kh7m+quM7SvNYcwdIgaj3+lP93hNI50pXZaxt47kN5RVMbYeCjq+6qPtGUUjT3sntDeI7lqTzgti+IBCEToITnhWYpT1zySPGIWxQMQiNBDcsKzFCeqO9DkUbUoHoBAhB6SE56lSJKpLIoHIBChh+SEZymSZCqL4gEIROghOeFZiiSZyqJ4AAIRekhOeJYiSaayKB6AQIQekhOepUiSqSyKByAQoYfkhGcpkmQqi+IBCEToITnhWYokmcqieAACEXpITniWIkmmsigegECEHpITnqVIkqksigcgEKGH5IRnKZJkKoviAQhE6CE54VmKJJnKongAAhF6SE54liJJprIoHoBAhB6SE56lSJKpLIoHIBChh+SEZymSZCqL4gEIROghOeFZiiSZyqJ4AAIRekhOeJYiSaayKB6AQIQekhOepUiSqSyKByAQoYfkhGcpkmQqi+IBCEToITnhWYokmcqieAACEXpITniWIkmmsigegECEHpITnqVIkqksigcgEKGH5IRnKZJkKoviAQhE6CE54VmKJJnKongAAhF6SE54liJJprIoHoBAhB6SE56lSJKpLIoHIBChh+SEZymSZCqL4gEIROghOeFZiiSZyqJ4AAIRekhOeJYiSaayKB6AQIQekhOepUiSqSyKByAQoYfkhGcpkmQqi+IBCEToITnhWYokmcqieAACEXpITniWIkmmsigegECEHpITnqVIkqksigcgEKGH5IRnKZJkKoviAQhE6CE54VmKJJnKongAAhF6SE54liJJprIoHoBAhB6SE56lSJKpLIoHIBChh+SEZymSZCqL4gEIROghOeFZiiSZyqJ4AAIRekhOeJYiSaayKB6AQIQekhOepUiSqSyKByAQoYfkhGcpkmQqi+IBCEToITnhWYokmcqieAACEXpITniWIkmmsigegECEHpITnqVIkqksigcgEKGH5IRnKZJkKoviAQhE6CE54VmKJJnKongAAhF6SE54liJJprIoHoBAhB6SE56lSJKpLIoHIBChh+SEZymSZCqL4gEIROghOeFZiiSZyqJ4AAIRekhOeJYiSaayKB6AQIQekhOepUiSqSyKByAQoYfkhGcpkmQqi+IBCEToITnhWYokmcqieAACEXpITniWIkmmsigegECEHpITnqVIkqksigcgEKGH5IRnKZJkKoviAQhE6CE54VmKJJnKongAAhF6SE54liJJprIoHoBAhB6SE56lSJKpLIoHIBChh+SEZymSZCqL4gEIROghOeFZiiSZylLK/w9s1n7OmzeaqAAAAABJRU5ErkJggg==" alt="" />

# coding = utf-8
import time
import unittest
import HTMLTestRunner
import os
import sys
from selenium import webdriver class test():
def add(self, x,y):
return x+y class testClass(unittest.TestCase):
count=0
count_=0
def setUp(self):
self.count += 1
print "setup...",self.count
#self.driver=webdriver.Firefox()
#time.sleep(3)
#self.driver.get("https://www.baidu.com")
#time.sleep(3) def verifyEquals(self,exp,act,msg):
try:
self.assertEquals(exp,act,msg)
print 'assertion passed ',msg
except:
print 'catch exception here ',msg #assert in unittest will just show the msg content when it is failed, you can see its source code, so for pass situation, if also want to show msg content, need to write code yourself.
def testsearch2(self): self.verifyEquals('','','equals')
self.assertIn("","","assert in ---") '''
time.sleep(30)
input=self.driver.find_element_by_id('kw')
search=self.driver.find_element_by_id('su')
input.send_keys("byebye")
search.click()
self.assertIn(self, "123","1234","assert in ---")
''' def testsearch(self):
input=self.driver.find_element_by_id('kw')
search=self.driver.find_element_by_id('su')
input.send_keys("hello")
search.click()
print "assertion" self.assertTrue(search.is_displayed(),"baidu yixia should display") def tearDown(self):
self.count +=1
print 'test down...',self.count
#self.driver.quit()
#self.driver.close() if __name__ == '__main__':
#unittest.main()
#unittest.TestCase.assertTrue() a=test()
print a.add(2,4) '''
vp=testClass()
vp.verifyEquals("123",'234','check equals or not')
''' current_path=os.getcwd()
print 'current path: ',current_path
project_path=os.path.dirname(current_path)
print "project path:",project_path testsuite=unittest.TestSuite()
testsuite.addTest(testClass("testsearch2"))
#testsuite.addTest(testClass("testsearch"))
temp=str(time.time()) filedir=project_path+"//report//"+temp
os.makedirs(filedir)
filename="//pyresult.html"
filepath=filedir+filename
fp=file(filepath,'wb')
runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title='report',description='demo')
runner.run(testsuite)
上一篇:php emoji处理微信表情


下一篇:【专题】平衡树(Treap,fhq-treap)