单元测试

  unittest单元测试是基于java的JUnit思想框架开发出来的测试框架

使用示例1

import  unittest
class Mytest1(unittest.TestCase):
def test_a(self):#用例必须已test开头
self.assertEqual(1,1,msg='错误提示信息,如果校验失败,出现这个')
print('a')
def test_c(self):
self.assertEqual(1,2,msg='失败')#如果校验结果不正确,不会执行后面的代码
print('c')#这条代码不会执行
def test_z(self):#函数执行优先级:按照函数的首字母顺序依次执行A-Z-a-z
self.assertEqual(4,4)
print('z')
def test_G(self):
self.assertEqual(3,3)
print('G')
if __name__ == "__main__":
suite = unittest.TestSuite()
#suite.addTest(Mytest1('test_a')) #添加一个测试类中的一个方法
testlist = [Mytest1('test_c'),Mytest1('test_d')]
suite.addTests(testlist) #加载多个测试类的方法
unittest.TextTestRunner().run(suite)

使用示例2

import  unittest
class Mytest1(unittest.TestCase):
def test_a(self):#用例必须已test开头
self.assertEqual(1,1,msg='错误提示信息,如果校验失败,出现这个')
print('a')
def test_c(self):
self.assertEqual(1,2,msg='失败')#如果校验结果不正确,不会执行后面的代码
print('c')#这条代码不会执行
def test_z(self):#函数执行优先级:按照函数的首字母顺序依次执行A-Z-a-z
self.assertEqual(4,4)
print('z')
def test_G(self):
self.assertEqual(3,3)
print('G')
if __name__ == "__main__":
#suite = unittest.TestLoader().loadTestsFromTestCase(Mytest1) #指定类的加载
#suite = unittest.TestLoader().loadTestsFromName('a') #导入模块名
#suite = unittest.TestLoader().loadTestsFromName('a.Mytest1.test_a') #也可以这样导入 test_list = ['a.Mytest1.test_a','a.Mytest1.test_z']
suite = unittest.TestLoader().loadTestsFromNames(test_list) #导入多个模块
unittest.TextTestRunner().run(suite)

跳过skip的使用

import  unittest
a = 1
b = 2
class Mytest1(unittest.TestCase):
@unittest.skip('该函数已经弃用,跳过该方法') #表示跳过test_a函数,不会被执行
def test_a(self):#用例必须已test开头
self.assertEqual(1,1,msg='错误提示信息,如果校验失败,出现这个')
print('a')
@unittest.skipIf(b>a,'判断后执行') #如果b大于a,跳过执行,反之执行, skipUnless是skip相反的方法
def test_c(self):
self.assertEqual(1,2,msg='失败')#如果校验结果不正确,不会执行后面的代码
print('c')#这条代码不会执行
@unittest.expectedFailure #不用执行,直接为false
def test_z(self):#函数执行优先级:按照函数的首字母顺序依次执行A-Z-a-z
self.assertEqual(4,4)
print('z')
def test_G(self):
self.assertEqual(3,3)
print('G')
if __name__ == "__main__":
unittest.main() #运行所有测试用例 #unittest命令行方式
#python -m unittest a b 执行多个单元测试模块
#python -m unitest a.test_a b.test_b 执行模块类或者方法

HTMLTestRunner以及美化报告

import  unittest
import HTMLTestRunner
class Mytest1(unittest.TestCase):
def test_a(self):#用例必须已test开头
self.assertEqual(1,1,msg='错误提示信息,如果校验失败,出现这个')
print('a')
def test_c(self):
self.assertEqual(1,2,msg='失败')#如果校验结果不正确,不会执行后面的代码
print('c')#这条代码不会执行
def test_z(self):#函数执行优先级:按照函数的首字母顺序依次执行A-Z-a-z
self.assertEqual(4,4)
print('z')
def test_G(self):
self.assertEqual(3,3)
print('G')
#unittest.main()#运行所有函数
#unittest.defaultTestLoader.discover()#可以指定一个文件夹,在指定目录下找到测试用例
f = open('a.html','wb')#创建文件
runner = HTMLTestRunner.HTMLTestRunner(f,title='rainbol_test',description='这是一个接口测试用例')#实例化用例报告,并传入文件,title标题,description描述
suite = unittest.makeSuite(Mytest1)#把要生成报告的类变成一个测试集合,
runner.run(suite)#运行测试用例 import BeautifulReport
#美化报告
class Mytest2(unittest.TestCase):
def test_a(self):
'''test_a用例'''#添加用例描述,可以在测试报告中显示
self.assertEqual(1,1,msg='错误提示信息,如果校验失败,出现这个')
def test_c(self):
'''test_c用例'''
self.assertEqual(1,2,msg='失败')
print('c')
def test_z(self):
'''test_z用例'''
self.assertEqual(4,4)
print('z') new_suite= unittest.makeSuite(Mytest2)
report = BeautifulReport.BeautifulReport(new_suite)
report.report(filename='new_report.html',description='这个是新接口测试报告') class Mytest3(unittest.TestCase):
def setUp(self):#每条用例前执行,比如检测接口连接是否正常
print('setUp')
def tearDown(self):#每条用例后执行,比如清理缓存,cookie,redis的信息
print('tearDown')
@classmethod  #注意加入装饰器
def setUpClass(cls):#这个类里面的用例先执行,比如连接数据库
print('setUpClass')
@classmethod  #注意加入装饰器
def tearDownClass(cls):#这个类里面的用例最后执行,比如关闭数据库
print('tearDownClass')

  def test_c(self):
