这篇并不是讲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. jenkins集成自动化部署插件(一) deploy-plugin

    在实际情况中项目构建成功,特别是web项目构建成功是需要将war放到对应的服务上面,进行运行(测试的阶段可能就是发布到测试服务器上面)这样只需要指定构建的触发策略就可以自动构建以及部署,省去不少人工的 ...

  2. 正确的理解this 和 super

    this和super是Java的两个关键字. 先明确一个问题,有人错误的认为它们是对象里的“属性”,这只能怪老师没有讲清楚计算机的本质了.因为计算机的处理器只能用指令去处理数据,像C语言之类的容易理解 ...

  3. 267. Palindrome Permutation II

    题目: Given a string s, return all the palindromic permutations (without duplicates) of it. Return an ...

  4. C# 窗体间传值方法大汇总

    第一种方法:创建一个类,里面声明用于存储接收的字段.传的时候存储于字段中,要用的时候,直接类名.字段名 进行调用.(这种方法传递是双向的) 第二种方法:1.在Form1里定义 public strin ...

  5. openfire插件开发1

    http://www.cnblogs.com/hoojo/archive/2013/03/29/openfire_plugin_chatlogs_plugin_.html http://www.cnb ...

  6. Data Base MongoVue 破解治标不治本

    MongoVue  破解治标不治本 ---------解决燃眉之急 注册表中查找B1159E65-821C3-21C5-CE21-34A484D54444中的子项4FF78130 ,删除其下的三个子项 ...

  7. dojo 十 ajax dojo/_base/xhr

    官方教程:Ajax with DojoAjax功能:1.从服务器加载静态数据2.从web服务中访问xml或json类型的数据3.将表单(form)数据发送到服务器4.刷新页面内容....Ajax在RI ...

  8. 无法创建链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Ace.OLEDB.12.0" 的实例。

    --开启导入功能    exec sp_configure 'show advanced options',1    reconfigure    exec sp_configure 'Ad Hoc  ...

  9. leetcode:Invert Binary Tree

    Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1即反转二叉树,代码如下: /** * Defin ...

  10. 纠结和郁闷的存在感-关于DirectX与HLSL的矩阵存储方式---转载好文章

    我常常这么大胆的认为,搞科学的人总是喜欢用各种让常人难以理解的复杂方式去处理某些其实可能很简单的事情,这种情况在他自身擅长的.有着诸多对手竞争的领域上极为常见.比如吧,搞DirectX的人用了左手坐标 ...