预期框架整理目标:

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. firefox上安装selenium ide失败

    Selenium 初学者第一步: 最近在学习selenium,但是在安装的时候遇到了问题.我是直接在firefox安装的Selenium IDE ,虽然下载安装之后存在于扩展中,但是工具栏里并没有显示 ...

  2. 发散问题——Spring容器及加载

    一.前言 发散问题系列,是围绕日常工作,发散思考,提取问题,并寻求答案的一个系列.总的来说,就是将遇到的问题发散来提出更多的问题,并通过解决发散问题,从而对问题有更深入的了解,对知识有更深刻的记忆,帮 ...

  3. Css清除浮动最优方式之一

    ---恢复内容开始--- .container:before, .container:after { display: table; content: " "; } .contai ...

  4. 笔记整理:计算CPU使用率 ----linux 环境编程 从应用到内核

    linux 提供time命令统计进程在用户态和内核态消耗的CPU时间: [root@localhost ~]# time sleep real 0m2.001s user 0m0.001s sys 0 ...

  5. mvc中DotNetOpenAuth实现了第三方应用访问自己的网站

    以yahoo为例吧,即从yahoo取得用户信息,存到自己的站点,实现了用户信息在一次录入多处共享的功能.以下是在点击了使用yahoo登录本站的链接后执行action:OpenId. ProviderU ...

  6. Ajax (AppServ服务器练习)

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. & and &&区别

    &:位逻辑运算: &&:逻辑运算: &&在java中又称为短路,第一个条件是false的话后面就不执行: &是所有条件都执行: System.out.p ...

  8. 新型钓鱼手段预警:你看到的 аррӏе.com 真是苹果官网?

    研究人员发现一种"几乎无法检测"的新型钓鱼攻击,就连最细心的网民也难以辨别.黑客可通过利用已知漏洞在 Chrome.Firefox 与 Opera 浏览器中伪造显示合法网站域名(例 ...

  9. DirectFB 之 通过多Window实现多元素处理

    图像 设计 采用多window的方式实现显示,因为每个window可以独立的属性,比如刷新频率,也是我们最关注的 示例 /*************************************** ...

  10. hdu1698线段树区间更新

    题目链接:https://vjudge.net/contest/66989#problem/E 坑爹的线段树照着上一个线段树更新写的,结果发现有一个地方就是不对,找了半天,发现是延迟更新标记加错了!! ...