Esempio n. 1
0
def autoRun():
    reportname = pathutil(
    ).rootPath + "/Output/Report/Test Report_Build" + time.strftime(
        '%Y%m%d', time.localtime(time.time())) + ".html"
    log = Logger(level="debug").logger
    log.info('\n========================' +
             time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) +
             '========================')
    tset_suite = unittest.TestLoader().loadTestsFromTestCase(Case)
    with open(reportname, "wb") as report:
        runner = HTMLTestRunner(stream=report,
                                title=u"测试报告",
                                description=u"用例测试情况")
        runner.run(tset_suite)
class ToConsleLogger(object):
    # 定义常量
    module_path = path.pathutil().rootPath
    logpath = module_path + '\\Output\\Log\\RunLog' + time.strftime(
        '%Y%m%d', time.localtime(time.time())) + '.log'
    # 日志级别关系映射
    level_relations = {
        "debug": logging.DEBUG,
        "info": logging.INFO,
        "warning": logging.WARNING,
        "error": logging.ERROR,
        "critical": logging.CRITICAL
    }
    streamHandler = logging.StreamHandler()

    def __init__(self, filename=logpath, level="info", fmt="%(message)s"):
        format_str = logging.Formatter(fmt)
        self.logger = logging.getLogger(filename)
        # 设置日志输出文件
        self.streamHandler.setFormatter(format_str)
        self.logger.addHandler(self.streamHandler)
        # 设置日志级别
        self.logger.setLevel(self.level_relations.get(level))

    def debug(self, message):
        self.fontColor('\033[32m%s\033[0m')
        self.logger.debug(message)

    def info(self, message):
        self.fontColor('\033[34m%s\033[0m')
        self.logger.info(message)

    def warning(self, message):
        self.fontColor('\033[37m%s\033[0m')
        self.logger.warning(message)

    def error(self, message):
        self.fontColor('\033[31m%s\033[0m')
        self.logger.error(message)

    def critical(self, message):
        self.fontColor('\033[35m%s\033[0m')
        self.logger.critical(message)

    def fontColor(self, color):
        # 不同的日志输出不同的颜色
        formatter = logging.Formatter(color % '%(message)s')
        self.streamHandler.setFormatter(formatter)
        self.logger.addHandler(self.streamHandler)
Esempio n. 3
0
    def testcase(self, data):
        text = ''
        log().info(str(data[list(data.keys())[0]]) + "-开始")
        if data["操作类型"] == "等待":
            time.sleep(int(data["输入数据"]))
        else:
            text = self.action.pre_do(data)

        if data["操作类型"] == "断言":
            log().info("断言:"+ str(data[list(data.keys())[0]]))
            if text != data["输入数据"]:
                log().info("断言截图:" + str(data[list(data.keys())[0]]))
                self.action.driver.save_png(path.pathutil().rootPath + '/Output/Resources/'+data['用例编号']+'.jpg')
            self.assertEqual(text, data["输入数据"])
        log().info(str(data[list(data.keys())[0]]) + "-结束")
Esempio n. 4
0
    def do_action(self, data):
        try:

            Positioning_type = GAD().checkIfExists(
                self.datatypemenu[0], data["操作元素"])[0].split("By.")
            Positioning_value = GAD().checkIfExists(self.datatypemenu[0],
                                                    data["操作元素"])[1]
            input_data = GAD().checkIfExists(self.datatypemenu[1],
                                             data["输入数据"])
            if data["操作类型"] == "断言":
                text = self.driver.get_element(Positioning_type + '=>' +
                                               Positioning_value).text
                return text
            if data["操作类型"] == "打开":
                self.driver.open(input_data)
            if data["操作类型"] == "点击":
                self.driver.click(Positioning_type + '=>' + Positioning_value)
            if data["操作类型"] == "清除":
                self.driver.clear(Positioning_type + '=>' + Positioning_value)
            # if data["动作"] == "等待":
            #     self.driver.wait(int(data["输入值"]))
            if data["操作类型"] == "输入":
                self.driver.type(Positioning_type + '=>' + Positioning_value,
                                 input_data)
            if data["操作类型"] == "滚动条下拉":
                self.driver.js("var q=document.body.scrollTop=" + input_data +
                               ";")
            if data["操作类型"] == "等待元素":
                self.driver.element_wait(
                    Positioning_type + '=>' + Positioning_value, 10)
            if data["操作类型"] == "最大化":
                self.driver.max_window()
            if data["操作类型"] == "关闭浏览器":
                self.driver.close()
        except Exception as e:
            log().error("异常截图-" + data["操作类型"] + str(e))
            self.driver.save_png(path.pathutil().rootPath +
                                 '/Output/Resources/' + data['用例编号'] + '.jpg')

     @Modify Time   |    @Author   |@Version    
