zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Javascript代码收集
    JS表自动取值赋值
    数据分析04 /基于pandas的DateFrame进行股票分析、双均线策略制定
    数据分析03 /基于pandas的数据清洗、级联、合并
    数据分析02 /pandas基础
    数据分析01 /numpy模块
    爬虫07 /scrapy图片爬取、中间件、selenium在scrapy中的应用、CrawlSpider、分布式、增量式
    爬虫06 /scrapy框架
    爬虫05 /js加密/js逆向、常用抓包工具、移动端数据爬取
    爬虫04 /asyncio、selenium规避检测、动作链、无头浏览器
  • 原文地址:https://www.cnblogs.com/R-bear/p/7057024.html
Copyright © 2011-2022 走看看