'''test_c用例'''
self.assertEqual(1, 2, msg='失败')
print('c')
def test_z(self):
'''test_z用例'''
self.assertEqual(4,4)
print('z')
unittest.main()
#执行顺序 setUpClass→setUp→test_c→tearDown→setUp→test_z→tearDown→tearDownClass

 

注意点

import unittest

#python不支持多函数传参的方式用在unittest上
class Mytest2(unittest.TestCase):
def test_a(self):
self.a = 2
self.assertEqual(1, 1, msg='错误提示信息,如果校验失败,出现这个')
print('') def test_c(self):
print(self.a)
self.assertEqual(1, 2, msg='失败')
print('')
#这样写运行就会报找不到self.a
  @classmethod  
  def setUpClass(cls):
  cls.res = '1'
  print('setUpClass')
  def test_d(self):
    print(self.res) #但是这些除外,可以找到

数据驱动ddt  pip install ddt

#数据驱动ddt
import ddt
import unittest
@ddt.ddt
class Mytest1(unittest.TestCase):
@ddt.data(*[x for x in range(2)])
def test_a(self,value):
self.assertEqual(10,value,'xx')
#如上执行我们可以看到只要几行代码就可以把重复的测试用例,只是参数不同,把参数传递给一个方法中执行,运行的结果实现了多个用例的单元测试 @ddt.data([1,2,3],[2,4,6])
@ddt.unpack #一条以上数据要用unpack
def test_b(self,value1,value2,value3):
self.assertEqual(value1+value2,value3)
if __name__ == "__main__":
unittest.main()

单元测试覆盖率

  度量的方式

    1.语句覆盖:被度量的代码中每个都执行到

    2.判定覆盖:被称为分支覆盖,即每个分支都会被测到

    3.条件覆盖:如果在判断覆盖中又存在多个表达式的情况,也要被测试到,如 if a = 1 and b = 2

    其他等等...

  coverage的使用(语句覆盖)

    下载

      pip install coverage

    帮助

      coverage help

    运行

      coverage run

    demo实例

#demo.py

import unittest

class Mytest1(unittest.TestCase):
def test_a(self): # 用例必须已test开头
self.assertEqual(1, 1, msg='错误提示信息,如果校验失败,出现这个')
print('a') def test_c(self):
self.assertEqual(1, 1, msg='失败') # 如果校验结果不正确,不会执行后面的代码
print('c') # 这条代码不会执行 def test_z(self): # 函数执行优先级:按照函数的首字母顺序依次执行A-Z-a-z
self.assertEqual(4, 4)
print('z') def test_G(self):
self.assertEqual(3, 3)
print('G') def other1(self):
print('其他的方法') def other2(self):
print('其他的方法') def other3(self):
print('其他的方法') def other4(self):
print('其他的方法') class Mytest2(unittest.TestCase):
def test_a(self): # 用例必须已test开头
self.assertEqual(1, 1, msg='错误提示信息,如果校验失败,出现这个')
print('a') def test_c(self):
self.assertEqual(1, 1, msg='失败') # 如果校验结果不正确,不会执行后面的代码
print('c') # 这条代码不会执行 def test_z(self): # 函数执行优先级:按照函数的首字母顺序依次执行A-Z-a-z
self.assertEqual(4, 4)
print('z') def test_G(self):
self.assertEqual(3, 3)
print('G') if __name__ == '__main__':
unittest.main()

    coverage run demo.py #运行单测代码

    coverage report #生成命令行结果

    coverage html -d xxx.html        #生成html文件   -d 指定html名称

可以看到没有执行的代码被高亮出来

    coverage xml #生成xml文件

# 封装api的方式
import unittest
import coverage cover = coverage.coverage(source=['test_demo'])
cover.start()
suite = unittest.defaultTestLoader.discover(start_dir='.', pattern='test_*.py')
unittest.TextTestRunner().run(suite) cover.stop()
cover.report()
cover.html_report(directory='report')

版权声明:本文原创发表于 博客园,作者为 RainBol本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

unittest单元测试笔记的更多相关文章

  1. Python+Selenium学习笔记16 - unittest单元测试框架

    unittest单元测试框架包括 Test Case,  Test Suite, Test Runner, Test Fixture Test Cases 组成Test Suite, Test Run ...

  2. python学习笔记(十五)-unittest单元测试的一个框架

    unittest 单元测试的一个框架什么框架 一堆工具的集合. TestCase TestSuite 测试套件,多个用例在一起 TestLoader是用来加载TestCase到TestSuite中的 ...

  3. Node.js的UnitTest单元测试

    body{ font: 16px/1.5em 微软雅黑,arial,verdana,helvetica,sans-serif; } 在专业化的软件开发过程中,无论什么平台语言,现在都需要UnitTes ...

  4. 我的TDD实践---UnitTest单元测试

    我的TDD实践---UnitTest单元测试 “我的TDD实践”系列之UnitTest单元测试 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则 ...

  5. unittest单元测试框架总结

    unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...

  6. unittest单元测试框架详解

    unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...

  7. Selenium+Python ---- 免登录、等待、unittest单元测试框架、PO模型

    1.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...

  8. unittest单元测试框架

    unittest单元测试框架 概述: 单元测试框架主要用来完成以下三件事: 提供用例组织与执行:当测试用例只有几条时,可以不必考虑用例的组织,但是当用例达到成百上千条时,大量的用例堆砌在一起,就产生了 ...

  9. python unittest单元测试

    unittest单元测试框架:包含测试用例编写.测试收集\测试用例加载.执行测试用例.生成测试用例报告,同时,更提供了添加断言,异常处理等. 第一:创建测试类,创建测试用例 第二:收集测试用例,加载测 ...

随机推荐

  1. Python赋值、浅拷贝、深拷贝

    一.赋值(assignment) >>> a = [1, 2, 3] >>> b = a >>> print(id(a), id(b), sep= ...

  2. sshd_config参数说明

    SSHD_CONFIG(5) OpenBSD Programmer's Manual SSHD_CONFIG(5)名称 sshd_config - OpenSSH SSH 服务器守护进程配置文件大纲 ...

  3. [CF1209F]Koala and Notebook_堆优化dij

    Koala and Notebook 题目链接:https://codeforces.com/contest/1209/problem/F 数据范围:略. 题解: 开始的时候看错题了....莫名其妙多 ...

  4. 使用redis调用lua脚本的方式对接口进行限流

    java端实现: //初始化一个redis可执行的lua DefaultRedisScript<List> defaultRedisScript = new DefaultRedisScr ...

  5. 《Mysql - 为什么只查一行的数据,也这么慢?》

    概念 - 在某些情况下,“查一行”,也会执行得特别慢. - 下面分析在什么情况下,会出现这个现象. - 基础工作(构建数据库环境) - 建立 t 表,并写入 10W 的数据. CREATE TABLE ...

  6. IntelliJ IDEA - 查找代码提交人

    转载. https://blog.csdn.net/abcyyjjkk/article/details/88995503 如果Annocation不可用

  7. zblog安装环境介绍?zblog安装需要什么环境

    最近在群里看到很的多人有在问:“安装zblog需要什么环境?”,其实这个问题在zblog官网的程序下载页面有说明,但是不太详细,那么本文的目的就是来给大家介绍下zblog安装环境详细说明. zblog ...

  8. Appscan 的安装与使用

    一.安装 1.右键安装文件,以管理员身份运行,如下图所示: 2.点击[确定] 3.点击[安装] 4.选择:我接受许可协议中单位全部条款,点击[下一步] 5.点击[安装]到该目录 6.如果需求扫描Web ...

  9. PAT甲级题分类汇编——杂项

    本文为PAT甲级分类汇编系列文章. 集合.散列.数学.算法,这几类的题目都比较少,放到一起讲. 题号 标题 分数 大意 类型 1063 Set Similarity 25 集合相似度 集合 1067 ...

  10. 《Java Web开发实战》——Java工程师必备干货教材

    一年一度毕业季,又到了简历.offer漫天飞,失望与希望并存的时节.在IT行业,高校毕业生求职时,面临的第一道门槛就是技能与经验的考验,但学校往往更注重学生的理论知识,忽略了对学生实践能力的培养,因而 ...