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//7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IBChh+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)
unittest框架的注意点的更多相关文章
- selenium-webdriver(python) (十六) --unittest 框架
学习unittest 很好的一个切入点就是从selenium IDE 录制导出脚本.相信不少新手学习selenium 也是从IED 开始的. IDE学习参考: 菜鸟学自动化测试(一)----selen ...
- Selenium2+python自动化30-引入unittest框架
from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.com ...
- unittest 框架
unittest 框架 学习unittest 很好的一个切入点就是从selenium IDE 录制导出脚本.相信不少新手学习selenium 也是从IED 开始的. IDE学习参考: 菜鸟学自动化测试 ...
- unittest框架概要
unittest是Python语言自带的单元测试框架,原名PyUnit. 认识unittest 在unittest框架中有4个重要概念:test fixture.test case.test suit ...
- 接口登录CSDN发布博客---封装方法,使用unittest框架
一个简单的跑接口流程:登录后发表带图片的博客.这里涉及到的知识点: 1.登录时通过cookies去保持登录状态,把cookies添加到一个session中,这样可以保持长时间登录状态: 2.我们通过爬 ...
- 记录python接口自动化测试--unittest框架基本应用(第二目)
在第一目里写了几个简单demo,并把调用get和post请求的方法封装到了一个类里,这次结合python自带的unittest框架,用之前封装的方法来写一个接口测试demo 1.unittest简单用 ...
- Unittest框架+ddt数据驱动+HTMLTestRunner+sendmail(自动发送测试报告)+git+Jenkins
本次写的是针对有代码基础的,没基础建议先去学基础,以下所有描述内容都是我已经在公司项目实践成功的!仅供参考 整体思路: 1.接口自动化用的是Python中unittest框架 2.所有的测试数据用例存 ...
- unittest框架(惨不忍睹低配版)
根据我上个随笔的unittest框架优化得来,虽然对于smtp模块还是有点迷糊,不过还是勉强搭建运行成功了,还是先上代码: #login_test.py import requests class L ...
- Unittest框架小结
在日常的自动化测试过程中,Python里有一个自带的单元测试框架是unittest模块,简单易用,这里简单介绍下其主要的用法. Unittest测试框架主要包含四个部分 TestCase 也就是测试用 ...
- python学习笔记之——unittest框架
unittest是python自带的单元测试框架,尽管其主要是为单元测试服务的,但我们也可以用它来做UI自动化测试和接口的自动化测试. unittest框架为我们编写用例提供了如下的能力 定义用例的能 ...
随机推荐
- Struts2入门学习
1.Struts2的前身是Opensymphony的Webwork2,实际上Strut和Webwork2合并后形成Struts2. 2.一个HelloWord示例 1)创建Web应用,所需要的Ja ...
- struts2与struts1整合,Unable to load configuration. - interceptor-ref ... struts.xml
struts.xml中为了与struts1的MVC模式整合,需要类似如下的拦截器的引用 <interceptor-stack name="integration"> & ...
- django如何检查创建的模型(model)是否有语法错误或者逻辑错误
首先,用下面的命令验证模型的有效性: python manage.py validate validate 命令检查你的模型的语法和逻辑是否正确. 如果一切正常,你会看到 0 errors found ...
- DataGridView中的单元格提示错误信息
http://stackoverflow.com/questions/7713988/winforms-problems-validating-a-cell-in-a-datagridview
- 查看mysql存储引擎
一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎:mysql> show engines; 看你的mysql当前默认的存储引擎:mys ...
- HDU 4023 (博弈 贪心 模拟) Game
如果硬要说这算是博弈题目的话,那这个博弈是不公平博弈(partizan games),因为双方面对同一个局面做出来的决策是不一样的. 我们平时做的博弈都是公平博弈(impartial games),所 ...
- 戏(细)说Executor框架线程池任务执行全过程(下)
上一篇文章中通过引入的一个例子介绍了在Executor框架下,提交一个任务的过程,这个过程就像我们老大的老大要找个老大来执行一个任务那样简单.并通过剖析ExecutorService的一种经典实现Th ...
- Calculate drive total/free/available space
using System; using System.Collections.Generic; using System.IO; using System.Text; namespace Consol ...
- PDO防注入原理分析以及使用PDO的注意事项 (转)
我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下两个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特 ...
- 用 Xcode 开发 Cydia Substrate 插件(二)
上次介绍了一个如何用 Xcode 来构建 Substrate 插件,但是开发的具体过程还没有涉及,而这往往又正是初学者最难下手的地方,所以有了本文的后续. 不过在开始之前你要先做好思想准备,相比较开发 ...