python web自动化测试框架搭建(功能&接口)——测试用例执行和结果收集
由于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自动化测试框架搭建(功能&接口)——接口用例实现
测试用例基类: # coding=utf-8 import unittest import Logger log = Logger.Loger() class BaseCase(unittest.Te ...
- python web自动化测试框架搭建(功能&接口)——接口公共方法
接口公共方法有:数据引擎.http引擎.Excel引擎 1.数据引擎:获取用例.结果检查.结果统计 # -*- coding:utf-8 -*- from XlsEngine import XlsEn ...
- python web自动化测试框架搭建(功能&接口)——接口测试模块
Python接口测试采用python读取excel的方法,通过requests库发送请求和接收响应.模块有: Data:用于存放excel用例的,用例格式: iutil: 接口公共方法,数据引擎.ht ...
- python web自动化测试框架搭建(功能&接口)——功能测试模块
功能测试使用selenium,模块有: 1.futil: 公共方法,如元素高亮显示 # coding=utf-8 """高亮显示元素""" ...
- python web自动化测试框架搭建(功能&接口)——通用模块
1.通用模块: config.conf: 公共配置文件,配置报告.日志.截图路径,以及邮件相关配置 [report] reportpath = E:\workspace\WebAutomation\s ...
- Python web自动化测试框架搭建(功能&接口)——unittest介绍
Python UnitTest测试框架介绍 1) TestCase:所有测试用例类继承的基本类, TestCase的实例就是测试用例 2) TestSuite:测试套件 ...
- python web自动化测试框架搭建(功能&接口)——环境搭建
自动化测试框架一般需要实现以下通用功能 执行前准备 结束后清理 执行步骤输出 执行结果输出 错误.失败截图 测试报告 发送邮件 日志 需要的软件和python第三方库有: 通用: JDK Eclips ...
- 基于python的自动化测试框架搭建
滴~ 今日打卡! 好多天没来打卡了.博主最近一直在把碎片化知识转化为知识体系的过程中挣扎.Python语言.selenium.unittest框架.HTMLTestRunner框架都有所了解,也写 ...
- selenium +python web自动化测试环境搭建
基础框架搭建 1.安装python 2.安装selenium cmd输入pip install selenium 问题:在python中输入from selenium import webdriver ...
随机推荐
- mysql修改库、表、字段 字符集,中文排序
查看字段编码: show full columns from t2;show variables like '%character%';show variables like 'collation_% ...
- Html标签替换(过滤掉html特殊符号)
/// <summary> /// 替换标签,把 <>" 替换为HTML标记 /// </summary> /// <param name=&quo ...
- JVM-堆内存
1. java堆内存介绍 java的堆内存可以类比于计算机的内存,是存储整个机器数据的地方. (1)jvm一起动就创建java堆.类比计算机一起动就加载内存. (2)所有的线程共享.类比计算机所有进程 ...
- Oracle数据库的下载与安装
Oracle数据库下载: 推荐去Oracle官网下载 官方网址链接:https://www.oracle.com/database/technologies/oracle-database-softw ...
- [Codeforces 1208D]Restore Permutation (树状数组)
[Codeforces 1208D]Restore Permutation (树状数组) 题面 有一个长度为n的排列a.对于每个元素i,\(s_i\)表示\(\sum_{j=1,a_j<a_i} ...
- [SPOJ]Count on a tree II(树上莫队)
树上莫队模板题. 使用欧拉序将树上路径转化为普通区间. 之后莫队维护即可.不要忘记特判LCA #include<iostream> #include<cstdio> #incl ...
- 初学css display
display:网上查到的资料说是:属性规定元素应该生成的框的类型.例如:网页上的导航栏,使用ul->li那么需要让其排列在一行上可以使用设置li:{float:left:},也可以使用disp ...
- 回溯---IP 地址划分
IP 地址划分 93. Restore IP Addresses(Medium) Given "25525511135", return ["255.255.11.135 ...
- VUE组件嵌套
vue中组件嵌套烦分为两种,分别是全局注册组件和局部注册组件 基本步骤: 1.在components 下创建一个新的.vue结尾的文件,文件首字母最好是大写,基于规范复制代码 2.分别写出结构层< ...
- Sql Server 显示插入Identity字段
先像下面这样写 SET IDENTITY_INSERT [表名] ON ...INSERT INTO ... 别忘了在插入完数据后再执行下面的语句 SET IDENTITY_INSERT [表 ...