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