python+unittest框架整理(一点点学习前辈们的封装思路,一点点成长。。。)
预期框架整理目标:
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框架整理(一点点学习前辈们的封装思路,一点点成长。。。)的更多相关文章
- python+unittest框架第六天unittest之优化测试报告
今天的内容主要是,用第三方的HTMLRUNner 第三方的报告来优化之前第五天批量执行案例的测试报告.案例的部分看第五天的批量执行笔记~ HTMLRUNner他可以生成更美观的测试报告,基于前辈造的车 ...
- python+unittest框架第一天unittest之简单认识Test Fixure:测试固件【8月17更新】
20万的慢慢会实现的吧,hhh unittest框架,我就不在介绍了,百度有很详细的介绍. 我们只要了解: 1.unittest是单元测试框架 2.它提供用例组织与执行:在实际工作中案例可能有上百条, ...
- python+unittest框架第二天unittest之简单认识Test Suite:测试套件
今天了解下测试套件Test Suite,什么是测试套件,测试套件是由多个Test Case测试用例组成的,当然也可以由多个子测试套件组成. 接下来看下如果构建测试套件,构建测试套件的方法: 1.用un ...
- python+unittest框架第四天unittest之批量执行案例
今天开始批量执行用例~,场景是这样的: 工作中我们可能有多个模块文件(.py)这些文件根据不同的业务类型或功能,测试案例分布在不同的模块文件下.前面的小示例中,我们的测试用例都是在一个文件中,直接运行 ...
- python+unittest框架第三天unittest之分离测试固件和公共代码,跳过案例的执行
我们在时间工作中,会将整个项目的代码分别放置多个模块中去编写.方便后期项目维护,比如,我们的web项目可能有多个IP地址,每个IP地址代表不同的测试环境.测试环境与Bat环境或者验收环境等.这就需要我 ...
- python unittest框架装饰器
要说单元测试和UI自动化之间的是什么样的一个关系,说说我个人的一些心得体会吧,我并没有太多的这方面经验,由于工作本身就用的少,还有就是功能测试点点对于我这种比较懒惰的人来说,比单元测试复杂...思考单 ...
- python unittest框架理解与总结(二)
unittest基本原理: ♦整个平台的搭建使用的是python的unittest测试框架,这里简单介绍下unittest模块的简单应用. ♦unittest是python的标准测试库,相比于其他测试 ...
- python unittest框架中addCleanup函数详解
接上一篇doCleanups说明,这次介绍下另一个很好用的函数:addCleanup 还是老规矩,看官方文档说明: addCleanup(function, *args, **kwargs)¶ Add ...
- python+unittest框架第四天unittest之断言(一)
unittest中的测试断言分两天总结,hhh其实内容不多,就是懒~ 断言的作用是什么? 答:设置测试断言以后,能帮助我们判断测试用例执行结果. 我们先看下unittest支持的断言有哪些: 对上面 ...
随机推荐
- C#委托冒泡
委托的实现,就是编译器自行定义了一个类:有三个重要参数1.制定操作对象,2.指定委托方法3.委托链 看如下一个列子: class DelegatePratice { public static voi ...
- 学习面向对象编程OOP 第二天
好,今天继续学习这个面向对象编程.(根据博客园 小炒花生米写的博客学习而来) 一,封装性 a.把对象的全部属性和全部服务(方法)结合在一起,形成一个不可分割的独立单元 =>对象 b.信息隐蔽,尽 ...
- 自定义一个EL函数
自定义一个EL函数 一般就是一下几个步骤,顺便提供一个工作常用的 案例: 1.编写一个java类,并编写一个静态方法(必需是静态方法),如下所示: public class DateTag { pri ...
- NDK 线程同步
使用场景 对底层代码进行 HOOK, 不可避免的要考虑多线程同步问题, 当然也可以写个类似 java 的线程本地变量来隔离内存空间. 死锁分析 恩, 道理其实大家都懂的, 毕竟大学就学了操作系统,理论 ...
- Azure IoT 技术研究系列1-入门篇
物联网技术已经火了很多年了,业界各大厂商都有各自成熟的解决方案.我们公司主要搞新能源汽车充电,充电桩就是我们物联网技术的最大应用,车联网.物联网. 互联网三网合一.作为Azure重要的Partner和 ...
- C++实现的控制台-贪吃蛇
周六终于可以抽出一整段时间了 想了想就写个贪吃蛇吧 第一次写 差不多下了140行 也不算太多吧 以后ACM比赛是在做不来就自己打个贪吃蛇玩 ps:本来想写个项目的 但是为了方便你们阅读 就写在 ...
- Robot framework的介绍
Robot framework是基于Python语言编写的功能自动化测试框架.使用简单,不懂编码的测试人员也能像编程一样写测试用例,支持关键字驱动测试并且可以开发系统关键字.还有丰富的第三方库,比如S ...
- 【知识必备】浅淡MVP在Android项目中的实战演习,让代码结构更简单~
一.写在前面 讲道理,这次是真的笔者很久都没有更新blog了,主要最近维护的框架问题也是层出不穷,而且对技术交流群的解答也让我身心疲惫,所以在这里跟关注我的人说声抱歉,没有定期给你们带来福利,那么这里 ...
- ob缓存
ob的基本原则:如果ob缓存打开,则echo的数据首先放在ob缓存.如果是header信息,直接放在程序缓存.当页面执行到最后,会把ob缓存的数据放到程序缓存,然后依次返回给浏览器.下面我说说ob的基 ...
- Angular2.js——表单(下)
这部分是接表单上部分的内容,主要内容有: 1.添加自定义的CSS来提供视觉反馈: 2.显示和隐藏有效性验证的错误信息: 3.使用ngSubmit处理表单提交: 4.禁用表单提交按钮. 添加自定义的CS ...