python-unittest单元测试框架
可以理解为是已经帮我们封装好的东东,可以完成执行用例\预期与实际结果的对比等.
import unittest 封装好的单元测试框架,可以直接使用
编写的测试类的继承unittest.TestCase
setUp 用于设置初始化的部分,在测试用例执行前,这个方法中的函数将先被调用,当然你可以不写
test_xxx 测试case,一定是以test开头
tearDown 在每个测试方法执行后调用,这个地方做所有测试用例执行完成的清理工作,当然你也可以不写
TestSuite 测试套件:就是组合测试case的,常用的方法是addTest
TextTestRunner 测试执行,就是来执行我们的脚本,常用方法是run
常用断言:
以上这些方法都带接受一个msg参数,如果指定则用于报告关于失败的错误信息.
eg:
assertEqual(first,second,msg=None),如果first和second不等,测试失败,打印msg指定信息
被测试模块
- #! /usr/bin/env python
- #coding=utf-8
- class Add():
- def add(self,a,b):
- print(a+b)
- return a+b
单元测试模块:
- import unittest
- from add import Add #从add.py引入Add类
- #编写的测试类中继承unittest.TestCase
- class TestAdd(unittest.TestCase):
- #setUp用于初始化的部分,在测试用例执行前,这个方法中的函数将先调用,可不写
- def setUp(self):
- print("我是setUp")
- #测试case,一定是以test开头
- def test_add_1(self):
- a = Add() #生成对象
- result = a.add(1,2)#调用函数
- #断言,注意self
- self.assertEqual(result,3)
- print("实际结果符合预期结果")
- #@unittest.skip("跳过该条用例")
- def test_add_2(self):
- try:
- a = Add()
- result = a.add(2,2)
- self.assertEqual(result,5,msg="实际结果不符合预期结果")
- except Exception as e:
- print("错误:",e)
- #tearDown在每个测试方法执行后调用,做所有测试用例完成的清理工作,可不写
- def tearDown(self):
- print("我是teardown")
- '''
- #TestSuite测试套件:就是组合测试case的,常用的方法是addTest
- #addTest(class名(方法名))
- suite = unittest.TestSuite()
- suite.addTest(TestAdd("test_add_1"))
- suite.addTest(TestAdd("test_add_2"))
- #TestTestRunner测试执行,就是来执行我们的脚本,常用的方法是run
- #自动找test开头的进行运行
- runner = unittest.TextTestRunner()
- runner.run(suite)
- '''
- if __name__ == '__main__':
- unittest.main()
结果:
我是setUp
3
实际结果符合预期结果
我是teardown
我是setUp
4
错误: 4 != 5 : 实际结果不符合预期结果
我是teardown
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK
@unittest.skip(reason)
无条件的跳过被修饰的测试,reason描述为啥跳过该测试
@unittest.skipIf(condition,reason)
如果条件为真,则跳过被修饰的测试
@unittest.skipUnless(condition,reason)
除非条件为真,否则跳过被修饰的测试
被跳过的测试将不执行setUp()和tearDown()
练习:
在unittest_2.py中增加一个test方法,来测试是否get请求成功(利用断言来判断)引入之前封装好的http请求class
被测试模块:之前封装的请求类:get_post_class.py
- #! /usr/bin/env python
- #coding=utf-8
- import requests
- import json
- class Jiekou:
- #get请求,参数是key-value格式
- def get_kv(self,url,params,headers):
- try:
- r = requests.get(url,params = params,headers = headers)
- #转换为python类型的字典格式,json包的响应结果,调用json(),转换成python类型
- json_r = r.json()
- print("get请求响应结果=",json_r)
- return json_r #将处理过的结果返回
- except Exception as e:
- print('%s' % e)
- return {}
- #psot请求,参数是key-value格式
- def post_kv(self,url,data,headers):
- try:
- r = requests.post(url,data = data,headers = headers)
- #转换为python类型的字典格式
- json_r = r.json()
- print("POST请求相应结果(python类型,供后续使用)=",json_r)
- return json_r #将处理过的结果返回
- except Exception as e:
- print('%s' % e)
- return {}
- #post请求,参数是json格式
- def post_json(self,url,data,headers):
- try:
- #python类型转化为json类型
- data = json.dumps(data)
- r = requests.post(url,data = data,headers = headers)
- json_r = r.json()
- print("POST请求相应结果(python类型,供后续使用)=",json_r)
- return json_r
- except Exception as e:
- print('请求不能完成:',str(e))
- return {}
单元测试模块:
- #! /usr/bin/env python
- #coding=utf-8
- import unittest
- from get_post_class import Jiekou
- class TestHttp(unittest.TestCase):
- def setUp(self):
- print("我是setUp")
- def tearDown(self):
- print("我是teardown")
- def test_get_kv_1(self):
- try:
- url = 'http://v.juhe.cn/laohuangli/d'
- params = {"key":"e711bc6362b3179f5a28de7fd3ee4ace","date":"2016-5-14"}
- headers = {}
- http = Jiekou()
- response = http.get_kv(url, params,headers)
- #提取响应中的error_code字段进行对比
- self.assertEqual(response['error_code'], 0, msg="fail")
- except Exception as e:
- print("错误:",str(e))
- '''
- #TestSuite测试套件:就是组合测试case的,常用的方法是addTest
- suite = unittest.TestSuite()
- suite.addTest(TestHttp("test_get_kv_1"))
- #TextTestRunner测试执行,就是来执行我们的脚本,常用方法是run
- #自动找test开头的进行运行
- runner = unittest.TextTestRunner()
- runner.run(suite)
- '''
- if __name__ == '__main__':
- unittest.main()
结果:
我是setUp
get请求响应结果= {'reason': 'successed', 'error_code': 0, 'result': {'yinli': '丙申(猴)年四月初八', 'yi': '纳采 嫁娶 裁衣 理发 出行 修造 动土 进人口 开市 交易 立券 挂匾 移徙 上梁 栽种 纳畜', 'yangli': '2016-05-14', 'baiji': '丙不修灶必见灾殃 申不安床鬼祟入房', 'wuxing': '山下火 平执位', 'jishen': '鸣犬 天恩 相日 不将 续世 六合 五富 除神 天德合', 'xiongshen': '河魁 死神 月刑 游祸 天刑 五离 五虚 血忌 复日', 'chongsha': '冲虎(庚寅)煞南', 'id': '2251', 'ji': '伐木 安葬 安床 祭祀 祈福'}}
我是teardown
.
----------------------------------------------------------------------
Ran 1 test in 0.295s
OK
python-unittest单元测试框架的更多相关文章
- python unittest单元测试框架-2discover
基于TestLoader提供的discover方法实现用例执行 当用例达达到数十条后,在runtest.py文件中通过addTest()添加/删除测试用例就非常麻烦.此时可以使用discover方法找 ...
- python unittest单元测试框架-1
Test Case.Test Suite.Test Runner.Test Fixture Test Case:单个测试用例 Test Suite:测试组合.可以把多个测试用例集合在一起执行. Tes ...
- python unittest单元测试框架-3用例执行顺序、多级目录、装饰器、fixtures
1.用例执行顺序 unittest默认会按照ascii码的顺序,依次执行.类名--方法名排序,使用discover也是默认排序.如果不想使用默认排序,就使用testsuite测试集的方式. impor ...
- Python+selenium之简单介绍unittest单元测试框架
Python+selenium之简单介绍unittest单元测试框架 一.unittest简单介绍 unittest支持测试自动化,共享测试用例中的初始化和关闭退出代码,在unittest中最小单元是 ...
- Python+Selenium框架设计篇之-简单介绍unittest单元测试框架
前面文章已经简单介绍了一些关于自动化测试框架的介绍,知道了什么是自动化测试框架,主要有哪些特点,基本组成部分等.在继续介绍框架设计之前,我们先来学习一个工具,叫unittest. unit ...
- Python+Selenium ----unittest单元测试框架
unittest是一个单元测试框架,是Python编程的单元测试框架.有时候,也做叫做“PyUnit”,是Junit的Python语言版本.这里了解下,Junit是Java语言的单元测试框架,Java ...
- Python 单元测试框架系列:聊聊 Python 的单元测试框架(一):unittest
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- Selenium+Python ---- 免登录、等待、unittest单元测试框架、PO模型
1.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...
- Selenium基于Python web自动化基础二 -- 免登录、等待及unittest单元测试框架
一.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...
- Python+Selenium学习笔记16 - unittest单元测试框架
unittest单元测试框架包括 Test Case, Test Suite, Test Runner, Test Fixture Test Cases 组成Test Suite, Test Run ...
随机推荐
- JS门面模式
门面模式 前言 门面模式的本质是实现一个简单的同一接口来处理对各个子系统接口的处理和调用.和桥接模式不同的是:桥接模式中的各个类是全然独立的,桥接模式仅仅在必要的时候将这些类关联起来. 门面模式则有点 ...
- 转Java 开发环境配置
window系统安装java 下载JDK 首先我们需要下载java开发工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downloa ...
- ordinal parameter mismatch
© 版权声明:本文为博主原创文章,转载请注明出处 错误描述:Caused by: org.hibernate.HibernateException: ordinal parameter mismatc ...
- MySQL的安装过程
近期对MySQL做了一些研究. 曾经主要接触的是SQL SERVER.所以,今天对该安装过程做了一些总结以及使用过程中的一些心得.并分享给大家. 记得前面.分享过一篇关于数据库的几种连接方式.而 ...
- YARN/MRv2 中基本术语介绍
YARN/MRv2是下一代MapReduce框架(见Hadoop-0.23.0),该框架完全不同于当前的MapReduce框架,它在扩展性,容错性和通用性等方面更出色,据统计,Yarn有超过15000 ...
- C# 托管
委托 委托让我们可以把函数引用保存在变量中.这就像在 C++ 中使用 typedef 保存函数指针一样. 委托使用关键字 delegate 声明.看看这个例子,你就能理解什么是委托: 例子: 代码: ...
- 如何利用JQuery获取iframe内联框架对象?
parent.$("#iframeID").get(0).contentWindow; 父.$("选择器").get(0).contentWindow; get ...
- redis数据迁移操作
redis客户端连接命令,分别连接旧环境中的主从redis Src目录下./redis-cli -h IP -p PORT 使用info replication 命令找出主redis使用客户端命令连接 ...
- GS发包到MS
GS发包到MS(GS,MS包交互过程) 例:人物上线 首先看看其实如何确定是哪张地图的 数据库首先只保存一个mapid 在share初始化的时候已经初始化了所有map,并保存了map的指针信息,其ke ...
- 【BZOJ3721】PA2014 Final Bazarek 贪心
[BZOJ3721]PA2014 Final Bazarek Description 有n件商品,选出其中的k个,要求它们的总价为奇数,求最大可能的总价. Input 第一行一个整数n(1<=n ...