zoukankan      html  css  js  c++  java
  • python

    本次优化:

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

    测试报告:

    测试日志:

  • 相关阅读:
    2004选拔赛 最小值
    [JSOI2008]最大数maxnumber
    HDOJ 2896 病毒侵袭
    POJ 2243 Knight Moves
    HDOJ Is It A Tree?
    MST 小希的迷宫
    PKU 3278 Catch That Cow
    POJ 2488 A Knight's Journey
    [SCOI2006]整数划分
    COJ 1259: 跳跳
  • 原文地址:https://www.cnblogs.com/gotesting/p/10088214.html
Copyright © 2011-2022 走看看