这篇并不是讲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. 禁用/启用本地连接的dos命令是什么啊?

    运行如下命令:netsh interface show interface 将显示类似下面的画面:Admin State State Type Interface Name ------------- ...

  2. Sqlstate解释

    本篇文章主要介绍了"Sqlstate详解",主要涉及到方面的内容,对于DB2感兴趣的同学可以参考一下: 根据 X/Open 和 SQL Access Group SQL CAE 规 ...

  3. 306. Additive Number

    题目: Additive number is a string whose digits can form additive sequence. A valid additive sequence s ...

  4. 《MySQL悲观锁总结和实践》乐观锁

    mysql乐观锁总结和实践 博客分类: MyBatis 数据库 mysql数据库乐观锁悲观锁 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任何场景 ...

  5. Spring框架学习 - 配置

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

  6. linux环境下,利用tc限制两台服务器间的网速,非常简单。

    最近再搞postgres的数据同步,需要模拟异地机房有带宽限制时的同步效果,所以想要限制一下两台机器之间的网速. ts命令功能很强,同时也好难理解和使用,经常浪费了好半天还是搞不定. 这里分享一个简单 ...

  7. 数据仓库的自动ETL研究

    但是,在实施数据集成的过程中,由于不同用户提供的数据可能来自不同的途径,其数据内容.数据格式和数据质量千差万别,有时甚至会遇到数据格式不能转换或数据转换格式后丢失信息等棘手问题,严重阻碍了数据在各部门 ...

  8. POJ 1743 Musical Theme(后缀数组)

    题意:有n个数值,算出相邻两个值的差值,此时有n-1个值的序列,把这序列当做字符串的话,求最长重复子串,且这两个子串不能重叠. 分析:后缀数组解决.先二分答案,把题目变成判定性问题:判断是否存在两个长 ...

  9. GMT与UTC

    时间概念 — 24时区.GMT.UTC的意涵 许多人都知道两地时间表简称为GMT或UTC,而世界时区表则通称为World Time ,那么GMT与UTC的实质原意又是为何?世界时区又是怎么区分的?面盘 ...

  10. c语言类型转换注意事项

    转载自: http://blog.csdn.net/zhuimengzh/article/details/6728492 1.隐式转换     C在以下四种情况下会进行隐式转换:        1.算 ...