参数化单元测试

 步骤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()

 

posted @ 2020-03-27 17:52  鲲尘轻杳  阅读(359)  评论(0编辑  收藏  举报