可以理解为是已经帮我们封装好的东东,可以完成执行用例\预期与实际结果的对比等.

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单元测试框架的更多相关文章

  1. python unittest单元测试框架-2discover

    基于TestLoader提供的discover方法实现用例执行 当用例达达到数十条后,在runtest.py文件中通过addTest()添加/删除测试用例就非常麻烦.此时可以使用discover方法找 ...

  2. python unittest单元测试框架-1

    Test Case.Test Suite.Test Runner.Test Fixture Test Case:单个测试用例 Test Suite:测试组合.可以把多个测试用例集合在一起执行. Tes ...

  3. python unittest单元测试框架-3用例执行顺序、多级目录、装饰器、fixtures

    1.用例执行顺序 unittest默认会按照ascii码的顺序,依次执行.类名--方法名排序,使用discover也是默认排序.如果不想使用默认排序,就使用testsuite测试集的方式. impor ...

  4. Python+selenium之简单介绍unittest单元测试框架

    Python+selenium之简单介绍unittest单元测试框架 一.unittest简单介绍 unittest支持测试自动化,共享测试用例中的初始化和关闭退出代码,在unittest中最小单元是 ...

  5. Python+Selenium框架设计篇之-简单介绍unittest单元测试框架

    前面文章已经简单介绍了一些关于自动化测试框架的介绍,知道了什么是自动化测试框架,主要有哪些特点,基本组成部分等.在继续介绍框架设计之前,我们先来学习一个工具,叫unittest.       unit ...

  6. Python+Selenium ----unittest单元测试框架

    unittest是一个单元测试框架,是Python编程的单元测试框架.有时候,也做叫做“PyUnit”,是Junit的Python语言版本.这里了解下,Junit是Java语言的单元测试框架,Java ...

  7. Python 单元测试框架系列:聊聊 Python 的单元测试框架(一):unittest

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

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

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

  9. Selenium基于Python web自动化基础二 -- 免登录、等待及unittest单元测试框架

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

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

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

随机推荐

  1. binary-tree-zigzag-level-order-traversal——二叉树分层输出

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  2. Java Swing界面编程(25)---事件处理:鼠标事件及监听处理

    假设想对一个鼠标的操作进行监听,假设鼠标按下.松开等.则能够使用MouseListener接口. package com.beyole.util; import java.awt.event.Mous ...

  3. Linux视频培训教程

    很详尽的Linux培训教程,既包含日常工作常常要用到的实践及技巧,又包含Linux认证及系统管理及架构,讲的很不错.最关键的.这么具体,完整的教程还是免费的.花了点时间拿它整理了下. 第一部分: Li ...

  4. spring中xml配置和autowired混用

    1.类的混用: 配置文件中的配置: <bean id="a" class="com.ab.cc.A" /> 类中的配置 @Autowired A a ...

  5. 设置jvm运行内存

    :1.右击项目—Bulid Path—Configure Build Path—Libraries,找到JRE System Libraary[Sun JDK 1.6.0_13],选中JRE Syst ...

  6. spring整合hibernate,在获取sessionFactory的时候报错,求解决办法!!

    applicationContext.xml文件 <!-- 开启扫包 --> <context:component-scan base-package="cn.edu&qu ...

  7. 【Python】selenium调用IE11浏览器,报错“找不到元素”NoSuchWindowException: Message:Unable to find element on closed window

    当编写自动化脚本,定位浏览器元素时,报如下错误: 代码: >>> # coding=utf-8 >>> from selenium import webdriver ...

  8. Python学习总结之五 -- 入门函数式编程

    函数式编程 最近对Python的学习有些怠慢,最近的学习态度和学习效率确实很不好,目前这种病况正在好转. 今天,我把之前学过的Python中函数式编程简单总结一下,分享给大家,也欢迎并感谢大家提出意见 ...

  9. Unity3D研究院之拓展自定义编辑器窗口

    Unity支持自行创建窗口,也支持自定义窗口布局.在Project视图中创建一个Editor文件夹,在文件夹中在创建一条脚本. 自定义窗口需要让脚本继承EditorWindow在设置MenuItem, ...

  10. mongodb 配置单实例与双实例

    环境: centos6.5 192.168.16.70 配置单实例mongodb:[root@www soft]# tar xf mongodb-linux-x86_64-rhel62-3.2.7.t ...