1. 程式人生 > >python - 介面自動化測試實戰 - case1 - 再次優化版

python - 介面自動化測試實戰 - case1 - 再次優化版

 

本次優化:

  1.  各級分Package

  2.  封裝【ReadExcel】類

  3.  封裝【ReadConfig】類

  4.  封裝【GetLog】類

  5.  引入ddt資料驅動測試,優化測試用例程式碼

 

工程如下:

 

 

程式碼分享:

 

get_logger.py

# -*- coding:utf-8 -*-

'''
@project: jiaxy
@author: Jimmy
@file: get_logger.py
@ide: PyCharm Community Edition
@time: 2018-12-08 16:08
@blog: https://www.cnblogs.com/gotesting/

''' import logging import time class GetLog: def __init__(self): curTime = time.strftime('%Y-%m-%d') self.logname = 'TestReport/log/' + 'AutoTest' + '_' + curTime + '_' + '.log' def get_log(self,level,msg): # 建立日誌收集器 logger = logging.getLogger() logger.setLevel(
'DEBUG') # 建立handler fh = logging.FileHandler(self.logname,'a',encoding='gbk') fh.setLevel('INFO') ch = logging.StreamHandler() ch.setLevel('INFO') # 定義handler的輸出格式 formatter = logging.Formatter('%(asctime)s - %(filename)s - %(name)s - %(levelname)s - 日誌資訊: %(message)s
') ch.setFormatter(formatter) fh.setFormatter(formatter) # 給logger新增handler logger.addHandler(fh) logger.addHandler(ch) if level == 'DEBUG': logger.debug(msg) elif level == 'INFO': logger.info(msg) elif level == 'WARNING': logger.warning(msg) elif level == 'ERROR': logger.error(msg) elif level == 'CRITICAL': logger.critical(msg) logger.removeHandler(fh) logger.removeHandler(ch) fh.close() def log_debug(self,msg): self.get_log('DEBUG',msg) def log_info(self,msg): self.get_log('INFO',msg) def log_warning(self,msg): self.get_log('WARNING',msg) def log_error(self,msg): self.get_log('ERROR',msg) def log_critical(self,msg): self.get_log('CRITICAL',msg)

 

http_request.py

# -*- coding:utf-8 -*-

'''
@project: jiaxy
@author: Jimmy
@file: http_request.py
@ide: PyCharm Community Edition
@time: 2018-12-05 10:06
@blog: https://www.cnblogs.com/gotesting/

'''

import requests

class HttpRequest:

    def http_request(self,url,param,method,cookies=None):
        if method == 'get':
            res = requests.get(url,param,cookies = cookies)
        elif method == 'post':
            res = requests.post(url,param,cookies = cookies)
        else:
            print('請求方法錯誤!')
        return res

 

read_config.py

# -*- coding:utf-8 -*-

'''
@project: jiaxy
@author: Jimmy
@file: read_config.py
@ide: PyCharm Community Edition
@time: 2018-12-08 14:45
@blog: https://www.cnblogs.com/gotesting/

'''

import configparser

class ReadConfig:

    def read_config(self,file,section,option):
        cf = configparser.ConfigParser()
        cf.read(file)
        value = cf.get(section,option)
        return value

 

read_excel.py

# -*- coding:utf-8 -*-

'''
@project: jiaxy
@author: Jimmy
@file: read_excel.py
@ide: PyCharm Community Edition
@time: 2018-12-05 11:57
@blog: https://www.cnblogs.com/gotesting/

'''

from openpyxl import load_workbook

class ReadExcel:

    def read_excel(self,wbname,sheetname):
        wb = load_workbook(wbname)
        sheet = wb[sheetname]

        # 雙重for迴圈 獲取excel表中測試資料
        test_data = []
        for i in range(2,sheet.max_row+1):
            sub_data = {}
            for j in range(1,sheet.max_column+1):
                sub_data[sheet.cell(1,j).value] = sheet.cell(i,j).value
            test_data.append(sub_data)

        return test_data

 

test_api.py

# -*- coding:utf-8 -*-

'''
@project: jiaxy
@author: Jimmy
@file: TestApi.py
@ide: PyCharm Community Edition
@time: 2018-12-05 10:09
@blog: https://www.cnblogs.com/gotesting/

'''

import unittest
from ddt import ddt,data
from TestApi.Common.http_request import HttpRequest
from TestApi.Common.read_excel import ReadExcel
from TestApi.Common.get_logger import GetLog


cookies = None
login_data = ReadExcel().read_excel('TestData/test_login.xlsx','登入及充值測試資料')

@ddt
class TestHttpApi(unittest.TestCase):

    def setUp(self):
        self.log = GetLog()

    def tearDown(self):
        pass

    # # 改寫__init__方法,使用超繼承
    # def __init__(self,url,param,method,expected,methodName):
    #     self.url = url
    #     self.param = param
    #     self.method = method
    #     self.expected = expected
    #     super(TestHttpApi,self).__init__(methodName)

    # 換用data來處理test_data
    @data(*login_data)
    def test_api(self,item):
        global cookies
        self.log.log_info('執行第{0}條測試用例:{1}'.format(item['case_id'],item['title']))
        res = HttpRequest().http_request(item['url'],eval(item['param']),item['method'],cookies)
        self.log.log_info('請求結果:{0}'.format(res.json()))
        if res.cookies:
            cookies = res.cookies
        try:
            self.assertEquals(item['excepted'],res.json()['msg'])
            self.log.log_info('測試結果:PASSED')
        except AssertionError as e:
            self.log.log_error('斷言異常:{0}'.format(e))
            self.log.log_error('測試結果:FAILED')
            raise e

 

test_run.py

# -*- coding:utf-8 -*-

'''
@project: jiaxy
@author: Jimmy
@file: test_run.py
@ide: PyCharm Community Edition
@time: 2018-12-05 10:28
@blog: https://www.cnblogs.com/gotesting/

'''

import unittest
import HTMLTestRunner
import time
from TestApi.TestCses.test_api import TestHttpApi



# 載入測試集
def run_test():
    suite = unittest.TestSuite()
    loader = unittest.TestLoader()
    suite.addTest(loader.loadTestsFromTestCase(TestHttpApi))

    curTime = time.strftime('%Y-%m-%d_%H_%M_%S')
    report_name = 'TestReport/report/' + 'TestResult-' + curTime + '.html'

    # 執行測試,輸出測試報告
    with open(report_name,'wb+') as file:
        runner = HTMLTestRunner.HTMLTestRunner(stream=file,
                                               verbosity=2,
                                               title='介面測試報告',
                                               description='基於python+unittest進行的資料驅動介面自動化測試',
                                               tester='Jimmy')
        runner.run(suite)


if __name__ == '__main__':
    run_test()

 

 

 

測試報告:

 

測試日誌: