预期框架整理目标:

1.单个用例维护在单个.py文件中可单个执行,也可批量生成组件批量执行

2.对定位参数,定位方法,业务功能脚本,用例脚本,用例批量执行脚本,常用常量进行分层独立,各自维护在单独的.py文件中

3.加入日志,htlm报表,发送邮件功能

框架结构

结构说明:

config:配置部分,浏览器种类和定位信息维护在此处

constant:常量部分,固定不变的数据维护在此处

data:存放用于参数化的文本表格等文件

encapsulation:定位等selenium功能二次封装在此处

error_picture:存放错误截图

function:业务功能脚本维护在此处

log:存放log类

report:存放测试报告文件

test_case:存放用例文件

all_case.py:用来执行所有用例

debug_case.py:本人调试用的,可以忽略

tst.log:生成的日志

逐个介绍各个包下面的.py文件,并附上源码(说明见注释哈哈~):

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-05-11 13:42
# config/config_01.py
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import * # config配置部分 # 浏览器种类维护在此处
browser_config = {
'ie': webdriver.Ie,
'chrome': webdriver.Chrome
} # 定位信息维护在此处,维护结构由外到内为:页面名称--页面下元素名称--元素的定位方式+参数
locat_config = {
'博客园首页': {
'找找看输入框': ['id', 'zzk_q'],
'找找看按钮': ['xpath', '//input[@value="找找看"]']
}
}
 #!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-05-15 13:20
# constant/constant_1.py # 常量部分(固定不变使用频繁的参数维护在此处)
LOGIN_URL = 'https://www.cnblogs.com/'
 #!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-05-15 13:20
# encapsulation/encapsulation.py # 封装部分维护在此 from config.config_01 import locat_config
from log.log import Logger
from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class UIHandle():
logger = Logger() # 构造方法,用来接收selenium的driver对象
@classmethod
def __init__(cls, driver):
cls.driver = driver # 输入地址
@classmethod
def get(cls, url):
cls.logger.loginfo(url)
cls.driver.get(url) # 关闭浏览器驱动
@classmethod
def quit(cls):
cls.driver.quit() # element对象(还可加入try,截图等。。。)
@classmethod
def element(cls, page, element):
# 加入日志
cls.logger.loginfo(page)
# 加入隐性等待
# 此处便可以传入config_o1中的dict定位参数
el = WebDriverWait(cls.driver, 10).until(EC.presence_of_element_located(locat_config[page][element]))
# 加入日志
cls.logger.loginfo(page+'OK')
return el
# element对象(还未完成。。。)
def elements(cls, page, element):
# 加入日志
cls.logger.loginfo(page)
# 加入隐性等待
WebDriverWait(cls.driver, 10)
els = cls.driver.find_elements(*locat_config[page][element])
# 注意返回的是list
return els # send_keys方法
@classmethod
def Input(cls, page, element, msg):
el = cls.element(page, element)
el.send_keys(msg) # click方法
@classmethod
def Click(cls, page, element):
el = cls.element(page, element)
el.click()
 #!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-05-15 13:22
# function/function_01.py
# 业务功能脚本(用例脚本可调用此处的功能脚本) from encapsulation.encapsulation import UIHandle
from constant.constant_1 import LOGIN_URL
from config.config_01 import browser_config
from time import sleep # 打开博客园首页,进行找找看搜索功能
def search(msg):
# 打开浏览器
driver = browser_config['chrome']()
# 传入driver对象
uihandle = UIHandle(driver)
#输入url地址
uihandle.get(LOGIN_URL)
# 调用二次封装后的方法,此处可见操作了哪个页面,哪个元素,msg是要插入的值,插入值得操作在另外一个用例文件中传入
uihandle.Input('博客园首页', '找找看输入框', msg)
uihandle.Click('博客园首页', '找找看按钮')
uihandle.quit()
 #!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-05-17 11:19
# log/log.py import logging
import logging.handlers # 日志类
class Logger():
LOG_FILE = 'tst.log' handler = logging.handlers.RotatingFileHandler(LOG_FILE, maxBytes = 1024*1024, backupCount = 5) # 实例化handler
fmt = '%(asctime)s - %(filename)s:%(lineno)s - %(name)s - %(message)s' formatter = logging.Formatter(fmt) # 实例化formatter
handler.setFormatter(formatter) # 为handler添加formatter logger = logging.getLogger('tst') # 获取名为tst的logger
logger.addHandler(handler) # 为logger添加handler
logger.setLevel(logging.DEBUG)
def loginfo(self, message):
self.logger.info(message) def logdebug(self, message):
self.logger.debug(message)
 #!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-05-15 15:30
# test_case/test_case_1/start_case_01.py import unittest
from function.function_01 import *
# 用例
class Case_02(unittest.TestCase):
u'''哇塞好玩'''
def setUp(self):
pass def test_zzk(self):
u'''输入哇塞好玩后点击找找看'''
search("哇塞好玩")
print('打印方法名:test_zzk') def tearDown(self):
pass if __name__ == "__main__":
unittest.main()
 #!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-05-10 16:34
# all_case.py import unittest
import HTMLTestRunner
import time,os,datetime
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage # 取test_case文件夹下所有用例文件
def creatsuitel(lists):
testunit = unittest.TestSuite()
# discover 方法定义
discover = unittest.defaultTestLoader.discover(lists, pattern='start_*.py', top_level_dir=None)
#discover 方法筛选出来的用例,循环添加到测试套件中
for test_suite in discover:
for test_case in test_suite:
testunit.addTests(test_case)
print(testunit)
return testunit
list_1 = 'test_case\\test_case_1'
alltestnames = creatsuitel(list_1) #取前面时间加入到测试报告文件名中
now = time.strftime("%Y-%m-%M-%H_%M_%S", time.localtime(time.time()))
filename = "report\\"+now+'result.html' #定义个报告存放路径,支持相对路径。
fp = open(filename, 'wb')
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='Report_title', description='Report_description') if __name__ == "__main__":
# 执行测试用例集并生成报告
runner = unittest.TextTestRunner()

感谢@大师兄+@我去热饭的指导与帮助。

 

为什么选择?

有的人喜欢创造世界,他们做了程序员

有的人喜欢拯救世界,他们做了测试员

python+unittest框架整理(一点点学习前辈们的封装思路,一点点成长。。。)的更多相关文章

  1. python+unittest框架第六天unittest之优化测试报告

    今天的内容主要是,用第三方的HTMLRUNner 第三方的报告来优化之前第五天批量执行案例的测试报告.案例的部分看第五天的批量执行笔记~ HTMLRUNner他可以生成更美观的测试报告,基于前辈造的车 ...

  2. python+unittest框架第一天unittest之简单认识Test Fixure:测试固件【8月17更新】

    20万的慢慢会实现的吧,hhh unittest框架,我就不在介绍了,百度有很详细的介绍. 我们只要了解: 1.unittest是单元测试框架 2.它提供用例组织与执行:在实际工作中案例可能有上百条, ...

  3. python+unittest框架第二天unittest之简单认识Test Suite:测试套件

    今天了解下测试套件Test Suite,什么是测试套件,测试套件是由多个Test Case测试用例组成的,当然也可以由多个子测试套件组成. 接下来看下如果构建测试套件,构建测试套件的方法: 1.用un ...

  4. python+unittest框架第四天unittest之批量执行案例

    今天开始批量执行用例~,场景是这样的: 工作中我们可能有多个模块文件(.py)这些文件根据不同的业务类型或功能,测试案例分布在不同的模块文件下.前面的小示例中,我们的测试用例都是在一个文件中,直接运行 ...

  5. python+unittest框架第三天unittest之分离测试固件和公共代码,跳过案例的执行

    我们在时间工作中,会将整个项目的代码分别放置多个模块中去编写.方便后期项目维护,比如,我们的web项目可能有多个IP地址,每个IP地址代表不同的测试环境.测试环境与Bat环境或者验收环境等.这就需要我 ...

  6. python unittest框架装饰器

    要说单元测试和UI自动化之间的是什么样的一个关系,说说我个人的一些心得体会吧,我并没有太多的这方面经验,由于工作本身就用的少,还有就是功能测试点点对于我这种比较懒惰的人来说,比单元测试复杂...思考单 ...

  7. python unittest框架理解与总结(二)

    unittest基本原理: ♦整个平台的搭建使用的是python的unittest测试框架,这里简单介绍下unittest模块的简单应用. ♦unittest是python的标准测试库,相比于其他测试 ...

  8. python unittest框架中addCleanup函数详解

    接上一篇doCleanups说明,这次介绍下另一个很好用的函数:addCleanup 还是老规矩,看官方文档说明: addCleanup(function, *args, **kwargs)¶ Add ...

  9. python+unittest框架第四天unittest之断言(一)

    unittest中的测试断言分两天总结,hhh其实内容不多,就是懒~ 断言的作用是什么?  答:设置测试断言以后,能帮助我们判断测试用例执行结果. 我们先看下unittest支持的断言有哪些: 对上面 ...

随机推荐

  1. mui上拉加载

    最近在做移动端的项目,用到了mui的上拉加载,整理如下: 1.需要引入的css.js <link rel="stylesheet" href="common/mui ...

  2. Java 判断回文字符串有多少和其中的最大字符串

    一.简介代码功能 该代码的功能可以实现对任意的一段字符串进行判断是否有回文,回文有哪些,和其中的最大回文. 二.代码部分 1.全局变量 static String hws = "" ...

  3. linux下如何查看mysql、apache是否安装,并卸载

    --linux下如何查看mysql.apache是否安装,并卸载? http://blog.163.com/dengxiuhua126@126/blog/static/1186077720137311 ...

  4. 腾讯云安全:开发者必看|Android 8.0 新特性及开发指南

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 背景介绍 谷歌2017 I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 A ...

  5. QT5 && VS2013配置

    1.下载安装包 qt-opensource-windows-x86-msvc2013_64-5.7.0.exe VS2013_RTM_ULT_ENU.iso 插件:qt-vs-addin-msvc20 ...

  6. 关于使用ModelSim中编写testbench模板问题

    对于初学者来说写Testbench测试文件还是比较困难的,但Modelsim和quartus ii都提供了模板,下面就如何使用Modelsim提供的模板进行操作. Modelsim提供了很多Testb ...

  7. 概率检索模型及BM25

    概率排序原理 以往的向量空间模型是将query和文档使用向量表示然后计算其内容相似性来进行相关性估计的,而概率检索模型是一种直接对用户需求进行相关性的建模方法,一个query进来,将所有的文档分为两类 ...

  8. KVO 模式详解

    KVO:观察者模式.当指定的被观察对象属性被修改时,允许对象接收到通知的机制. p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; ...

  9. 【转】JDBC学习笔记(4)——PreparedStatement的使用

    转自:http://www.cnblogs.com/ysw-go/ PreparedStatement public interface PreparedStatement extends State ...

  10. aos.js超赞页面滚动元素动画jQuery动画库

    插件描述:aos.js 是一款效果超赞的页面滚动元素动画jQuery动画库插件.该动画库可以在页面滚动时提供28种不同的元素动画效果,以及多种easing效果.在页面往回滚动时,元素会恢复到原来的状态 ...