--------------------|--------------|--------    
2020/5/26 0026-20:35| GeminiJayson | V0.0.1        
"""

import os
import xlrd
import xlutils
from xlutils.copy import copy

import Src.BasicRef.pathUtil as path

# 定义常量
module_path = path.pathutil().rootPath
config_excel_path = '/Config/testCFG.xls'


def setOutCell(outSheet, col, row, value):
    """

    :param outSheet:
    :param col:
    :param row:
    :param value:
    :func : Change cell value without changing formatting.
    :return:
    """
    def _getOutCell(outSheet, colIndex, rowIndex):
        """ HACK: Extract the internal xlwt cell representation. """
class runTestCase(object):
    log = Logger(level="debug").logger
    toFileLog = Logger(level="debug")
    module_path = path.pathutil().rootPath
    imagepath = ''
    datatypemenu = ['ElementsInfo', 'InputData', 'OutputData']
    browser = webdriver.Chrome()
    urlReg = re.compile(
        r'^(?:http|ftp)s?://'  # http:// or https://
        r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|'  # domain...
        r'localhost|'  # localhost...
        r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'  # ...or ip
        r'(?::\d+)?'  # optional port
        r'(?:/?|[/?]\S+)$',
        re.IGNORECASE)

    def __init__(self):
        self.switch = {
            "打开":
            lambda casedealinfoDic, ifrerun: self.test_open(
                casedealinfoDic, ifrerun),
            "点击":
            lambda casedealinfoDic, ifrerun: self.test_click(
                casedealinfoDic, ifrerun),
            "输入":
            lambda casedealinfoDic, ifrerun: self.test_input(
                casedealinfoDic, ifrerun),
            "清除":
            lambda casedealinfoDic, ifrerun: self.test_clear(
                casedealinfoDic, ifrerun),
            "等待":
            lambda casedealinfoDic, ifrerun: self.test_wait(
                casedealinfoDic, ifrerun),
            "断言":
            lambda casedealinfoDic, ifrerun: self.test_assertion(
                casedealinfoDic, ifrerun),
            "引入":
            lambda casedealinfoDic, ifrerun: self.test_introduce(
                casedealinfoDic, ifrerun),
            "最大化":
            lambda casedealinfoDic, ifrerun: self.test_maximize(
                casedealinfoDic, ifrerun)
        }

    # 定义一个保存截图函数
    def save_img(self, img_name):
        self.imagepath = self.module_path + '/Output/Resources/' + img_name + '.png'
        self.browser.get_screenshot_as_file(self.imagepath)

    # 启动函数,每个用例测试前,都会执行该函数
    def setUp(self, url):
        self.starttime = parse(
            time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
        self.browser.set_window_size(1920, 1080)
        print("开始测试时间:", self.starttime)
        self.browser.get(url)
        #time.sleep(3)

    # 结束函数,每个用例测试结束后,都会执行该函数
    def tearDown(self):
        #time.sleep(3)
        self.browser.quit()
        self.endtime = parse(
            time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
        print("测试结束时间:", self.endtime)
        totaltime = (self.endtime - self.starttime).total_seconds()
        print("总时长:", totaltime, "秒")

    def switchRun(self, casedealinfoDic):
        ifrerun = False
        if casedealinfoDic[1][0] is not None:
            if self.urlReg.match(DPD.getAllData().checkIfExists(
                    self.datatypemenu[1], casedealinfoDic[1][0])):
                ifrerun = True
        try:
            self.switch[casedealinfoDic[1][2]](casedealinfoDic, ifrerun)
        except KeyError as e:
            self.log(e)

    def test_open(self, casedealinfoDic, ifrerun):
        if ifrerun == True:
            self.setUp(DPD.getAllData().checkIfExists(self.datatypemenu[1],
                                                      casedealinfoDic[1][0]))
            self.save_img(casedealinfoDic[0])
        self.tearDown()

    def test_click(self, casedealinfoDic, ifrerun):
        pass

    def test_input(self, casedealinfoDic, ifrerun):
        pass

    def test_clear(self, casedealinfoDic, ifrerun):
        pass

    def test_wait(self, casedealinfoDic, ifrerun):
        pass

    def test_assertion(self, casedealinfoDic, ifrerun):
        pass

    def test_introduce(self, casedealinfoDic, ifrerun):
        pass

    def test_maximize(self, casedealinfoDic, ifrerun):
        pass
Esempio n. 7
0
class Logger(object):
    # 定义常量
    module_path = path.pathutil().rootPath
    logpath = module_path + '\\Output\\Log\\RunLog' + time.strftime(
        '%Y%m%d', time.localtime(time.time())) + '.log'
    # 日志级别关系映射
    level_relations = {
        "debug": logging.DEBUG,
        "info": logging.INFO,
        "warning": logging.WARNING,
        "error": logging.ERROR,
        "critical": logging.CRITICAL
    }
    streamHandler = logging.StreamHandler()

    def __init__(self,
                 filename=logpath,
                 level="info",
                 when="D",
                 backupCount=3,
                 fmt="%(message)s"):
        # 设置日志输出格式
        format_str = logging.Formatter(fmt)
        # 设置日志输出文件
        self.logger = logging.getLogger(filename)
        if not self.logger.handlers:
            # 设置控制台中输出日志格式
            self.streamHandler.setFormatter(format_str)

            # 设置日志输出到文件(指定间隔时间自动生成文件的处理器  --按日生成)
            # filename:日志文件名,interval:时间间隔,when:间隔的时间单位, backupCount:备份文件个数,若超过这个数就会自动删除
            fileHandler = handlers.TimedRotatingFileHandler(
                filename=filename,
                when=when,
                backupCount=backupCount,
                encoding="utf-8")
            # 设置日志文件中的输出格式
            fileHandler.setFormatter(format_str)
            # 设置日志级别
            self.logger.setLevel(self.level_relations.get(level))
            self.logger.addHandler(fileHandler)
            self.logger.addHandler(self.streamHandler)

    def M_info(self, i_line, str_actualResult, str_examinedField,
               str_expected_value, str_actualValue, str_stepResult,
               str_scriptNote):
        self.logger.info('【' + str(i_line) + '】===>' + str_actualResult)
        self.logger.info(str_examinedField)
        self.logger.info(str_expected_value)
        self.logger.info(str_actualValue)
        self.logger.info(str_stepResult)
        self.logger.info('#script_note#' + str_scriptNote)

    def debug(self, message):
        self.fontColor('\033[32m%s\033[0m')
        self.logger.debug(message)

    def info(self, message):
        """

        :rtype: object
        """
        self.fontColor('\033[34m%s\033[0m')
        self.logger.info(message)

    def warning(self, message):
        self.fontColor('\033[37m%s\033[0m')
        self.logger.warning(message)

    def error(self, message):
        self.fontColor('\033[31m%s\033[0m')
        self.logger.error(message)

    def critical(self, message):
        self.fontColor('\033[35m%s\033[0m')
        self.logger.critical(message)

    def fontColor(self, color):
        # 不同的日志输出不同的颜色
        formatter = logging.Formatter(color % '%(message)s')
        self.streamHandler.setFormatter(formatter)
        self.logger.addHandler(self.streamHandler)