由于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. 词频统计小程序-WordCount.exe

    一. 背景 ​ 最近顶哥为了完成学历提升学业中的小作业,做了一个词频统计的.exe小程序.因为当时做的时候网上的比较少,因此顶哥决定把自己拙略的作品发出来给需要的人提供一种思路,希望各位看官不要dis ...

  2. Notepad++-第一篇命令行语句执行之编译、运行Java

    1.让Notepad++编译和运行Java,在电脑上要已经配置好了Java的开发环境 2.在Notepad++上面的选项栏中找到 Plugins--->Plugin Admin 3.在Avail ...

  3. WOJ#2423 安全出行Safe Travel

    描述 精灵最近在农场上泛滥,它们经常会阻止牛们从农庄(牛棚_1)走到别的牛棚(牛_i的目的 地是牛棚_i).每一个精灵只认识牛_i并且知道牛_i一般走到牛棚_i的最短路经.所以它们在牛_i到牛棚_i之 ...

  4. C++ 函数返回对象时并没有调用拷贝构造函数

    #include <iostream> #include <vector> #include <string.h> using namespace std; cla ...

  5. 生日蛋糕 (poj1190) (dfs剪枝)

    [题目描述] 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为 ...

  6. P2876 [USACO07JAN]解决问题Problem Solving

    传送门 显然的 $dp$,设 $f[i][j]$ 表示做完第 $i$ 题,此月做的题的区间为 $[j,i]$ 需要的最少月数 每个月记得分成还钱并写新题,和只还钱分类讨论,不要搞成每个月强制做一题 那 ...

  7. 工作时使用的vim配置

    """"""""""""""""&quo ...

  8. 行人重识别(ReID) ——数据集描述 DukeMTMC-reID

    数据集简介 DukeMTMC 数据集是一个大规模标记的多目标多摄像机行人跟踪数据集.它提供了一个由 8 个同步摄像机记录的新型大型高清视频数据集,具有 7,000 多个单摄像机轨迹和超过 2,700 ...

  9. TensorFlow学习笔记1:graph、session和op

    graph即tf.Graph(),session即tf.Session(),很多人经常将两者混淆,其实二者完全不是同一个东西. graph定义了计算方式,是一些加减乘除等运算的组合,类似于一个函数.它 ...

  10. Tomcat支持SSL加密网站

    配置Tomcat,以支持SSL对网站加密,关键性配置如下: 思路:在tomcat服务器web1上做相应配置->客户端测试. 1.创建加密用的私钥和证书文件 [root@web1 ~]# keyt ...