由于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. from 表单回车自动提交

    自动提交的情况 1 表单只有单个输入框 2 type=‘submit  这里注意button默认type为submit 解决方法 1 添加一个隐藏的输入框 2 form添加属性 onsubmit=&q ...

  2. Atlantis poj1151 线段树扫描线

    Atlantis poj1151 线段树扫描线 题意 题目给了n个矩形,每个矩形给了左下角和右上角的坐标,矩形可能会重叠,求的是矩形最后的面积. 题解思路 这个是我线段树扫描线的第一题,听了学长的讲解 ...

  3. BZOJ 1875(DP+矩阵快速幂)

    题面 传送门 分析 容易想到根据点来dp,设dp[i][j]表示到i点路径长度为j的方案数 状态转移方程为dp[i][k]=∑(i,j)∈Edp[j][k−1]" role="pr ...

  4. Neo4j 不区分大小写的模糊查询匹配

    问题:当图数据库中存储的节点的名字为英文时,就会遇到大小写不匹配问题. 使用不区分大小写的正则表示式可以解决以上问题. Cpyher的where语法里支持正则表达式 ,其语法为 :   =~ &quo ...

  5. Untiy3D的游戏物体的实例和刚体的使用

    一,如下代码, GameObject b = GameObject.Instantiate(bullet, transform.position, transform.rotation) as Gam ...

  6. SSM商城系统开发笔记-问题02- Error creating bean with name 'userController'

    Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean wit ...

  7. spark cli

    Spark SQL CLI Spark1.1增加了Spark SQL CLI和ThriftServer SparkSQL CLI配置 1.创建并配置hive-site.xml 在运行Spark SQL ...

  8. vue防抖节流函数---组件封装,防止按钮多次点击

    1.vue 封装utils.js /** * @param {function} func 执行函数 * @param {number} time 防抖节流时间 * @param {boolean} ...

  9. 你的package包名有问题!

    今天在Eclipse中运行我的Java程序中,就弹出了以下消息的窗口: 注意窗口的名字为Java Virtual Machine Launcher . Error : A JNI error has ...

  10. Eclipse创建maven的war工程没有web.xml解决方式

    当我们使用Eclipse创建maven的web项目时,会缺少xml文件,在这里我提供两种自动创建xml的方法: 1.方法一 右键项目→Java EE Tools→Generate Deployment ...