由于unittest框架中结果收集在不同文件中,所以此处重写结果收集方法,加入执行时间,失败信息,失败截图等

TestRunner.py

# coding=utf-8
import sys
import time
import datetime
import unittest
from PIL import ImageGrab
import random
import ConfigParser
import re
import Logger log = Logger.Loger()
TestResult = unittest.TestResult class _TestResult(TestResult): def __init__(self, verbosity=1):
TestResult.__init__(self)
self.success_count = 0
self.failure_count = 0
self.error_count = 0
self.skip_count = 0
self.verbosity = verbosity
self.results = {} def startTest(self, test):
TestResult.startTest(self, test)
class_name=test.__class__.__name__
if self.results.has_key(class_name):
self.results[class_name].setdefault(test, {})
else:
self.results.setdefault(class_name, {})
self.results[class_name].setdefault(test, {})
casename = None
verbosity = None
if test._testMethodDoc != None:
casename = (re.findall(r"name:(.+?)\n", test._testMethodDoc))[0]
verbosity = (re.findall(r"verbosity:(.+?)\n", test._testMethodDoc))[0]
(self.results[class_name])[test].setdefault("name", casename)
(self.results[class_name])[test].setdefault("verbosity", verbosity)
starttime = datetime.datetime.now()
#starttime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
(self.results[class_name])[test].setdefault("starttime", starttime)
log.info("————————————————————————————————————————————————————————————")
log.info("%s start testing" % test) def stopTest(self, test):
TestResult.stopTest(self, test)
stoptime = datetime.datetime.now()
#stoptime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
class_name=test.__class__.__name__
(self.results[class_name])[test].setdefault("stoptime", stoptime)
log.info("%s stop testing" % test)
log.info("————————————————————————————————————————————————————————————\n") def addSuccess(self, test):
self.success_count += 1
TestResult.addSuccess(self, test)
class_name=test.__class__.__name__
(self.results[class_name])[test].setdefault("Result", "Pass")
(self.results[class_name])[test].setdefault("Reason", "")
(self.results[class_name])[test].setdefault("Screenshoot", "")
log.info("%s is Pass" % test) # 打印成功信息
log.info("%s is Pass" % test) def addError(self, test, err):
self.error_count += 1
TestResult.addError(self, test, err)
# 失败截图
addr=self.getScreen()
class_name=test.__class__.__name__
(self.results[class_name])[test].setdefault("Result", "Error")
(self.results[class_name])[test].setdefault("Reason", self._exc_info_to_string(err, test))
(self.results[class_name])[test].setdefault("Screenshoot", addr)
log.info("%s is Error" % test)
log.info(self._exc_info_to_string(sys.exc_info(), test)) def addFailure(self, test, err):
self.failure_count += 1
TestResult.addFailure(self, test, err)
addr=self.getScreen()
class_name=test.__class__.__name__
(self.results[class_name])[test].setdefault("Result", "Failed")
(self.results[class_name])[test].setdefault("Reason", self._exc_info_to_string(err, test))
(self.results[class_name])[test].setdefault("Screenshoot", addr)
log.info("%s is Failed" % test)
log.info(self._exc_info_to_string(sys.exc_info(), test)) # 打印失败信息 def addSkip(self, test, reason):
self.skip_count += 1
TestResult.addSkip(self, test, reason)
class_name=test.__class__.__name__
if self.results.has_key(class_name):
self.results[class_name].setdefault(test,{})
else:
self.results.setdefault(class_name, {})
(self.results[class_name])[test].setdefault("Result", "Skip")
(self.results[class_name])[test].setdefault("Reason", reason)
(self.results[class_name])[test].setdefault("Screenshoot", "")
log.info("%s is skiped, reason is %s" % (test, reason)) def getScreen(self):
# 失败截图
conf = ConfigParser.ConfigParser()
conf.read("config.conf")
ssFolder = conf.get("report", "screen_path")
screenshootpath = ssFolder +"\\"
im = ImageGrab.grab()
rand = random.randint(1000, 9999)
addr = screenshootpath + time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())) + str(rand) + ".png"
im.save(addr)
return addr class AutoTestRunner():
"""
"""
def __init__(self, stream=sys.stdout, verbosity=1):
self.stream = stream
self.verbosity = verbosity
self.startTime = datetime.datetime.now() #基于用例的优先级筛选用例
def baseVerbosityRun(self,test,verbosity):
suite = unittest.TestSuite()
for suites in test._tests:
for sui in suites._tests:
if sui.countTestCases>0:
for s in sui:
if s._testMethodDoc != None:
vb = (re.findall(r"verbosity:(.+?)\n", s._testMethodDoc))[0]
if int(vb) == verbosity:
suite.addTest(s)
return suite def run(self, test):
result = _TestResult(self.verbosity)
#suite = self.baseVerbosityRun(test,1) #按优先级执行
#suite(result)
test(result)
'''
将失败的用例加入suite,为失败重跑做准备
suite = unittest.TestSuite()
teresult = result.results
for case in teresult.keys():
if (teresult[case])["Result"] == "Failed":
suite.addTest(case)
''' self.stopTime = datetime.datetime.now()
timeTaken = (self.stopTime - self.startTime).seconds
run = result.testsRun
log.info("Ran %d case%s in %.3fs" % (run, run != 1 and "s" or "", timeTaken))
timeTaken = str(datetime.timedelta(seconds=timeTaken))
infos = {"Success":result.success_count, "Fail":result.failure_count, "Error":result.error_count, "Skip":result.skip_count, "CaseNum":run,
"StartTime":self.startTime.strftime("%Y-%m-%d %H:%M:%S"), "StopTime":self.stopTime.strftime("%Y/%m/%d %H:%M:%S"), "TakeTime":timeTaken} return (result, infos) class TestProgram(unittest.TestProgram):
def runTests(self):
if self.testRunner is None:
self.testRunner = AutoTestRunner(verbosity=self.verbosity)
unittest.TestProgram.runTests(self) main = TestProgram if __name__ == "__main__":
main(module=None)

