zoukankan      html  css  js  c++  java
  • 参数化单元测试

     步骤1:编写测试方法

    例如:http_request.py

    import requests
    
    class HttpRequest:
        """requests请求需要转入的参数"""
    
        def http_request(self,method, url, data,auth = None,headers =None ):
            '''url:请求地址 http://xxxx:port
               param:传递的参数 非必填参数 字典的格式传递参数
               method:请求方式  支持get,post,put...
               get:获取信息,post:添加信息,put:修改更新信息
            '''
            if method.lower() in ('get','post','put','patch'):
                if method.lower() == 'get':
                    res = requests.get(url, data, auth = auth, headers= headers)
                elif method.lower() == 'post':
                    res = requests.post(url, data, headers = headers)
                elif method.lower() == 'put':
                    res = requests.put(url, data, headers = headers)
                else:
                    res = requests.patch(url, data, headers = headers)
    
                return res
            else:
                raise Exception('暂不支持的请求方式')

     步骤2:测试用例执行的方法

    初始化headers(get_data.py)--->该步骤还有其他很多种方法实现

    class GetData:
        headers = {'X-Lemonban-Media-Type': 'lemonban.v2', 'Content-Type': 'application/json; charset=UTF-8','Authorization':None}

    测试用例执行的方法:test_http.py

    class TestHttp(unittest.TestCase):
        def setUp(self):
            pass
    
        def __init__(self,methodName,url,data,method,expected,...):  # 通过初始化函数来传参数
                super(TestHttp,self).__init__(methodName)  # 保留父类的方法
                self.url = url
                self.data = data
                self.method = method
                self.expected = expected
    
        def test_apiName1(self): 
            # 调用步骤1中的方法,实现测试用例的执行方法
               ...
               res = HttpRequest().http_request(self.url, json.dumps(self.data), self.method,getattr(GetData,'headers'))
             # 处理测试结果
                try:  
                    self.assertEqual(self.expected,res.json()['code'])
                except AssertionError as e:
                    print("test_login_api error is {}".format(e))
                    raise e
                print(res.json())
        def test_apiName2(self): 
              # 同test_apiName1
        
    
        def tearDown(self):
                pass    

    步骤3:用例参数及执行用例,生成测试报告test_suite.py

    import unittest
    import time
    from test_http import TestHttp  # 类名
    import HTMLTestRunner
    
    url1 =url1_value
    url2= url2_value
    
    test_data1 = [{'url':url1 ,'data':{'xxx': 'xxxx'},'method':'xxx','expected':'xxx',...},{第2条用例参数}...]
    
    test_data2 = [{'url':url1 ,'data':{'xxx': 'xxxx'},'method':'xxx','expected':'xxx',...},{第2条用例参数}...]         
    
    
    suite = unittest.TestSuite()
    for item in test_data1 :  # 创建实例
        suite.addTest(TestHttp("test_apiName1",item['url'],item['data'],item['method'],item['expected']...))  # 实例的方式加载用例
    
    for item in test_data2 :  
        suite.addTest(TestHttp("test_apiName2",item['url'],item['data'],item['method'],item['expected']...)) 
    
    
    with open(str(time.strftime('%Y-%m-%d',time.localtime(time.time())))+'test_report_Parameterization.html','wb') as file:
        runner = HTMLTestRunner.HTMLTestRunner(stream=file,
                                               verbosity=2,
                                               title= time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) +'测试报告标题',
                                               description='测试报告描述' )
    
        runner.run(suite)
    
    if  __name__== '__main__':
        unittest.TestCase()
  • 相关阅读:
    IT战略规划项目方法论(转)
    008_Node中的require和import
    007_Mac上安装Node和NPM
    005_讨论多线程和单线程
    006_饿了么大前端总监sofish帮你理清前端工程师及大前端团队的成长问题!
    005_解密饿了么大前端团队
    005_python对整数的拼接
    010_动态语言与鸭子类型及python2和3的区别
    010_vim和python整合开发
    009_一行python重要工具
  • 原文地址:https://www.cnblogs.com/kite123/p/12582917.html
Copyright © 2011-2022 走看看