由于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. jquery点击切换在点击切换

    <div style=" position: absolute; top: 6rem; right: 4rem;" id="hides" > < ...

  2. 欧拉函数&欧拉定理&降幂 总结

    欧拉函数&欧拉定理&降幂 总结 标签:数学方法--数论 阅读体验:https://zybuluo.com/Junlier/note/1300214 这年头不总结一下是真的容易忘,老了老 ...

  3. python学习第四十四天斐波那契数列和yield关键词使用

    斐波那契数列是数学中的常见的算法,第一个第二个不算,从第三个开始,每个数的都是前面两个数的和,使用yield关键词把生成的数列保存起来,调用的时候再调用,下面举例说明一下 def fab(max): ...

  4. vue.js(15)--vue的生命周期

    生命周期钩子 生命周期钩子=生命周期函数=生命周期事件 每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听.编译模板.将实例挂载到 DOM 并在数据变化时更新 DOM 等 ...

  5. Vue/React如何优雅的一劳永逸的注册路由及组件

    原文链接: 本人掘金文章  假如图片看不清晰可前往掘金原文预览 官方文档: 组建注册 路由注册 未优化版: 在Vue官方文档 中,我们通过  Vue.component('MyComponentNam ...

  6. java指定若干个网络图片,打包为zip下载

    应项目要求需要将多个存在某url地址的图片,打包为zip下载下来 public void download(HttpServletRequest request, HttpServletRespons ...

  7. linux下挂载U盘方法

    1.使用 cat /proc/partitions 查看系统现在有哪些分区:[root@localhost ~]# cat /proc/partitions major minor  #blocks  ...

  8. 四轴飞行器飞行原理与双闭环PID控制

    四轴轴飞行器是微型飞行器的其中一种,相对于固定翼飞行器,它的方向控制灵活.抗干扰能力强.飞行稳定,能够携带一定的负载和有悬停功能,因此能够很好地进行空中拍摄.监视.侦查等功能,在军事和民用上具备广泛的 ...

  9. 切面AOP的切点@Pointcut用法

    格式: execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern ...

  10. Support for the experimental syntax 'decorators-legacy' isn't currently enabled (7:1):

    1.产生原因:项目不支持装饰器 2.解决方法: 2.1 执行 yarn 安装完整依赖: 2.2 如果依赖时yarn.lock变化了,并且项目有git目录,则将提示的文件提交到git仓库 ? Are y ...