Python web功能&接口自动化测试框架搭建——接口用例实现

Python web功能&接口自动化测试框架搭建——接口公共方法

Python web功能&接口自动化测试框架搭建——接口测试模块

Python web功能&接口自动化测试框架搭建——功能测试模块

Python web功能&接口自动化测试框架搭建——测试用例执行和结果收集

Python web功能&接口自动化测试框架搭建——通用模块

Python web功能&接口自动化测试框架搭建——unittest介绍

Python web功能&接口自动化测试框架搭建——环境搭建

python web自动化测试框架搭建(功能&接口)——测试用例执行和结果收集的更多相关文章

  1. python web自动化测试框架搭建(功能&接口)——接口用例实现

    测试用例基类: # coding=utf-8 import unittest import Logger log = Logger.Loger() class BaseCase(unittest.Te ...

  2. python web自动化测试框架搭建(功能&接口)——接口公共方法

    接口公共方法有:数据引擎.http引擎.Excel引擎 1.数据引擎:获取用例.结果检查.结果统计 # -*- coding:utf-8 -*- from XlsEngine import XlsEn ...

  3. python web自动化测试框架搭建(功能&接口)——接口测试模块

    Python接口测试采用python读取excel的方法,通过requests库发送请求和接收响应.模块有: Data:用于存放excel用例的,用例格式: iutil: 接口公共方法,数据引擎.ht ...

  4. python web自动化测试框架搭建(功能&接口)——功能测试模块

    功能测试使用selenium,模块有: 1.futil: 公共方法,如元素高亮显示 # coding=utf-8 """高亮显示元素""" ...

  5. python web自动化测试框架搭建(功能&接口)——通用模块

    1.通用模块: config.conf: 公共配置文件,配置报告.日志.截图路径,以及邮件相关配置 [report] reportpath = E:\workspace\WebAutomation\s ...

  6. Python web自动化测试框架搭建(功能&接口)——unittest介绍

    Python UnitTest测试框架介绍 1)         TestCase:所有测试用例类继承的基本类, TestCase的实例就是测试用例 2)         TestSuite:测试套件 ...

  7. python web自动化测试框架搭建(功能&接口)——环境搭建

    自动化测试框架一般需要实现以下通用功能 执行前准备 结束后清理 执行步骤输出 执行结果输出 错误.失败截图 测试报告 发送邮件 日志 需要的软件和python第三方库有: 通用: JDK Eclips ...

  8. 基于python的自动化测试框架搭建

    滴~ 今日打卡!   好多天没来打卡了.博主最近一直在把碎片化知识转化为知识体系的过程中挣扎.Python语言.selenium.unittest框架.HTMLTestRunner框架都有所了解,也写 ...

  9. selenium +python web自动化测试环境搭建

    基础框架搭建 1.安装python 2.安装selenium cmd输入pip install selenium 问题:在python中输入from selenium import webdriver ...

随机推荐

  1. [Python3 填坑] 018 组装类的几个例子

    目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 MetaClass 举例 2.2 type 举例 2.3 MetaClass 举例 1. print( 坑的信息 ) 挖坑时间:2019 ...

  2. Git-第二篇廖雪峰Git教程学习笔记(1)基本命令,版本回退

    1.安装Git-2.16.2-64-bit.exe后,设置用户名,用户邮箱 #--global参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地 ...

  3. STM32启动地址设置及从非0x800000 开始调试程序

    首先设置程序的启动地址,STM32默认的启动地址是从0x8000000开始的,现在我要设置程序向后偏移10K地址,也就是从0x8002800启动. 需要分两步完成上面操作: 一.Keil MDK设置: ...

  4. c# winfrom程序中 enter键关联button按钮

    1,关联按钮上的Key事件             在按钮上的keypress,keydown,keyup事件必须要获得焦点,键盘上的键才能有效.        private void btnEnt ...

  5. k3 cloud中获取年月日

    日期类型字段元素.Date.Year(获取年) 日期类型字段元素.Date.Month(获取月)日期类型字段元素.Date.Day(获取天)

  6. Python subprocess ffmpeg

    # -*- coding:utf-8 -*- import os, sys, getopt import numpy as np import subprocess as sp import cv2 ...

  7. CentOS 7 FTP的安装与配置

    CentOS7 FTP安装与配置 1.FTP的安装 #安装yum install -y vsftpd #设置开机启动systemctl enable vsftpd.service #启动systemc ...

  8. 前端面试题(4)JavaScript

    前端面试题JavaScript(一) JavaScript的组成 JavaScript 由以下三部分组成: ECMAScript(核心):JavaScript 语言基础 DOM(文档对象模型):规定了 ...

  9. re模块 时间模块

    # 正则模块'''正则就是用一些具有特殊含义的符号组合到一起用来描述字符或字符串的方法或者说,正则就是用来描述一类事物的规则它内嵌在python中,并通过re模块实现正则表达式模式被编译成一系列的字节 ...

  10. 使用Fabric在tomcat中部署应用的问题总结

    关闭tomcat时 A.为什么调用shutdown时,报错连接拒绝 结论——很可能是因为tomcat没启动或没完全启动:而这个时候调用shutdown就会出现此类报错 解决方法:time.sleep ...