这篇并不是讲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框架的注意点的更多相关文章

  1. selenium-webdriver(python) (十六) --unittest 框架

    学习unittest 很好的一个切入点就是从selenium IDE 录制导出脚本.相信不少新手学习selenium 也是从IED 开始的. IDE学习参考: 菜鸟学自动化测试(一)----selen ...

  2. Selenium2+python自动化30-引入unittest框架

    from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.com ...

  3. unittest 框架

    unittest 框架 学习unittest 很好的一个切入点就是从selenium IDE 录制导出脚本.相信不少新手学习selenium 也是从IED 开始的. IDE学习参考: 菜鸟学自动化测试 ...

  4. unittest框架概要

    unittest是Python语言自带的单元测试框架,原名PyUnit. 认识unittest 在unittest框架中有4个重要概念:test fixture.test case.test suit ...

  5. 接口登录CSDN发布博客---封装方法,使用unittest框架

    一个简单的跑接口流程:登录后发表带图片的博客.这里涉及到的知识点: 1.登录时通过cookies去保持登录状态,把cookies添加到一个session中,这样可以保持长时间登录状态: 2.我们通过爬 ...

  6. 记录python接口自动化测试--unittest框架基本应用(第二目)

    在第一目里写了几个简单demo,并把调用get和post请求的方法封装到了一个类里,这次结合python自带的unittest框架,用之前封装的方法来写一个接口测试demo 1.unittest简单用 ...

  7. Unittest框架+ddt数据驱动+HTMLTestRunner+sendmail(自动发送测试报告)+git+Jenkins

    本次写的是针对有代码基础的,没基础建议先去学基础,以下所有描述内容都是我已经在公司项目实践成功的!仅供参考 整体思路: 1.接口自动化用的是Python中unittest框架 2.所有的测试数据用例存 ...

  8. unittest框架(惨不忍睹低配版)

    根据我上个随笔的unittest框架优化得来,虽然对于smtp模块还是有点迷糊,不过还是勉强搭建运行成功了,还是先上代码: #login_test.py import requests class L ...

  9. Unittest框架小结

    在日常的自动化测试过程中,Python里有一个自带的单元测试框架是unittest模块,简单易用,这里简单介绍下其主要的用法. Unittest测试框架主要包含四个部分 TestCase 也就是测试用 ...

  10. python学习笔记之——unittest框架

    unittest是python自带的单元测试框架,尽管其主要是为单元测试服务的,但我们也可以用它来做UI自动化测试和接口的自动化测试. unittest框架为我们编写用例提供了如下的能力 定义用例的能 ...

随机推荐

  1. Android开发:彻底更改工程名

    对于已经建立的工程,如果发现原来的工程名不合适,此时若想彻底更改工程名,需要三个步骤: 1.更改工程名 选中工程名,右键-->Refactor-->Rename. 2.更改src文件下包名 ...

  2. ps小技巧

    一.加色与减色 电脑显示器和电视是加色法最常见的形式,而在油漆.颜料和彩色滤光片会用减色. 二.怎么把背景变成透明:其实就是抠图. 1.魔术棒+delete,缺点:应用于边界明显的图片,否则容差不好控 ...

  3. Spring框架学习 - 配置

    [资料] ★★☆ Spring 中提供一些Aware相关接口,像是BeanFactoryAware. ApplicationContextAware.ResourceLoaderAware.Servl ...

  4. 日期工具类 - DateUtil.java

    日期工具类,提供对日期的格式化和转换方法.获取区间日期.指定日期.每月最后一天等. 源码如下:(点击下载 -DateUtil.java.commons-lang-2.6.jar ) import ja ...

  5. MySQL —— 程序连接时的驱动名称和URL

    CONNECTION_DRIVER :  com.mysql.jdbc.Driver  CONNECTION_URL :    jdbc:mysql://localhost/DB_NAME 

  6. GitPython git python 的开发库

    工程地址: https://pypi.python.org/pypi/GitPython/需要安装先安装: gitdb https://pypi.python.org/pypi/gitdb GitPy ...

  7. BZOJ 1016 星球大战starwar(逆向-并查集)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1015 题意:给出一个图.每次删掉一个点,求删掉之后连通块个数. 思路:正着做不好做,我们 ...

  8. remove duplicates in Postgres(sql去重)

    A frequent question in IRC is how to delete rows that are duplicates over a set of columns, keeping ...

  9. [置顶] Android Provision (Setup Wizard)

    Android中很多框架性的设计都已经存在了,但在市场上的发布版本里却因为没有很好的理解Android的设计意图而进行自己的定制,或者自己又做一 个冗余的实现.Android中的Provision其实 ...

  10. HDU 1240 (简单三维广搜) Asteroids!

    给出一个三维的迷宫以及起点和终点,求能否到大终点,若果能输出最短步数 三维的问题无非就是变成了6个搜索方向 最后强调一下xyz的顺序,从输入数据来看,读入的顺序是map[z][x][y] 总之,这是很 ...